我正在用Python编写一个程序来收集网站上的链接 . 代码是:
links = driver.find_elements_by_xpath('//*[@href]')
for link in links:
print(link.get_attribute('href'))
time.sleep(1)
我在一些网站上尝试过,效果很好 . 问题是当我在特定网站(www.ifood.com.br)中使用时 . 它收集一些链接,然后返回一些错误 . 我是Python的初学者,所以我不知道他们的意思 . 拜托,我需要一些帮助 .
代码的结果:
https://d1jgln4w9al398.cloudfront.net/imagens/ce/wl/www.ifood.com.br/favicon.ico https://d1jgln4w9al398.cloudfront.net/site/2.1.238-20181023.22/css/main . css https://fonts.googleapis.com/css?family=Open Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800 https://www.ifood.com.br/ Traceback(最近呼叫最后一次):文件“C:\ Users \ jorda \ Desktop \ Python - Projetos \ digitar ifood.py”,第32行,打印(link.get_attribute('href'))文件“C:\ Users \ jorda \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py“,第143行,在get_attribute中resp = self._execute(Command.GET_ELEMENT_ATTRIBUTE,{'name':name})文件”C: \ Users \ jorda \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py“,第633行,在_execute中返回self._parent.execute(command,params)文件“C:\ Users \ jorda \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py”,第321行,执行te self.error_handler.check_response(response)文件“C:\ Users \ jorda \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py”,第242行,在check_response中引发exception_class(message,screen,stacktrace)selenium.common.exceptions.StaleElementReferenceException:消息:陈旧元素引用:元素未附加到页面文档(会话信息:chrome = 70.0.3538.77)(驱动程序信息:chromedriver = 2.42 .591088(7b2b2dca23cca0862f674758c9a3933e685c27d5),platform = Windows NT 10.0.17134 x86_64)
1 回答
在您的错误日志中,您可以看到
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
通常,当您尝试与DOM中不再存在的Web元素进行交互时,会发生这种情况 . 典型的场景可以描述为
您打开了一个网页 .
查找一些元素并将其保存到变量中 .
页面DOM已更改(例如重新加载) .
您仍然可以看到相同的页面,但是从selenium的角度来看,第2步中的元素是STALE .
因此,在您的情况下,您可以在调用
.findElements
之前尝试确保页面已完全加载(即不恢复DOM) . 检查这是否能解决问题的最简单方法是在调用.findElements之前添加一个睡眠 .请注意,建议不要使用睡眠 . 因为例如,如果5秒工作,现在,无法保证在某些时候(由于连接不良)它不会破坏您的测试 . 相反,使用智能等待条件,该条件将重复检查'page loaded'条件并仅在发生时继续 . 更多细节可以在这里找到:Python Selenium stale element fix