4

我创建了一个包含用户名和密码的登录自动化脚本。

我有一个 Excel 表,如果用户名和密码正确,结果将更新为通过。

但是如果用户名和密码不正确,就会出现一个 JavaScript 弹出框。

我无法处理那个确定按钮。

我已经尝试过这段代码。但我得到了例外

org.openqa.selenium.WebDriverException: findElement execution failed;
 An open modal dialog blocked the operation 
(WARNING: The server did not provide any stacktrace information).

如何处理打开的模态对话框?

Alert alert = driver.switchTo().alert();
System.out.println(alert.getText());
alert.accept();

这是我的代码

public class Read {

    public WebDriver driver;

    @BeforeMethod
    public void launch() throws Exception {
        System.setProperty("webdriver.chrome.driver",
                "C:\\Chrome\\chromedriver_win_26.0.1383.0\\chromedriver.exe");
        driver = new ChromeDriver();
    }

    @Test
    public void testImportexport1() throws BiffException, IOException,
            RowsExceededException, WriteException, InterruptedException {

        FileInputStream fis = new FileInputStream("Data//Logindev.xls");
        Workbook w = Workbook.getWorkbook(fis);
        Sheet s = w.getSheet(0);
        String a[][] = new String[s.getRows()][s.getColumns()];

        FileOutputStream fos = new FileOutputStream("Data//Logindev_1.xls");
        WritableWorkbook wwb = Workbook.createWorkbook(fos);
        WritableSheet ws = wwb.createSheet("LoginResult", 0);

        System.out.println("s.getRows() = " + s.getRows());

        for (int i = 0; i < s.getRows(); i++) {
            System.out.println("s.getColumns() = " + s.getColumns());

            for (int j = 0; j < s.getColumns(); j++) {
                a[i][j] = s.getCell(j, i).getContents();
                Label l = new Label(j, i, a[i][j]);
                Label l1 = new Label(2, 0, "Result");

                ws.addCell(l);
                ws.addCell(l1);

                System.out.println("Labels Added!!!!!!!!!");
            }
        }
        for (int i = 1; i < s.getRows(); i++) {
            driver.get("any url");

            driver.findElement(By.name("txtUserName")).sendKeys(
                    s.getCell(0, i).getContents());
            driver.findElement(By.name("txtPwd")).sendKeys(
                    s.getCell(1, i).getContents());
            driver.findElement(By.name("btnSignIn")).click();

            Thread.sleep(15000);

            if (driver.findElement(By.linkText("xyz")).isDisplayed()) {
                System.out.println("Element is found");
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                driver.findElement(
                        By.xpath("//*[@id='ctl00_headerContent_lnkLogOut']"))
                        .click();
                Thread.sleep(2000);
                Label l2 = new Label(2, i, "Pass");
                ws.addCell(l2);
            } else {

                try {
                    System.out.println("Element Not Found");
                    Label l2 = new Label(2, i, "Fail");
                    ws.addCell(l2);
                    Alert alert = driver.switchTo().alert();
                    System.out.println(alert.getText());
                    alert.accept();
                } catch (NoAlertPresentException e) {
                    e.printStackTrace();
                }

            }
        }
        Thread.sleep(2000);
        wwb.write();
        wwb.close();
    }

}
4

3 回答 3

1

我认为您处理模式对话框的代码片段是正确的。我什至以 c# 格式尝试了它的工作网站。

IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://www.tizag.com/javascriptT/javascriptalert.php");
driver.FindElement(By.XPath("//div/form/input[@value='Confirmation Alert']")).Click();
IAlert alert = driver.SwitchTo().Alert();
Console.WriteLine(alert.Text);
alert.Accept();

在您的情况下,我认为错误的是,您的警报处理代码可能不是紧跟在触发模式对话框的代码行之后。从您给出的错误消息中可以看出,您在显示模态对话框之后和处理它之前正在对网页进行一些操作。

org.openqa.selenium.WebDriverException: findElement execution failed;
An open modal dialog blocked the operation 

我还想提到另一种以 C# 方式抑制模式对话框的方法。使用名称空间System.Windows.Forms的SendKeys类并直接发送键盘条目,例如,

IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl("http://www.tizag.com/javascriptT/javascriptalert.php");
driver.FindElement(By.XPath("//div/form/input[@value='Confirmation Alert']")).Click();
SendKeys.SendWait("{Enter}");

更新


driver.findElement(By.name("txtUserName")).sendKeys(s.getCell(0, i).getContents());
driver.findElement(By.name("txtPwd")).sendKeys(s.getCell(1, i).getContents());
driver.findElement(By.name("btnSignIn")).click();
try{
    Alert alert = driver.switchTo().alert();
    System.out.println(alert.getText());
    alert.accept();
   }
catch (NoAlertPresentException e) {

      if (driver.findElement(By.linkText("xyz")).isDisplayed()) 
        {
         System.out.println("Element is found");
         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
         driver.findElement(
         By.xpath("//*[@id='ctl00_headerContent_lnkLogOut']")).click();
         Thread.sleep(2000);
         Label l2 = new Label(2, i, "Pass");
         ws.addCell(l2);
        } 
     else 
        {
         System.out.println("Element Not Found");
         Label l2 = new Label(2, i, "Fail");
         ws.addCell(l2);
         } 
      }
于 2013-03-25T07:43:10.963 回答
0

您需要在按下登录按钮后检查是否存在警报

driver.findElement(By.id("logIn")).click();

isAlertPresent();


public void isAlertPresent();  
{
    try
    {
        Alert alert = driver.switchTo ().alert ();
        //alert is present
        System.out.println(alert.getText());
        alert.accept(); 
    }
    catch ( NoAlertPresentExceptionn n)
    {
        //Alert isn't present
        return; 
    }
}
于 2013-03-25T07:59:41.283 回答
0

我无法给出确切的解决方案,但以下方法可能会对您有所帮助。

//检查警报是否存在的方法。

public boolean isAlertPresent() 
{ 
    try 
    { 
        driver.switchTo().alert(); 
        return true; 
    }   // try 
    catch (NoAlertPresentException Ex) 
    { 
        return false; 
    }   // catch 
} 

//输入用户名和密码

         //click on Login Button
         if( logout button is displayed )
         {
             //click logout
         }
         else if(isAlertPresent())//we are calling the above mentioned isAlertpresent method where, if it returns true, the below code gets executed.
         {
           alert.accept(); 
           Label l2 = new Label(2, i, "Fail");
           ws.addCell(l2);

         }
    }

希望它提供一些想法。如果您仍然面临这个问题,请告诉我们。

于 2013-03-25T11:17:36.010 回答