【问题标题】:How do I stop email newsletter popup from intercepting clicks?如何阻止电子邮件通讯弹出窗口拦截点击?
【发布时间】: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


【解决方案1】:

感谢大家的回答和cmets。

Christine 的评论帮助我解决了我的问题。

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

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

【讨论】:

    【解决方案2】:

    对于在执行期间意外出现的弹出窗口,事件处理程序是可行的方法。这个想法是用EventFiringWebDriver 包装您的常规驱动程序,然后您可以在某些事件上注册处理程序;其中有很多可供选择。创建EventFiringWebDriver 相当简单:

    EventFiringWebDriver eventDriver = new EventFiringWebDriver(driver);
    EventHandler handler = new EventCaptures();
    eventDriver.register(handler);
    // Do stuff here
    eventDriver.unregister(handler);
    

    handler 是您将在一个单独的类中实现的方法,它派生自 WebDriverEventListener,它覆盖了该类的一个基方法。有很多可供选择,但对于这种情况来说,一个不错的选择可能是beforeClickOn。下面是一个示例:

    public class EventCaptures implements WebDriverEventListener{
      @Override
      public void beforeClickOn(WebElement arg0, WebDriver arg1) {
        By bounceExchangeClose = By.className("bx-close");
        if (arg1.findElements(bounceExchangeClose).size() > 0) {
          arg1.findElement(bounceExchangeClose).click();
        }       
      }
      // Other listener overrides here...
    }
    

    所以基本上每当你点击某个东西时,该处理程序都会运行并检查以确保弹出窗口不存在(如果是,则关闭它)。其他人提到了等待和检查,但是如果弹出窗口不可预测,这会变得非常混乱,因为您必须在代码中的所有位置调用该检查,而使用此方法时它会自动发生。使用完毕后,只需取消注册处理程序即可。

    欲了解更多信息,这是一个很好的资源:@​​987654321@

    【讨论】:

    • 我不知道这存在!以后肯定会用到这个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2020-05-04
    相关资源
    最近更新 更多