【问题标题】:Wait for a modal to disappear in Selenium 2.0等待模态在 Selenium 2.0 中消失
【发布时间】:2014-07-19 10:56:39
【问题描述】:

当我使用 Firefox 的网络驱动程序运行测试时,我会在收到警报后收到模态异常:

[Exception]: Modal dialog present

但是,当使用 IE webdriver 时,测试工作正常。问题似乎是在警报完全关闭之前测试场景继续进行。换句话说,它试图做以下事情:

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

结果我会得到模态异常。

现在wait.until(ExpectedConditions) 如提到的wait.until(ExpectedConditions.visibilityOf Element1 OR Element2) 是不错的候选人。但是,当警报消失时,我无法创建返回 true 的条件。我该怎么做?

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

driver.switchTo().defaultContent();

【问题讨论】:

  • 我对 FF 也有同样的问题。尝试执行下一步时,模式对话框仍然存在。
  • 我遇到了同样的问题,我使用了 WebDriverWait().until(ExpectedConditions.InvisibilityOf(Element)) 但这导致等待时间比我想要处理的要长。

标签: java selenium junit modal-dialog


【解决方案1】:

现在有等待警报出现/消失的默认机制,但是,我们可以编写自己的逻辑如下所示,而不是等待静态时间量 (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。我希望你能理解我想表达的意思。
  • 删除Thread.sleep并增加计数器i将是一个更好的选择。
  • 是的。我同意你的看法,卡纳。
  • 我进一步澄清了这个问题,因为问题不是等待警报出现。这是通过我的隐式等待完成的,这没有问题。问题是我无法在警报出现时阻止测试继续进行。
  • 如果您不处理警报,测试将失败。如果您等待警报并在出现时接受,如果不出现则继续,那么测试就可以了。
【解决方案2】:

即使我在 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"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多