【发布时间】: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_frequencyarg 的默认值为 0.5s。也许将poll_frequency保留其默认值会帮助您减少脚本中不必要的延迟。让我知道这是否有帮助
标签: java selenium selenium-webdriver