【问题标题】:How to Wait in Selenium WebDriver when WebDriverWait or Implicit Wait Won't Do当 WebDriverWait 或隐式等待不起作用时如何在 Selenium WebDriver 中等待
【发布时间】:2018-05-24 02:59:26
【问题描述】:

我正在使用 Selenium,但遇到以下问题:

基本上,点击页面上的按钮后,页面上会出现一个弹出窗口。我想关闭弹出窗口。为此,我单击右上角的 x 图标。我能够正确识别元​​素并使用 XPath 单击它(我知道 XPath 是正确的,因为它在 Firebug 中工作,并且 Selenium 在使用 XPath 时不会抛出任何异常,因此元素必须存在。此外,isDisplayed()和isEnabled() 返回真)。有趣的是,弹出窗口在执行此操作后并没有消失。但是,如果我添加 3 秒延迟(在关闭弹出窗口之前),弹出窗口就会消失。我的问题是我不想超过必要地延迟程序的执行,所以我宁愿使用 3-5 秒的最大延迟,但如果弹出窗口准备好与之交互(即被解雇)我想解雇尽快。

我想使用类似的东西:

    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 

但这不起作用,因为驱动程序会立即检测到 Web 元素存在(并且可见和显示),但除非我等待 3 秒,否则单击将不起作用。

同样,我不能使用:

    WebDriverWait wait = new WebDriverWait(driver, 30, 5000);

    wait.until(ExpectedConditions.elementToBeClickable(element));

出于同样的原因(仅当所述元素在 3 秒之前不可点击/可见但就WebDriver 而言 - 它立即可见时才有效)

有人可以帮我理解为什么尽管存在事实元素,但点击没有成功,我怎样才能做到这一点,以便 Selenium 在点击成功后立即点击,而无需等待整整 3-5 秒。

HTML:

  <div class="a-popover-wrapper">
    <div class="a-popover-header">
    <button class=" a-button-close a-declarative" aria-label="Close" data-action="a-popover-close">
    <i class="a-icon a-icon-close"/>
    </button>
    <h4 id="a-popover-header-7" class="a-popover-header-content">Buy professional installation</h4>
    </div>
    <div id="a-popover-content-7" class="a-popover-inner pdp-service-modal-instance" style="height: auto; overflow-y: auto;">
    </div>
    <span class="a-popover-end a-popover-a11y-offscreen" tabindex="0"/>
  </div>

谢谢!

【问题讨论】:

  • 出于好奇,您说该元素存在,但它被禁用了吗?如果在弹出窗口实际显示之前它被禁用,那么它将不可点击。 3 秒的延迟可能恰好足以启用它。
  • 已启用(isEnabled() 返回 true ) - 我已使用此信息更新了问题。谢谢。
  • 有点骇人听闻,但您是否尝试过点击两次?我见过一键无法完全切芥末的情况。
  • @SimonN 我没有尝试过,但我的直觉是,如果它有效,它只是有效,因为额外的点击会在第一次和第二次点击之间增加一个微小的延迟,所以我可以以相同的价格添加直接等效延迟。但这正是我试图避免做的事情。我想要的东西会等待尽可能多的时间,而不是更多。
  • @S.O.S 第二个 sn-p 中的显式等待将等待 30 秒的最长时间,poll_frequency(呼叫之间的睡眠间隔)为 5000 毫秒(5 秒)。 poll_frequency arg 的默认值为 0.5s。也许将poll_frequency 保留其默认值会帮助您减少脚本中不必要的延迟。让我知道这是否有帮助

标签: java selenium selenium-webdriver


【解决方案1】:

您是否尝试过使用 FluentWait? 试试下面的代码,

Wait<WebDriver> wait = new FluentWait<WebDriver>(pDriver).withTimeout(100, TimeUnit.SECONDS).pollingEvery(600,TimeUnit.MILLISECONDS).ignoring(NoSuchElementException.class);
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("selector"));

你可以使用上面的情况或下面的情况,

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("selector")));

如需进一步了解FluentWait,请参考此链接https://sqa.stackexchange.com/questions/12866/how-fluentwait-is-different-from-webdriverwait

【讨论】:

  • 我现在尝试了这个建议 - 但它不起作用(可能出于同样的原因 WebDriverWait 和隐式等待不起作用 - 正如问题 WebDriver 立即检测元素的存在中所述)谢谢!
【解决方案2】:

要关闭弹出窗口,而不是使用手动关闭图标。您可以直接由驱动程序处理,无需等待显式等待。

driver.switchTo().alert().accept();

【讨论】:

  • 这不起作用,因为它不是真正的警报,请参阅更新问题中的 HTML。
猜你喜欢
  • 2023-03-05
  • 2012-05-11
  • 2018-03-27
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
相关资源
最近更新 更多