【问题标题】:Selenium: NoSuchElementException Thrown on the Line Where I WaitSelenium:NoSuchElementException 在我等待的地方抛出
【发布时间】:2017-11-21 16:10:02
【问题描述】:

这是一个奇怪的常见问题。

我正在使用无头 firefox 浏览器运行 Selenium 项目。

我得到了常见的 NoSuchElementExceptions。这不是什么新鲜事。但是,尝试通过显式等待来解决它们并不能解决问题。

例如,以下行将引发 NoSuchElementException:

WebElement trackingInbox = methodDriver.findElement(By.id("inbox-widget-container-id"));

然后我在这一行上方添加以下内容:

FluentWait wait = new FluentWait(methodDriver);
wait.withTimeout(90, TimeUnit.SECONDS);
wait.pollingEvery(250, TimeUnit.MILLISECONDS);
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("inbox-widget-container-id")));

WebElement trackingInbox = methodDriver.findElement(By.id("inbox-widget-container-id"));

首先,我在“methodDriver.findElement .. . .”处遇到异常

在第二种情况下,我在“wait.until ...”得到它

当我等待“presenceOf ...”时会发生这种情况当我等待“visibilityOf ...”它的出现方式,元素必须在 我等待它之前可用,这似乎违背了目的。

它目前的显示方式,我别无选择,只能添加隐式等待,但我知道必须有 some 方法来进行显式等待,这样元素就不必可用 之前我等着。

我想知道是否有任何关于我做错了什么的想法,以及是否有任何原则可以用来确定特定等待是否有用。

【问题讨论】:

  • 非headless运行时是否有效?
  • 没有。至少不是我上面列出的特定行(我在多个地方都遇到了这个问题)。当我运行“wait.until ...”时,使用 headed firefox 运行仍然会引发 NoSuchElementException
  • 而且使用显式等待 (WebDriverWait) 也不起作用?
  • 啊,这似乎确实有效。我既头大又漫不经心地尝试了它。但是,如果 FluentWait 不起作用,那将如何工作?这些等待是什么导致人们需要元素先于等待?
  • toolsqa.com/selenium-webdriver/implicit -explicit-n-fluent-wait/ 有很好的解释。

标签: java firefox selenium-webdriver


【解决方案1】:

你实际上忘记在最后调用ignoring 函数,这个忽略就是你想要的。当您等待元素的可见性时,可能会发生该元素不存在但如果您使用忽略功能,它将忽略如果此类错误发生,直到它满足给定条件。

   Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
       .withTimeout(30, SECONDS)
       .pollingEvery(5, SECONDS)
       .ignoring(NoSuchElementException.class);

【讨论】:

  • 谢谢,RAJ。当我有机会并报告回来时,我会检查这个解决方案。正如 smit9234 建议的那样,从 FluentWait 切换到 WebDriverWait 最终完成了这项工作,但我很快就会完成记录。我猜 WebDriverWait 可能会隐式忽略 NoSuchElementException?
  • @somexp12 是的,它会隐式消除,主要原因ignoring存在就是因为这个原因,当你检查对象的可见性时,它会先调用find_element来获取元素,因为元素有在检查该元素的可见性之前存在,但如果元素不存在,则会导致错误,因此为避免这种情况,ignoring 函数在 Fluent 等待中使用。顺便说一句,如果我的代码有效,请不要忘记接受我的回答!
  • 啊,看起来这两个选项都有效。所以,有两种解决方案。 1. 请记住忽略您尝试解决的异常和 2. 使用 WebdriverWait。同样重要的是要认识到有人可能会等待元素的可见性,同时假定该元素的 存在,在这种情况下,该元素不存在 (NoSuchElementException) 将代表一个真正的异常。所以,如果不是这样,我必须指出。
  • 嗯,对不起。不知道“接受”答案是什么意思。可能解释为涉及投票。得到了补救,从一开始就应该这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
相关资源
最近更新 更多