1.问题描述
selenium自动化代码,报错selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
StaleElementReferenceException是陈旧的元素引用异常
这个异常发生在
获取元素赋值给变量,再通过变量操作元素,两个步骤之间,若产生了界面刷新
则会在通过变量操作元素的时候,抛出此异常
再15行前面加一行代码self.driver.refresh()
运行结果:
2.问题解决
解决方案:
每次操作元素前,实时获取元素赋值给变量
也就是说,若在获取元素赋值给变量,与通过变量操作元素之间发生了页面刷新
则在界面刷新后,元素操作前,重新获取元素赋值给变量
解决后的代码(将元素定位封装在一个函数中,并return该元素,想用该元素时,直接调用该函数即可;这样的话元素赋值与操作元素之间就不会产生界面刷新了)
from selenium import webdriver
class loginPage:
def __init__(self, url):
# 创建浏览器驱动对象,这里是打开浏览器
self.driver = webdriver.Chrome("E:\愤怒吧小鸟\chromedriver-win64\chromedriver.exe")
# 访问网址
self.driver.get(url)
# 用户名输入框
def user_name_input_box(self):
return self.driver.find_element_by_name("username")
# 密码输入框
def password_input_box(self):
return self.driver.find_element_by_name("password")
# 登录按钮
def login_button_box(self):
return self.driver.find_element_by_css_selector("button")
def logn(self):
self.driver.refresh()
self.user_name_input_box().send_keys("libai") #封装成方法,元素赋值和操作元素中间就不会有界面刷新了
self.password_input_box().send_keys("opmsopms123")
self.login_button_box().click()
LP = loginPage("http://127.0.0.1:8088/")
LP.logn()
注意:有问题的代码和修复后的代码可在资源绑定中自行下载,如有问题可在评论区留言