webdriver使用clear方法再使用send_keys报错

在某管理系统软件的登录界面,使用 Python 的 WebDriver 进行自动登录时,遇到在清除输入后再次输入导致的报错。错误源于元素对象在 clear 方法执行后发生变化。clear 方法会删除元素文本,页面可能因此创建新的元素。为解决这个问题,可以采用导入 keys 模块,通过 send_keys 方法模拟全选并替换文本的键盘操作来避免元素找不到的错误。
报错信息
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')		  #替换文本

此外网上还有其他的方法,可自行搜索查看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海阔,天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值