首页 文章

为什么Selenium找不到图形可见的元素

提问于
浏览
0

我正在使用Selenium测试在firefox浏览器上运行的应用程序,有时当我想点击Selenium的按钮时,它只是找不到它 . 我发现这很奇怪,因为我可以用眼睛看到元素 . 我已经尝试了多种方法,适用于其他例子:

  • wait.until(ExpectedConditions.visibilityOfElementLocated(by))

  • wait.until(ExpectedConditions.presenceOfElementLocated(by)); (我在路径变量中使用xpath,我确信他是正确的)

  • 在驱动程序上设置implictlyWait

  • 放置Thread.sleep(1000)

然后,我在这里发布,因为我不明白为什么Selenium看不到浏览器上显示的元素 . 一个重要的信息可能会帮助你给我一个正确的答案是html DOM是由javascript事件触发的websocket动态生成的 .

编辑1:

<button type="button" class="btn btn-xs btn-block btn-stroke" id="252_button">
    Delete
</button>

我想要访问的元素 . 我使用xpath来做到这一点 .

它不在iframe元素中 .

要访问一个元素我做了这个应该找到并单击它的方法,给出参数中的xpath:

public void findAndClick(String xpath) {
        By by = By.xpath(xpath);
        //wait.until(ExpectedConditions.presenceOfElementLocated(by));
        wait.until(ExpectedConditions.visibilityOfElementLocated(by));

        driver.findElement(by).click();
    }

编辑2:

这里是特定的xPath:// div [2] / div / div / div /按钮我发现它使用的是Selenium插件 .

编辑3:

我得到的例外是

StaleReferenceElementException:在缓存中找不到元素 - 也许页面在查找后发生了变化 .

我去了解释这个例外的page,它说:

The element has been deleted entirely.
The element is no longer attached to the DOM.

但它不可能,因为我可以看到它并手动点击它 .

1 回答

  • 0

    我想我找到了我的问题的解释,我读了关于the StaleReferenceException的文件 . 更准确地说,在这部分:

    元素未附加到DOM用于在Web应用程序中模拟选项卡式UI的常用技术是为每个选项卡准备DIV,但一次只附加一个,将其余部分存储在变量中 . 在这种情况下,您的代码完全有可能引用一个不再附加到DOM的元素(也就是说,它的祖先是“document.documentElement”) . 如果WebDriver在这种情况下抛出过时的元素异常,即使元素仍然存在,引用也会丢失 . 您应该丢弃当前引用并替换它,可能是在元素连接到DOM后再次找到它 .

    我想我是在同一个案例中,因为这正是我在webElement的引用上使用一个方法(getText(),getTag())我有这个异常,即使这个元素仍然是图形可见的 . 据我了解,我尝试访问一个不再附加到DOM的引用,因为DOM已经更改 .

相关问题