在Selenium 2.0中等待模态框消失

3

当我使用Firefox的webdriver运行测试时,当我点击接受警报后,会出现模态异常:

[Exception]: Modal dialog present

然而,使用IE webdriver时测试工作良好。问题似乎是测试方案在警报完全关闭之前就继续进行了。换句话说,它尝试执行以下操作:

List<WebElement> l = driver.findElements(By.linkText("link"));

我会得到模态异常的结果。

现在,如wait.until(ExpectedConditions.visibilityOf Element1 OR Element2)所述,wait.until(ExpectedConditions)是一个不错的选择。但是我无法创建一个条件,在警报消失时返回true。我该怎么做呢?

编辑:为了进一步澄清,问题不是等待警报出现(我的隐式等待对此目的很好地工作)。我确实收到了警报并在其上应用了测试,但是在我点击接受警报后,测试快速进行,并尝试继续下一步,而警报仍然存在并引发模态存在异常。我也尝试过以下方法来防止这种情况,但没有成功。

driver.switchTo().defaultContent();

我在使用FF时遇到了相同的问题。当尝试执行下一步时,模态对话框仍然存在。 - Bleeped
我遇到了同样的问题,我使用了 WebDriverWait().until(ExpectedConditions.InvisibilityOf(Element)),但这会导致比我想要处理的等待时间更长。 - Riana
2个回答

0

现在没有默认机制来等待警报出现/消失,但是我们可以编写自己的逻辑,而不是等待静态时间(Thread.sleep(10000)),例如下面的代码:

waitForAlert(WebDriver driver)
{
   int i=0;
   while(i++<5)
   {
        try
        {
            Alert alert = driver.switchTo().alert();
            alert.accept();
            break;
        }
        catch(NoAlertPresentException e)
        {
          Thread.sleep(1000);
          continue;
        }
   }
}

Thread.sleep是因为他说警告框在点击某个东西后没有正确地出现或消失。所以,在进行下一步之前,他需要处理那个警告框。如果警告框出现有一些延迟,我们需要等待,对吧?这就是我提到Thread.sleep的原因。希望你明白我想表达的意思。 - Santoshsarma
移除 Thread.sleep 并增加计数器 i 将是更好的选择。 - Ajinkya
是的,我同意你,Karna。 - Santoshsarma
我进一步澄清了问题,因为问题不是等待警报出现。这是通过我的隐式等待完成的,没有问题。问题是当警报出现时,我无法阻止测试继续进行。 - Learner4
如果您不处理警报,则测试将失败。如果等待警报并接受它,或者如果它不出现则继续,则测试将正常进行。 - Ajinkya

0

我也在FF中遇到了这个问题,但我通过使用AUI解决了它。尝试使用下面的代码来获取你的警告 > 接受它,然后继续进行你的代码/测试。

Actions action = new Actions (driver);
action.click(driver.findElement(By.id("locator"))).build().perform();
driver.switchTo().alert().accept();
// Continue with your test
List<WebElement> l = driver.findElements(By.linkText("link"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接