【发布时间】:2020-03-29 17:40:19
【问题描述】:
问题
我正在使用 Java 和 Selenium 为我公司的网站编写自动化测试。现在我正在编写涉及点击链接的测试,并验证链接是否指向正确的位置。我们有一个时事通讯弹出窗口(来自 BounceExchange),它在非常不可预测的时间出现,它会导致 ElementClickInterceptedExceptions。这是异常消息:
org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <li id="menu-item-78096" ... is not clickable at point (x, x). Other element would receive click <div class="bx-slab">...</div>
我的尝试
用 JavaScript 点击
我一直在使用driver.findElement(By...).click() 单击 WebElements,我读到这是在测试 UI 时单击事物的最佳方式。我尝试过像 this 这样的 JavaScript 点击
但这没有用,页面只是挂在屏幕上的弹出窗口。
关闭弹出窗口
这是我最成功的领域,但它仍然没有完全发挥作用。这是我的点击方法:
public void click(By elementBy) {
By bounceExchange = By.className("bx-slab");
By bounceExchangeClose = By.className("bx-close");
//close bouncex if its open
if(elementExists(bounceExchange)) {
WebElement bounceX = driver.findElement(bounceExchange);
if(bounceX.isDisplayed()) {
System.out.println("Closing bounce exchange");
try {
driver.findElement(bounceExchangeClose).click();
}
catch(Exception e) {
//ignore
}
}
}
driver.findElement(elementBy).click();
}
通过查看 HTML,我知道弹出窗口上的关闭按钮有一个类“bx-close”。 此方法有时会成功关闭弹出窗口,但从未点击过正在测试的链接,因此测试失败。
按退出键
我了解到,当弹出窗口在屏幕上时按退出键会使其消失。
我尝试了两种方法来做到这一点
1.使用Actions
Actions actions = new Actions(driver);
actions.keyDown(Keys.ESCAPE).build().perform();
actions.keyUp(Keys.ESCAPE).build().perform();
但是这种方式给了我一个非法参数错误,因为转义键不是修饰键。
我已经尝试过WebDriver的sendKeys:
driver.findElement(By.tagName("html")).sendKeys(Keys.Escape);
这种方法也不适合我。
弹窗的HTML
<div class="bx-slab">
<div class="bx-align">
<div class="bx-creative bx-creative-874700" id="bx-creative-874700">
<div class="bx-wrap">
<a id="bx-close-inside-874700" class="bx-close bx-close-link bx-close-inside" href="javascript:void(0)" data-click="close">
<svg class="bx-close-xsvg" viewBox="240 240 20 20">..</svg>
</a>
...
</div>
所以我的问题是,什么是关闭这个不可预测的弹出窗口的可靠方法,这样我就可以停止获取 ElementClickInterceptedExceptions?
【问题讨论】:
-
可以分享html代码吗?
-
您可能希望使用具有预期条件的 WebDriverWait 以显示关闭按钮。它将每 1/2 秒轮询一次,直到找到或达到超时期限。您也可以从 catch 块中调用您的方法。 (点击拦截异常)
-
您找到并希望点击的按钮可能不是您认为的元素。尝试运行
driver.findElements(...)并打印结果列表的长度。如果大于 1,那么这可能是您的问题。
标签: java selenium selenium-webdriver