Python 2.7+Selenium出现StaleElementReferenceException报错求助
解决Selenium中的StaleElementReferenceException问题
嘿,这个问题我之前踩过一模一样的坑!咱们先搞明白为啥会弹出StaleElementReferenceException:
当你执行search.send_keys(Keys.RETURN)后,Google跳转到了搜索结果页面——这时候页面的DOM已经完全重新渲染了。你之前定位并存在search变量里的那个搜索框,已经不是当前页面中的元素了,旧的元素引用直接失效,这时候再调用search.clear()自然会报错。
最简单的修复方案:重新定位元素
在执行clear()操作前,重新获取一次当前页面的搜索框引用就行,修改后的代码如下:
from selenium.webdriver.common.keys import Keys import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.google.com') # 第一次定位搜索框并输入内容 search = browser.find_element_by_id('lst-ib') search.send_keys('Python 2') search.send_keys(Keys.RETURN) time.sleep(6) # 关键步骤:搜索页面加载完成后,重新定位搜索框 search = browser.find_element_by_id('lst-ib') search.clear() time.sleep(2) browser.close()
更可靠的优化方案:用显式等待代替固定sleep
time.sleep()是固定时长等待,有时候页面加载慢了会超时,加载快了又白白浪费时间。用Selenium的显式等待可以等到元素真正可操作时再执行代码,稳定性和效率都更高:
from selenium.webdriver.common.keys import Keys from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('https://www.google.com') # 等待搜索框加载完成并可点击 search = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.ID, 'lst-ib')) ) search.send_keys('Python 2') search.send_keys(Keys.RETURN) # 搜索结果加载后,重新等待并定位搜索框 search = WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.ID, 'lst-ib')) ) search.clear() browser.close()
这个方法会最多等待10秒,只要搜索框在10秒内变得可操作,就会立刻执行下一步,比固定sleep灵活得多。
内容的提问来源于stack exchange,提问作者Amarpreet Singh
相关产品推荐
相关产品推荐

