python - 循环遍历列表时出现 StaleElementReferenceException
问题描述
我正在尝试为这个网站制作一个网页抓取工具。这个想法是代码通过选择机构的名称(首先是 3B-Wonen)来遍历所有机构,关闭弹出屏幕,单击下载按钮,然后对列表中的所有项目再次执行所有操作。
但是,在第一个循环之后,它会StaleElementReferenceException
在选择循环中的第二个机构时抛出 。从我读到的内容来看,这意味着第一个循环中定义的元素不再可访问。我已经阅读了多篇文章,但我不知道要克服这种特殊情况。
谁能指出我正确的方向?顺便说一句,我正在使用 Python 的 selenium,而且我是编程的初学者,所以我还在学习。如果您能指出我的大致方向,那将对我有很大帮助!我拥有的代码如下:
#importing and setting up parameters for geckodriver/firefox
...
# webpage
driver.get("https://opendata-dashboard.cijfersoverwonen.nl/dashboard/opendata-dashboard/beleidswaarde")
WebDriverWait(driver, 30)
# Get rid of cookie notification
# driver.find_element_by_class_name("cc-compliance").click()
# Store position of download button
element_to_select = driver.find_element_by_id("utilsmenu")
action = ActionChains(driver)
WebDriverWait(driver, 30)
# Drop down menu
driver.find_element_by_id("baseGeo").click()
# Add institutions to array
corporaties=[]
corporaties = driver.find_elements_by_xpath("//button[@role='option']")
# Iteration
for i in corporaties:
i.click() # select institution
driver.find_element_by_class_name("close-button").click() # close pop-up screen
action.move_to_element(element_to_select).perform() # select download button
driver.find_element_by_id("utilsmenu").click() # click download button
driver.find_element_by_id("utils-export-spreadsheet").click() # pick export to excel
driver.find_element_by_id("baseGeo").click() # select drop down menu for next iteration
解决方案
这段代码对我有用。但我没有做driver.find_element_by_id("utils-export-spreadsheet").click()
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome(executable_path="path")
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://opendata-dashboard.cijfersoverwonen.nl/dashboard/opendata-dashboard/beleidswaarde")
act = ActionChains(driver)
driver.find_element_by_xpath("//a[text()='Sluiten en niet meer tonen']").click() # Close pop-up
# Get the count of options
driver.find_element_by_id("baseGeoContent").click()
cor_len = len(driver.find_elements_by_xpath("//button[contains(@class,'sel-listitem')]"))
print(cor_len)
driver.find_element_by_class_name("close-button").click()
# No need to start from 0, since 1st option is already selected. Start from downloading and then move to next items.
for i in range(1,cor_len-288): # Tried only for 5 items
act.move_to_element(driver.find_element_by_id("utilsmenu")).click().perform()
#Code to click on downloading option
print("Downloaded:{}".format(driver.find_element_by_id("baseGeoContent").get_attribute("innerText")))
driver.find_element_by_id("baseGeoContent").click()
time.sleep(3) # Takes time to load.
coritems = driver.find_elements_by_xpath("//button[contains(@class,'sel-listitem')]")
coritems[i].click()
driver.find_element_by_class_name("close-button").click()
driver.quit()
输出:
295
Downloaded:3B-Wonen
Downloaded:Acantus
Downloaded:Accolade
Downloaded:Actium
Downloaded:Almelose Woningstichting Beter Wonen
Downloaded:Alwel
推荐阅读
- openshift - 在 Virtualbox 上安装 Openshift4
- java - WebSecurityConfiguration antMatcher() 在集成测试中不忽略外部 API 的特定 url
- reactjs - 无法设置未定义的属性“颜色”在 React 中出现此错误
- lossless-compression - 如何在 LosslessCut 中更改播放速度?
- sql - 了解 SQL 中表的结构/模式
- java - 在除一个之外的所有视图上放置阴影
- java - 为 javax.persistence.Persistence 获取 ClassNotFoundException 甚至认为我已经添加了所有 maven 依赖项
- django - Django:如何修复空蛞蝓?
- javascript - 如何按给定数量复制数组中的对象,ES6及更高版本
- android - 未处理的异常:'package:flutter/src/widgets/framework.dart':断言失败:'_debugCurrentBuildTarget == context':不正确