如何在selenium中处理javascript弹出框

时间:2013-03-25 06:18:33

标签: java selenium webdriver testng

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

我有一张excel表,如果用户名和密码正确,结果会更新为pass。

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

我无法处理那个ok按钮。

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

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();
    }

}

3 个答案:

答案 0 :(得分: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#方式抑制模态对话框的另一种方法。 使用 SendKeys 类名称空间 System.Windows.Forms 并直接发送键盘条目,

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);
         } 
      }

答案 1 :(得分: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; 
    }
}

答案 2 :(得分: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);

         }
    }

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