Selenium错误:过时的元素引用:元素未附加到页面文档



我编写了这段代码,用于从有字符串列表的.txt文件下载来自谷歌的图像。

如果只将字符串放入代码中进行尝试。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(r'C:UsersDesktopTempimageschromedriver.exe'))
driver.get('https://www.google.it/imghp?hl=it&authuser=0&ogbl')
time.sleep(10)
with open("file.txt") as file:
for row in file.readlines():
box = driver.find_element("xpath", '/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input')
box.send_keys(row)
box.send_keys(Keys.ENTER)
time.sleep(3)
for i in range(1, 3):
try:
driver.find_element("xpath", '//*[@id="islrg"]/div[1]/div['+str(i)+']/a[1]/div[1]/img').screenshot(r'C:UsersDesktopTempimagesdownloads ('+str(i)+').png')
time.sleep(3)
except:
pass

当执行脚本时:

  • 开放式镀铬
  • 搜索图像

但当尝试下载图像时,应用程序崩溃,并显示以下消息:

Traceback (most recent call last):
File "C:UsersAngeloDesktopTempimagestry.py", line 16, in <module> box.send_keys(Keys.ENTER)
File "C:Python310libsite-packagesseleniumwebdriverremotewebelement.py", line 223, in send_keys self._execute(Command.SEND_KEYS_TO_ELEMENT,
File "C:Python310libsite-packagesseleniumwebdriverremotewebelement.py", line 396, in _execute return self._parent.execute(command, params)
File "C:Python310libsite-packagesseleniumwebdriverremotewebdriver.py", line 428, in execute self.error_handler.check_response(response)
File "C:Python310libsite-packagesseleniumwebdriverremoteerrorhandler.py", line 243, 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=105.0.5195.102)
Stacktrace:
Backtrace:
Ordinal0 [0x0076DF13+2219795]
Ordinal0 [0x00702841+1779777]
Ordinal0 [0x0061423D+803389]
Ordinal0 [0x00616D04+814340]
Ordinal0 [0x00616BC2+814018]
Ordinal0 [0x00616E50+814672]
Ordinal0 [0x00643A4B+997963]
Ordinal0 [0x00643B21+998177]
Ordinal0 [0x0063C1D4+967124]
Ordinal0 [0x0065E7FC+1107964]
Ordinal0 [0x006394B4+955572]
Ordinal0 [0x0065EA14+1108500]
Ordinal0 [0x0066F192+1175954]
Ordinal0 [0x0065E616+1107478]
Ordinal0 [0x00637F89+950153]
Ordinal0 [0x00638F56+954198]
GetHandleVerifier [0x00A62CB2+3040210]
GetHandleVerifier [0x00A52BB4+2974420]
GetHandleVerifier [0x00806A0A+565546]
GetHandleVerifier [0x00805680+560544]
Ordinal0 [0x00709A5C+1808988]
Ordinal0 [0x0070E3A8+1827752]
Ordinal0 [0x0070E495+1827989]
Ordinal0 [0x007180A4+1867940]
BaseThreadInitThunk [0x772BFA29+25]
RtlGetAppContainerNamedObjectPath [0x778A7A9E+286]
RtlGetAppContainerNamedObjectPath [0x778A7A6E+238]

UPDATE:file.txt示例:

popo
mumu
fiat
bmw
audi

通过执行搜索,输入元素正在发生变化
您可以使用另一个更好的定位器来解决此问题
此外,使用绝对XPaths或CSS Selector从来都不是一个好主意,因为这些定位器非常脆弱
试试这个:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(r'C:UsersDesktopTempimageschromedriver.exe'))
driver.get('https://www.google.it/imghp?hl=it&authuser=0&ogbl')
time.sleep(10)
with open("file.txt") as file:
for row in file.readlines():
box = driver.find_element("xpath", "//input[@name='q']")
box.send_keys(row)
box.send_keys(Keys.ENTER)
time.sleep(3)
for i in range(1, 3):
try:
driver.find_element("xpath", '//*[@id="islrg"]/div[1]/div['+str(i)+']/a[1]/div[1]/img').screenshot(r'C:UsersDesktopTempimagesdownloads ('+str(i)+').png')
time.sleep(3)
except:
pass

此外,最好总是尽可能使用WebDriverWait显式等待,而不是硬编码睡眠
UPD
我测试了以下代码,它工作正常,包括创建屏幕截图

import time
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("start-maximized")

webdriver_service = Service('C:webdriverschromedriver.exe')
driver = webdriver.Chrome(service=webdriver_service, options=options)
url = "https://www.google.it/imghp?hl=it&authuser=0&ogbl"
driver.get(url)
lines = ["kuku", "mumu", "popo"]
time.sleep(10)

for line in lines:
box = driver.find_element("xpath", "//input[@name='q']")
box.clear()
box.send_keys(line)
box.send_keys(Keys.ENTER)
time.sleep(3)
for i in range(1, 3):
try:
driver.find_element("xpath", '//*[@id="islrg"]/div[1]/div['+str(i)+']/a[1]/div[1]/img').screenshot(r'C:Users****Desktopdownloads ('+str(i)+').png')
time.sleep(3)
except:
pass

最新更新