无法在Selenium WebDriver中处理Ajax弹出窗口

时间:2014-11-10 16:29:29

标签: java ajax selenium-webdriver

我是Selenium的新人。我正在尝试使用MacDonald登录和Order.But的selenium制作脚本。登录后我无法点击继续,任何其他选项请帮助我。

我的代码是: -

WebDriver selenium= new FirefoxDriver();
selenium.manage().window().maximize();

String baseurl = "http://www.mcdelivery.co.in/";
selenium.get(baseurl);

Thread.sleep(2000); 
Thread.sleep(5000);

WebElement loginbtn = selenium.findElement(By.id("lnkBtnLogin"));
if(loginbtn.isDisplayed()) {
    loginbtn.click();
}

WebElement username = selenium.findElement(By.id("txtMobileNumber"));
if(username.isDisplayed()) {
    username.clear();
    username.sendKeys("******");
}

WebElement pwd = selenium.findElement(By.id("txtMsgPwd"));
if(pwd.isDisplayed()) {
    pwd.sendKeys("******");
}

WebElement submit = selenium.findElement(By.id("btnSubmit"));
if(submit.isDisplayed()) {
    submit.click(); 
    //Alert aler = selenium.switchTo().alert().accept();
    selenium.switchTo().activeElement();         
}

WebElement conti = selenium.findElement(By.id("btnContinue"));
if(conti.isDisplayed()) {
    conti.click();
}

// selenium.close();

运行此后我遇到错误

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: 
{"method":"id","selector":"btnContinue"}
Command duration or timeout: 31 milliseconds

2 个答案:

答案 0 :(得分:2)

由于继续按钮是弹出窗口的一部分(需要一段时间才能加载),因此您需要花一些时间让webdriver检测它。为此,请使用Implicit/Explicit waits暂停。

对于上述内容,您可以像这样在顶部使用隐式超时;

selenium.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

每次尝试查找元素时,上面给webdriver一个 15秒的时间。

此外,在此代码中,

if(conti.isDisplayed())

{ 

conti.click();

}

出于某些奇怪的原因,在 if(conti.isDisplayed())内部时,继续按钮未被点击。所以,失去那个循环。只需使用 conti.click(); 即可。它试用了!

答案 1 :(得分:1)

在切换到像

这样的弹出窗口后,你可以使用某种明确的等待
         boolean ajaxPopup = new WebDriverWait(driver,10).until(ExpectedConditions
                 .visibilityOfElementLocated(By.id("btnContinue"))) != null;

         Assert.assertTrue(ajaxPopup);