我正在使用Selenium来测试在firefox浏览器上运行的应用程序,有时当我想点击带有Selenium的按钮时,它只是找不到它。 我发现这很奇怪,因为我可以用眼睛看到元素。我已经尝试过多种方法,可以用于其他例子:
然后,我在这里发布,因为我不明白为什么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.
但它不可能,因为我可以看到它并手动点击它。
答案 0 :(得分:0)
我想我找到了对我的问题的解释,我读了关于the StaleReferenceException的文件。更准确地说,在这一部分:
元素未附加到DOM
用于在Web应用程序中模拟选项卡式UI的常用技术是为每个选项卡准备DIV,但一次只能附加一个,将其余部分存储在变量中。在这种情况下,您的代码完全有可能引用一个不再附加到DOM的元素(也就是说,它的祖先是“document.documentElement”)。 如果WebDriver在这种情况下抛出过时的元素异常,即使元素仍然存在,引用也会丢失。你应该丢弃你持有的当前引用并替换它,可能是在元素连接到DOM后再次找到它。
我认为我的情况与此相同,因为这正是我在webElement的引用上使用方法(getText(),getTag())时我有这个异常,即使这个元素仍然是图形可见的。据我所知,我尝试访问一个不再附加到DOM的引用,因为DOM已经改变了。