gpt4 book ai didi

python - 在 python Selenium 中循环遍历页面并获取 StaleElementReferenceException

转载 作者:太空宇宙 更新时间:2023-11-03 15:36:29 28 4
gpt4 key购买 nike

所以我正在循环浏览一堆网页。目前,所有网页都具有相同的结构,带有后退按钮和前进按钮(//span/a)[2]。由于某种原因,我可以循环浏览第一页(有时是第二页)。但是我仍然收到 StaleElementReferenceException

相关代码如下:

for x in range(0,5):
print 'page %d' %(x)
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "(//span/a)[2]"))
)
listItems = driver.find_elements_by_xpath("//td[@class='CourseCode']/a")
for element in listItems:
elementText = element.text
print(elementText)
writeFile.write(element.text + '\n')
driver.find_element_by_xpath("(//span/a)[2]").click()

特别是这里是堆栈跟踪:

Traceback (most recent call last):
File "getList.py", line 21, in lookup
addListItems(driver, courseCodeFile)
File "getList.py", line 44, in addListItems
elementText = element.text
File "/home/francisco/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 73, in text
return self._execute(Command.GET_ELEMENT_TEXT)['value']
File "/home/francisco/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webelement.py", line 494, in _execute
return self._parent.execute(command, params)
File "/home/francisco/.local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
self.error_handler.check_response(response)
File "/home/francisco/.local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
raise exception_class(message, screen, stacktrace)
StaleElementReferenceException: Message: The element reference is stale. Either the element is no longer attached to the DOM or the page has been refreshed.

我尝试了很多方法都没有成功。奇怪的是,如果不循环,我就能让该函数在两个页面上正常工作。

值得注意的是,在 RTE 之前,它将打印在上一页中获取的 listItems 的前 2-3 个元素的文本。

最佳答案

您可以使用 stalenessOf 来避免 StaleElementReferenceExpection WebDriverWait 中的预期条件

<小时/>

StaleElementReferenceExpection发生在两种常见情况下:

  1. 该元素已被完全删除。
  2. 该元素不再附加到 DOM。

由于您在所有网页上使用通用定位器,一旦您单击某个元素,selenium 仍然引用上一页中的定位器(DOM 尚未更新,仍然引用旧网页)

一个简单的解决方案是在代码末尾添加 time.sleep ,以便 DOM 更新,并且定位器将应用于新网页的 DOM 上。

for x in range(0,5):
print 'page %d' %(x)
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "(//span/a)[2]"))
)
listItems = driver.find_elements_by_xpath("//td[@class='CourseCode']/a")
for element in listItems:
elementText = element.text
print(elementText)
writeFile.write(element.text + '\n')
driver.find_element_by_xpath("(//span/a)[2]").click()
import time
time.sleep(0.5) //0.5 seconds
<小时/>

另一个解决方案是检查每个网页中的唯一元素,这在 for 循环 中可能是不可能的(如果您使用 if-else 则可能) >索引等)

关于python - 在 python Selenium 中循环遍历页面并获取 StaleElementReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42476652/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com