调用find_elements返回结果的.text会重新执行该函数吗?为何出现StaleElement异常
问题1解答
- 访问元素
.text属性不会重新运行find_elements函数。find_elements执行后返回的是一组指向当前UI节点的引用对象,并不是元素的永久副本。 - 第一行代码执行时,对应类名的UI节点还处于可用状态,因此可以正常拿到引用不会触发异常。后续触发
StaleElementReferenceException是因为在拿到引用到访问属性的间隔中,App UI发生了重绘、节点更新或页面刷新,原有引用指向的节点已经被销毁,所以访问任何元素属性都会抛出该异常。
问题2解答
- 该解决思路是正确的:需要在拿到元素引用的第一时间就提取文本存入普通列表,普通列表的内容不会随UI更新失效。
- 报错原因是
find_elements返回的是WebElement对象组成的列表,.text是单个WebElement对象的属性,无法直接作用于列表。 - 可行实现方案如下:
# 方法1:直接遍历提取文本,适合UI相对稳定的场景 chatblocks = driver2.find_elements_by_class_name("android.widget.TextView") chat_text_list = [block.text for block in chatblocks] # 取倒数第三个文本直接操作普通列表即可 chatblocktext = chat_text_list[-3] # 方法2:加异常捕获适配UI可能实时变动的场景 chat_text_list = [] for block in driver2.find_elements_by_class_name("android.widget.TextView"): try: chat_text_list.append(block.text) except StaleElementReferenceException: # 遇到失效节点可跳过或按需求填充默认值 chat_text_list.append("")
内容的提问来源于stack exchange,提问作者HFOrangefish
相关产品推荐
相关产品推荐

