IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Selenium | 引用WebElement时报错stale element reference -> 正文阅读

[开发测试]Selenium | 引用WebElement时报错stale element reference

当项目中需要断言文本是否在元素列表的文本集中时,在对元素列表中的元素for循环遍历进行WebElement.text 操作时,随机性的出现state element reference的报错信息

源代码如下:

def assertIsInTextSet(self,locator,expect,isIn=True):
    elems = self.findElements(locator)
    elems_text = [elem.text for elem in elems]
    try:
        if isIn:
            assert expect in elems_text
        else:
            assert expect not in elems_text
    except AssertionError as e:
        loggerHandler.logger.error('断言失败')
        raise e

报错信息如下:

stale element reference: element is not attached to the page document

过时的元素引用:元素未附加到页面文档

执行步骤: assertIsInTextSet(("xpath","//div[@class='s-table-header-wrapper']/table/thead/tr/th/div[@class='cell']"),"IP地址",False)
POST http://127.0.0.1:52589/session/8350c4f258317a9129c5da4bcf344a59/elements {"using": "xpath", "value": "//div[@class='s-table-header-wrapper']/table/thead/tr/th/div[@class='cell']"}
http://127.0.0.1:52589 "POST /session/8350c4f258317a9129c5da4bcf344a59/elements HTTP/1.1" 200 643
Finished Request
GET http://127.0.0.1:52589/session/8350c4f258317a9129c5da4bcf344a59/element/cc580c5f-9a67-4133-a773-02cd605f17d9/text {"id": "cc580c5f-9a67-4133-a773-02cd605f17d9"}
http://127.0.0.1:52589 "GET /session/8350c4f258317a9129c5da4bcf344a59/element/cc580c5f-9a67-4133-a773-02cd605f17d9/text HTTP/1.1" 404 1088
Finished Request
测试用例运行失败, 错误信息是: Message: stale element reference: element is not attached to the page document
  (Session info: chrome=98.0.4758.102)

根据报错信息可以分析出,for循环获得的元素列表只是元素在DOM中的唯一ID列表,当执行到element.text 获取元素文本信息时,会再次根据元素的唯一ID发起http请求获取text,这一点在selenium源码中也得到了验证。页面元素不断在渲染,导致元素会发生变化,所以当引用的元素在页面DOM发生变化后获取相关信息就会报引用错误的信息。

部分源码如下:

@property
def text(self):
    """The text of the element."""
    return self._execute(Command.GET_ELEMENT_TEXT)['value']

所以,要解决这个问题,就必须保证元素是最新的!即:在每次引用前重新定位获取新的ID即可

修改后的源码如下:

def assertIsInTextSet(self,locator,expect,isIn=True):
    elems = self.findElements(locator)
    elems_text = [self.findElements(locator)[index].text for index in range(len(elems))]
    try:
        if isIn:
            assert expect in elems_text
        else:
            assert expect not in elems_text
    except AssertionError as e:
        loggerHandler.logger.error('断言失败')
        raise e

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-02-24 15:36:05  更:2022-02-24 15:37:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 2:37:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码