有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Selenium并不总是能够识别从DOM中删除元素的时间

我在mac 10.12.3上使用chrome 56和chromedriver 2.27时遇到了问题,尽管我尝试了几个不同版本的驱动程序和几个不同版本的浏览器,但都遇到了同样的问题。在UI中,我可以非常清楚地看到一个阻塞层已经清除,但selenium仍然认为它没有清除。在等待阻塞层清除后(只看浏览器),如果我捕获驱动程序的结果。getPageSource(),我得到的是“旧”页面源,而不是新的页面源(删除了阻塞层)。当我以html文档的形式查看旧页面源代码时,我可以看到阻塞层。当我查看测试结束时拍摄的屏幕截图时,显然没有阻塞层,对DOM的手动检查显示元素已被删除。不知何故,selenium似乎正在缓存旧的页面源代码,并且无法识别某个元素何时已从DOM中删除。我似乎无法强迫它刷新缓存(?)不完全重新加载页面的html。我希望避免重新加载页面,因为这会使测试阻塞层是否被正确删除的测试无效

我试着通过blocking layer元素(使用类似element.isDisplayed()或element的良性工具)从中获取一些信息。getLocation()),它们的行为似乎仍然像元素仍然存在一样

如有任何关于如何处理此问题的建议,将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    我在展开/折叠TreeNode动画时也遇到了同样的问题,因此我实现了以下功能,这些功能将在节点展开/折叠后启动:

        private static final String X_EXPANDING_TREE_NODE =
    "//div[contains(@role, 'treeitem') and @aria-expanded='true']/div[contains(@style, 'overflow: hidden;') and contains(@style, 'height:') and contains(@style, 'position: relative;')]/div[contains(@style, 'top:') and contains(@style, 'position: relative;')]";
    private static final By BY_EXPANDING_TREE_NODE = By.xpath(X_EXPANDING_TREE_NODE);
    
    private static final String X_COLLAPSING_TREE_NODE =
    "//div[contains(@role, 'treeitem') and @aria-expanded='false']/following:div[contains(@style, 'overflow: hidden;') and contains(@style, 'height:') and contains(@style, 'position: relative;')]/div[contains(@style, 'top:') and contains(@style, 'position: relative;')]";
    private static final By BY_COLLAPSING_TREE_NODE = By.xpath(X_COLLAPSING_TREE_NODE);
    
    /**
     * When a report tree node is expanding or collapsing is loading, we can see stuff like
     * <div style="overflow: hidden; height: 1px; position: relative;">
     * <div style="top: -122px; position: relative;">
     * <p>
     * We wait for it do disappear
     * <p>
     * or we force it to animation finished like this for expanding:
     *
     * <div style="overflow: hidden;">
     * <div style="">
     *
     * or we force it to animation finished like this for collapsing:
     *
     * <div style="overflow: hidden; display : none;">
     * <div style="">
     */
    public void waitForTreeNodeExpandedAndCollapsed() {
        waitForTreeNodeExpanded();
        waitForTreeNodeCollapsed();
    }
    
    public void waitForTreeNodeExpanded(){
        waitForTreeNode(true);
    }
    public void waitForTreeNodeCollapsed(){
        waitForTreeNode(false);
    }
    
    private void waitForTreeNode(boolean expanding) {
        try {
            waiter.withTimeout(Duration.ofSeconds(2)).until(ExpectedConditions.invisibilityOfElementLocated(expanding?BY_EXPANDING_TREE_NODE:BY_COLLAPSING_TREE_NODE ));
        } catch (TimeoutException e) {
            boolean noJavascriptException = false;
            while (!noJavascriptException) { // While javascript throw error like InvalidStateError, we continue
                try {
                    LOGGER.info("Waiting for tree expand or collapse did not work as expected, forcing it");
                    js.executeScript("while(true){" //
                            + "var iterator = document.evaluate(\"" + (expanding?X_EXPANDING_TREE_NODE:X_COLLAPSING_TREE_NODE) + "\",document, null, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null );" //
                            + "var thisNode = iterator.iterateNext();" //
                            + "if(thisNode) {" //
                            + "thisNode.parentNode.style='overflow: hidden;" + (expanding?"":"display: none;")  + "';"//
                            + "thisNode.style='';"
                            + "thisNode = iterator.iterateNext();" //
                            + "}else {" //
                            + "break;" //
                            + "}" //
                            + "}");
                    noJavascriptException = true;
                } catch (Exception e2) {
                    LOGGER.info("Javascript pb", e2.getCause());
                }
            }
        }
    }
    
  2. # 2 楼答案

    如果您的目标是在不考虑阻塞层状态的情况下单击该项,则可以使用内联javascript单击元素。下面是示例代码

        try {
                e.click();
            } catch (org.openqa.selenium.WebDriverException E1) {
                ((JavascriptExecutor) driver).executeScript("arguments[0].click();", e.findElements(By.xpath(".//a")).get(0));
            }