如何解决遍历页面的 while 循环中的 StaleElementReferenceException
设置
我使用 Python + Selenium 来抓取 this site 公司的信息。
由于该网站不允许我简单地加载页面 url,我计划单击列表底部的下一页箭头元素并使用带有计数器的 while 循环。
browser.get('https://new.abb.com/channel-partners/search#')
wait.until(EC.visibility_of_element_located((By.CLASS_NAME,'abb-pagination')))
# start while loop and counter
c = 1
while c < 65:
c += 1
# obtain list of companies element
wait.until(EC.visibility_of_element_located((By.CLASS_NAME,'#PublicWrapper > main > section:nth-child(7) > div:nth-child(2)')))
resultlist = el_css('#PublicWrapper > main > section:nth-child(7) > div:nth-child(2)')
# loop over companies in list
for company in resultlist.find_elements_by_xpath('div'):
# company name
name = company.find_element_by_xpath('h3/a/span').text
# code to capture more company info follows
# next page arrow element
next_page_arrow = el_cn('abb-pagination__item--next')
next_page_arrow.click()
问题
代码在 while 循环之外捕获了公司信息,也就是第一页。
但是,当插入 while 循环以遍历页面时,出现以下错误:StaleElementReferenceException: stale element reference: element is not attached to the page document (Session info: chrome=88.0.4324.192)
如果我查看它,似乎后续页面的 resultlist
确实被捕获,但是 resultlist
中公司的循环产生了这个错误。
怎么办?
解决方法
最简单的解决方案是使用隐式等待:
driver.get('https://new.abb.com/channel-partners/search#')
company_name = []
while True:
time.sleep(1)
company_name+=[elem.text for elem in wait.until(EC.presence_of_all_elements_located((By.XPATH,'//span[@property="name"]')))]
# if next page arrow element still available,click,else break while
if driver.find_elements_by_xpath('//li[@class="abb-pagination__item--next"]/a[contains(@href,"#page")]'):
wait.until(EC.presence_of_element_located((By.XPATH,'//li[@class="abb-pagination__item--next"]/a'))).click()
else:
break
len(company_name)
输出:
951
您不需要计数器,您可以检查箭头 url 是否仍然可用,这样如果添加了第 65、66、[...] 页,您的逻辑仍然有效。
这里的问题是while太快,页面加载不及时。您也可以保存第一个公司名称列表,单击下一个箭头并与新列表进行比较,如果两者相同,请稍等,直到新列表与之前的列表不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。