报错信息
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
中文描述
Selenium.common.exceptions.StaleElementReferenceException:消息:过时元素引用:元素未附加到页面文档
场景描述
某管理系统软件登录界面,使用webdriver——Python脚本实现自动登录,在这个过程中需要修改登录时间。当使用clear方法后又使用send_keys方法进行输入后提示上文的报错信息。
执行步骤
- 第一次执行情况
import time
from selenium import webdriver
chrome = webdriver.Chrome() #创造一个浏览器实例
chrome.maximize_window() #是浏览器窗口全屏显示
chrome.get('http://127.0.0.1:8188/login') #打开指定URL地址
username = chrome.find_element('name', 'userName') #获取页面元素
userpass = chrome.find_element('name', 'password')
login_date = chrome.find_element('class name', 'ivu-input-large')
username.send_keys('系统管理员') #向input输入框输入相应内容
userpass.send_keys('1')
login_date.clear() #清空input输入框中的内容
time.sleep(2) #将脚本延迟2秒再执行
login_date.send_keys('2021-01-01') #再向被清空的input输入框中输入指定内容
执行后代码报错信息如下:
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
此处省略若干次…
- 最终执行情况:
import time
from selenium import webdriver
chrome = webdriver.Chrome()
chrome.maximize_window()
chrome.get('http://127.0.0.1:8188/login')
username = chrome.find_element('name', 'userName')
userpass = chrome.find_element('name', 'password')
login_date = chrome.find_element('class name', 'ivu-input-large')
print('日期框1:',login_date) #打印当前获取元素
login_btn = chrome.find_element('tag name', 'button')
username.send_keys('系统管理员')
userpass.send_keys('1')
login_date.send_keys('2021-01-01')
login_date = chrome.find_element('class name', 'ivu-input-large')
time.sleep(2)
print('日期框2:',login_date) #打印当前获取元素
login_date.clear()
time.sleep(2)
login_date = chrome.find_element('class name', 'ivu-input-large')
print('日期框3:',login_date) #打印当前获取元素
login_date.send_keys('2021-01-01')
后台打印结果
日期框1: <selenium.webdriver.remote.webelement.WebElement (session="5b5f5f4ccf402af7d38454571c53e153", element="77974df5-00aa-48a9-9de7-f29f8c5484af")>
日期框2: <selenium.webdriver.remote.webelement.WebElement (session="5b5f5f4ccf402af7d38454571c53e153", element="77974df5-00aa-48a9-9de7-f29f8c5484af")>
日期框3: <selenium.webdriver.remote.webelement.WebElement (session="5b5f5f4ccf402af7d38454571c53e153", element="90c34af9-aa1e-42b8-af91-ebbd61754d49")>
由此可以看见:日期框1和日期框2打印的元素id与日期框3打印的数值并不一样,这就说明元素对象变更了,所以才会出现报错信息中说的“找不到元素“的情况。
以下是我对clear方法的理解:
此方法执行过程是先将元素选中,再将元素中文本进行删除(在查找错误时,曾用JavaScript进行直接清空文本页面并不会生成新的元素),此元素文本为空后,页面会重新生成新的元素
注:这里元素改变跟HTML有关,不要理解为是clear方法引起的问题。
解决方法
在可以搜索到一些解决方法,如导入keys模块,然后使用send_keys方法来模拟键盘快捷键,先进行文本的全选,然后再用文本替代即可,代码如下:
import time
from selenium import webdriver
#导入keys模块
from selenium.webdriver.common.keys import Keys
chrome = webdriver.Chrome()
chrome.maximize_window()
chrome.get('http://127.0.0.1:8188/login')
username = chrome.find_element('name', 'userName')
userpass = chrome.find_element('name', 'password')
login_date = chrome.find_element('class name', 'ivu-input-large')
login_btn = chrome.find_element('tag name', 'button')
username.send_keys('系统管理员')
userpass.send_keys('1')
#添加如下代码
login_date.send_keys(Keys.CONTROL, 'a') #全选文本
login_date.send_keys('2021-01-01') #替换文本
此外网上还有其他的方法,可自行搜索查看。
在某管理系统软件的登录界面,使用 Python 的 WebDriver 进行自动登录时,遇到在清除输入后再次输入导致的报错。错误源于元素对象在 clear 方法执行后发生变化。clear 方法会删除元素文本,页面可能因此创建新的元素。为解决这个问题,可以采用导入 keys 模块,通过 send_keys 方法模拟全选并替换文本的键盘操作来避免元素找不到的错误。
714

被折叠的 条评论
为什么被折叠?



