使用find_elements和get_attribute遇not attached错误,如何通过单次请求解决
问题原因
你遇到的not attached错误本质是StaleElementReferenceException:原写法先获取所有匹配的li元素实例存到内存,再逐个调用get_attribute读取属性,中间如果页面DOM发生动态更新(比如会话列表刷新、元素重渲染),已经拿到的元素引用就会和DOM脱离,调用属性方法就会报错。
推荐解决方案
方案1:JavaScript批量提取(最优,兼容性最好)
直接调用浏览器原生JS完成全量属性查询,整个过程在浏览器侧执行,不需要持有元素引用,完全规避元素失效问题:
dialogs = self.execute_script(""" return Array.from(document.querySelectorAll('ul#im_dialogs li.nim-dialog_unread')) .map(item => item.dataset.listId) """)
方案2:XPath直接定位属性节点
如果你更习惯用XPath语法,可以直接在路径末尾指定要提取的属性,一次性拿到所有属性节点后读取值即可:
attr_list = self.find_elements_by_xpath('//ul[@id="im_dialogs"]/li[contains(@class, "nim-dialog_unread ")]/@data-list-id') dialogs = [attr.text for attr in attr_list]
注意:部分旧版本Selenium对属性节点的查找支持有限,如果遇到不生效的情况优先使用方案1。
内容的提问来源于stack exchange,提问作者aab137
相关产品推荐
相关产品推荐

