如何阻止电子邮件通讯弹出窗口拦截点击?

And*_*ett 5 java selenium selenium-webdriver

问题

我正在使用 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 单击

我一直在单击带有 的 WebElements driver.findElement(By...).click(),我读过这是在测试 UI 时单击事物的最佳方式。我试过像这样执行 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();
    }
Run Code Online (Sandbox Code Playgroud)

通过查看 HTML,我知道弹出窗口上的关闭按钮有一个类“bx-close”。此方法有时会成功关闭弹出窗口,但随后从未单击过正在测试的链接,并且测试失败。

按Escape

我了解到,当弹出窗口出现在屏幕上时按下退出键会使它消失。我已经尝试了两种方法来做到这一点 1. 使用Actions

Actions actions = new Actions(driver);
actions.keyDown(Keys.ESCAPE).build().perform();
actions.keyUp(Keys.ESCAPE).build().perform();
Run Code Online (Sandbox Code Playgroud)

但是这种方式给了我一个非法参数错误,因为转义键不是修饰键。

我已经尝试过 WebDriver 的sendKeys

driver.findElement(By.tagName("html")).sendKeys(Keys.Escape);
Run Code Online (Sandbox Code Playgroud)

这种方法对我也不起作用。

弹出窗口的 HTML

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();
    }
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,关闭这个不可预测的弹出窗口以便我可以停止获取 ElementClickInterceptedExceptions 的可靠方法是什么?

And*_*ett 0

谢谢大家的回答和评论。

克里斯汀的评论帮助我解决了我的问题。

您找到并希望单击的按钮可能不是您认为的元素。尝试运行 driver.findElements(...) 并打印结果列表的长度。如果它大于 1,那么这可能是你的问题。

我发现我找到了 2 个具有“bx-close”类的元素。我改变了定位关闭按钮的方式,使其特定于需要按下的实际按钮,看来我的问题已经解决。