Selenium提交按钮仅特定代码生效,StaleElementReferenceException问题咨询
Selenium提交按钮仅特定代码生效的问题
我用Selenium做自动化登录,核心代码如下:
driver.get(url) usernameelem = driver.find_element(By.XPATH,usernameId) usernameelem.send_keys(username) passwordelem = driver.find_element(By.XPATH,passwordId) passwordelem.send_keys(password) passwordelem.send_keys(Keys.ENTER) try: submitbut = driver.find_element(By.XPATH,submit_buttonId) submitbut.click() except: submitbut1 = driver.find_element(By.XPATH,submit_buttonId) submitbut1.send_keys(Keys.ENTER) time.sleep(5)
其中只有这段代码能成功点击提交按钮:
try: submit = driver.find_element(By.XPATH,submit_buttonId) submit.click() except: submit = driver.find_element(By.XPATH,submit_buttonId) submit.send_keys(Keys.ENTER)
尝试其他写法都会抛出selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found异常,比如:
写法一:
submit = driver.find_element(By.XPATH,submit_buttonId) submit = driver.find_element(By.XPATH,submit_buttonId) submit.send_keys(Keys.ENTER)
写法二:
try: submit = driver.find_element(By.XPATH,submit_buttonId) submit.click() except: submit = driver.find_element(By.XPATH,submit_buttonId) submit.click()
提交按钮始终可见,手动点击完全正常,我搞不懂为什么只有特定顺序的代码能生效。
原因分析
出现这个问题的核心是页面在密码回车后发生了隐性DOM刷新——虽然按钮看起来没变化,但它的DOM节点已经被重新渲染,之前定位的元素引用直接失效,这就是StaleElementReferenceException的根源。
你的有效代码能成功,是因为:
- 第一次尝试
click时,要么刚好DOM还没刷新,要么刷新导致元素引用失效触发异常; - 进入
except块后重新定位元素,此时DOM已经稳定,能获取到新的有效元素节点; - 用
send_keys(Keys.ENTER)触发提交,回车是触发表单的默认提交行为,比直接点击按钮更不容易受元素DOM变动、事件绑定失效的影响。
其他写法失败的原因:
- 连续两次定位后回车:第一次定位的元素可能已经因DOM刷新失效,第二次定位时机不对,没能等到DOM稳定,导致依然获取到失效的元素引用;
except块里仍用click:重新定位后点击按钮,可能因为动态渲染后按钮的点击事件没有重新绑定,导致点击不生效,甚至再次触发元素引用失效问题。
内容的提问来源于stack exchange,提问作者Kitsune
相关产品推荐
相关产品推荐

