如果我理解正确的话,您是在询问WebElement示例上的某种“refresh”或“update”方法。 不幸的是,selenium中没有定义这样的东西,根据相关问题WebElement refresh() or getBy() needed: WebElement对象是一个代理,是DOM元素的代表,当DOM元素被浏览器破坏时,WebElement被标记为“stale”,不能再使用。 如果你在另一个页面上有一个 similar DOM元素,你可以用findElement获取它,Selenium会为这个 new DOM元素创建一个 new WebElement对象(一个代理)。你的旧WebElement对象将保持陈旧,因为底层DOM对象被破坏,并且永远无法恢复。 我建议存储特定于元素的定位器,但是一旦页面刷新,您仍然需要通过定位器“重新查找”元素。
3条答案
按热度按时间kt06eoxx1#
如果我理解正确的话,您是在询问
WebElement
示例上的某种“refresh”或“update”方法。不幸的是,
selenium
中没有定义这样的东西,根据相关问题WebElement refresh() or getBy() needed:WebElement对象是一个代理,是DOM元素的代表,当DOM元素被浏览器破坏时,WebElement被标记为“stale”,不能再使用。
如果你在另一个页面上有一个 similar DOM元素,你可以用findElement获取它,Selenium会为这个 new DOM元素创建一个 new WebElement对象(一个代理)。你的旧WebElement对象将保持陈旧,因为底层DOM对象被破坏,并且永远无法恢复。
我建议存储特定于元素的定位器,但是一旦页面刷新,您仍然需要通过定位器“重新查找”元素。
plicqrtu2#
唯一可用的方法是在编写Selenium代码时跟踪应用程序状态。
您是否执行了刷新DOM的操作?然后,您需要执行另一个
findElement
调用,以获得您接下来要交互的元素的新示例。否则,在Utility类中编写您自己的方法
findElementByXpath
,该方法尝试查找元素,捕获StaleElement异常并重试。jslywgbw3#
我将描述我的情况,这是类似的:我尝试通过执行以下操作来查找具有某个值的表格单元格:
1.获取所有表行
1.对于每一行-获取列的集合
1.对于每列-求出值
有一天,我遇到了一个表中结果太多的情况。于是,我编写了一个循环,点击"获取下一页"链接/图标。简单吗?不!当程序点击"表的下一页"链接时,指向表的WebElement不可用,我收到了与本问题作者相同的错误:失效元素引用异常
我所做的是:
首先获取表的XPATH,然后我更改了循环,这样如果扫描了所有行,但没有找到值,并且启用了下一个图标:
1.单击表格的下一页。
1.更新WebElement以重新指向表。
我希望我说清楚了。