Selenium Webdriver-刷新过时元素快捷方式



我正在为Rails应用程序编写Selenium测试,有时会遇到"Stale Element"异常。在对元素进行操作之前,对它执行另一次查找很容易,但为了保持我的代码干燥,我想知道Selenium::WebDriver::Element对象上有什么方法可以"刷新"过时的引用吗?

EDIT:为了澄清,我想问是否有一些简写方法可以在传递相同参数的情况下执行另一个find_by_xpath(或id等)调用。它的功能非常好,只是不像某种"刷新"方法那样简洁

如果我理解正确,您正在询问WebElement实例上的某种"刷新"或"更新"方法。

不幸的是,根据定义,selenium中没有这样的东西。根据相关问题,需要WebElement refresh()或getBy:

WebElement对象是一个代理,是DOM元素的代表。什么时候DOM元素被浏览器破坏,WebElement被标记为"过时"不能再使用了。

如果您在另一个页面上有一个类似的DOM元素,您可以获得它使用findElement,Selenium将创建一个新的WebElement对象(代理)。您的旧WebElement对象将保持陈旧,因为底层DOM对象已销毁,而且永远无法恢复。相似不是平等。

我建议存储特定于元素的定位器,但一旦页面刷新,您仍然需要通过定位器"重新调整"元素。

在编写Selenium代码时,唯一可用的就是跟踪应用程序状态。

您是否执行了刷新DOM的操作?然后,您需要执行另一个findElement调用,以获得下一个要交互的元素的新实例。

否则,在Utility类中编写自己的方法findElementByXpath,该类尝试查找元素,捕获StaleElement异常并重试。

我将描述我的案例,它类似:我试图通过这样做来找到一个有价值的表格单元格:

  1. 获取所有表行
  2. 对于每一行,获取列的集合
  3. 对于每列-查找值

有一天,我遇到了一个结果太多的案例。因此,我对循环进行编程,以点击";获取下一页";链接/图标。易于理解的不当程序点击";表格的下一页";链接,指向该表的WebElement不可用,我收到了与这个问题的作者相同的错误:StaleElementReferenceException

我所做的是:

首先获取表的XPATH,然后我更改了循环,这样,如果扫描了所有行,但没有找到值,并且启用了下一个图标:

  1. 单击表格的下一页
  2. 更新WebElement以重新指向表

我希望我是清白的。

最新更新