用硒检测阻塞覆盖

Posted

技术标签:

【中文标题】用硒检测阻塞覆盖【英文标题】:Detect blocking overlay with selenium 【发布时间】:2014-07-16 09:13:48 【问题描述】:

我正在测试一个在浏览器中打开弹出窗口以显示对象详细信息的网站。这些弹出窗口有时是模态的,我的意思是它们使屏幕的其余部分不起作用并触发灰色透明覆盖,覆盖除弹出窗口之外的所有内容。这个覆盖是预期的行为,这意味着我需要一种方法来检测它是否被正确触发。

但是,我对此类叠加层的实现不够熟悉,无法确定我应该在 DOM 中的哪个位置查找管理此类行为的属性。因此,我希望有更多关于通常如何配置此类覆盖的信息的人可以为我指明正确的方向。

显而易见的解决方案是简单地尝试单击一个按钮并查看会发生什么,但我希望编写一个可以在整个测试套件中实现的方法,而不是必须针对每种情况编写不同的检查。

对于那些感兴趣的人,我正在使用 Selenium 编写 Java 脚本。

【问题讨论】:

如果按 Escape 关闭弹出窗口会怎样? 我可以摆脱弹出窗口,这不是问题。覆盖是期望的行为,我想测试它是否应该出现。 你对每个出现的弹出窗口都有一个共同的类名吗?您提供给我们的信息很少,我们无法为您提供太多帮助... 【参考方案1】:

我知道这是旧的,但它仍然可以帮助其他人。我最近刚刚为我们的 React 站点解决了一个类似的问题。我相信我们正在使用 react-block-ui 模块来实现我们的阻塞覆盖。

基本上,由于 2 个已知事实,我能够检测到某个元素被叠加层挡住了:

    元素位于遵循特定命名约定的包含 div(“覆盖层”)内。在我们的例子中,它是section-overlay-X。 如果该叠加层处于阻塞状态,则该叠加层将具有类属性(名为 av-block-ui)。

(希望您也可以访问这些信息……或类似的有用信息。)

有了这些信息,我编写了几个实用方法来帮助我确定特定的WebElement 是否被覆盖层阻止。如果被阻止,请发送ElementNotInteractableException

对于 Java:

...
By SECTION_OVERLAY_ANCESTOR_LOCATOR = By.xpath("./ancestor::div[contains(@id, 'section-overlay-')][1]");
...

    private WebElement findUnblockedElement(By by) 
    WebElement element = driver.findElement(by);
    if (isBlockedByOverlay(element)) 
        throw new ElementNotInteractableException(String.format("Element [%s] is blocked by overlay", element.getAttribute("id")));
     else 
        return element;
    
    

    private boolean isBlockedByOverlay(WebElement element) 
    List<WebElement> ancestors = element.findElements(SECTION_OVERLAY_ANCESTOR_LOCATOR);
    WebElement overlayAncestor = ancestors.get(0);
    String overlayClass = overlayAncestor.getAttribute("class");
    return !StringUtils.isBlank(overlayClass);
    

这是我的 sn-p: https://bitbucket.org/snippets/v_dev/BAd9dq/findunblockedelement

【讨论】:

【参考方案2】:

这并不是在所有情况下都有效,但我通过检查 body 元素的溢出值解决了这个问题。我试图在页面处于活动状态时克服页面的禁用滚动。

【讨论】:

以上是关于用硒检测阻塞覆盖的主要内容,如果未能解决你的问题,请参考以下文章

从操作系统内核看Java非阻塞IO事件检测

检测解决SQLServer延迟阻塞I/O问题

如何在 Tornado 应用程序中检测长阻塞函数

检测非阻塞套接字上的关闭连接

阻塞套接字 - 检测状态

阻塞主线程的状态项(NSMenu 阻止 NSSpeechRecognizer 检测声音)