我无法修复此错误(Selenium)[过时的元素参考:元素未附加到页面文档]



我目前正试图在一个网站上获取3d打印机的价格,但我经常遇到这个错误。这是代码:

import selenium

driver = webdriver.Chrome()
driver.get('https://www.dx.com/p/creality-cr10-v2-upgrade-ultraquiet-twoway-sphenoid-cooling-3d-printer-eu-plug-2711457.html#.Xy6c1SgzZhE')  
price = driver.find_elements_by_class_name('low-sale-price')
p = price
if not p:
print('Printer out of stock')        
if price != "":
for val in price:
a = val.text
b = str(a)
print(b)
break    

这就是错误:

Traceback (most recent call last):
File "C:UsersschamDesktopPrinterCrawler.py", line 117, in <module>
DealExtremeEnder()
File "C:UsersschamDesktopPrinterCrawler.py", line 111, in DealExtremeEnder
c = post.text
File "C:UsersschamAppDataLocalProgramsPythonPython38-32libsite- 
packagesseleniumwebdriverremotewebelement.py", line 76, in text
return self._execute(Command.GET_ELEMENT_TEXT)['value']
File "C:UsersschamAppDataLocalProgramsPythonPython38-32libsite- 
packagesseleniumwebdriverremotewebelement.py", line 633, in _execute
return self._parent.execute(command, params)
File "C:UsersschamAppDataLocalProgramsPythonPython38-32libsite- 
packagesseleniumwebdriverremotewebdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:UsersschamAppDataLocalProgramsPythonPython38-32libsite- 
packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element 
is not attached to the page document
(Session info: chrome=84.0.4147.105)

我们将不胜感激。提前谢谢。

我的猜测是price中元素的循环导致了StaleElementReferenceException——这意味着price列表中的一个元素在DOM中发生了更改,需要再次调用driver.find_elements才能"刷新";具有非过时引用的元素。

您可以尝试修改您的代码,以便在price:中重新查找元素列表

import selenium

driver = webdriver.Chrome()
driver.get('https://www.dx.com/p/creality-cr10-v2-upgrade-ultraquiet-twoway-sphenoid-cooling-3d-printer-eu-plug-2711457.html#.Xy6c1SgzZhE')  
price = driver.find_elements_by_class_name('low-sale-price')
p = price
if not p:
print('Printer out of stock')        
if price != "":
for val in price:
a = val.text
b = str(a)
print(b)

# refresh price element list before re-iterating the loop
price = driver.find_elements_by_class_name('low-sale-price')
break    

最新更新