Python中Selenium StaleElementReferenceException问题求助
解决 Selenium 中的 StaleElementReferenceException 问题
我一眼就看出你的问题出在哪了——当页面跳转或刷新后,之前获取的WebElement对象就失效了。你提前把所有包含'campaign'的链接元素存在了links列表里,但当你点击第一个链接跳转到新页面,再返回原页面时,原页面的DOM已经重新加载了,原来的links里的元素早就不是当前页面的元素了,自然会抛出StaleElementReferenceException。
核心解决方案:保存链接地址而非元素对象
与其保存WebElement实例,不如先把所有需要访问的链接的href属性提取出来存在列表里。后续直接通过browser.get(href)来跳转页面,这样就完全不会依赖之前的DOM元素引用了,从根源上避免了过时元素的问题。
修改后的代码
"""Get the browser (a "driver").""" # find the path with 'which chromedriver' path_to_chromedriver = ('/Users/xxxx/Desktop/chromedriver') browser = webdriver.Chrome(executable_path=path_to_chromedriver) url = "http://www.presidency.ucsb.edu/index_docs.php" browser.get(url) # 2016 Presidential Election pe_2016 = browser.find_element_by_xpath("/html/body/table/tbody/tr[2]/td/table/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/ul/li[22]/ul/li[7]/a") pe_2016.click() # 先获取所有campaign链接的href,而不是元素对象 campaign_links = [elem.get_attribute("href") for elem in browser.find_elements_by_partial_link_text('campaign')] for link in campaign_links: # 通过href直接跳转,而非点击元素 browser.get(link) time.sleep(5) # 同样,提取目标链接的href列表 target_links = [elem.get_attribute("href") for elem in browser.find_elements_by_xpath("//a[@href]") if 'http://www.presidency.ucsb.edu/ws/' in elem.get_attribute("href")] try: for target_link in target_links: browser.get(target_link) time.sleep(5) browser.back() time.sleep(5) except Exception as e: print(e) # 回到campaign列表页面,继续下一个链接 browser.back() time.sleep(5)
额外优化建议
- 尽量避免使用冗长的绝对XPath(比如你定位pe_2016的XPath),可以改用相对路径或者结合元素的文本、class等属性,这样代码更健壮,页面结构小改动也不会导致定位失败。
time.sleep()虽然简单,但不够灵活,建议改用WebDriverWait的显式等待,比如等待元素可见后再操作,这样能减少不必要的等待时间,也更稳定。
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

