【问题标题】:Get this error when try to iterate using selenium. "stale element reference: element is not attached to the page document"尝试使用 selenium 进行迭代时出现此错误。 “过时的元素参考:元素未附加到页面文档”
【发布时间】:2021-08-18 09:07:38
【问题描述】:

我写了一个 python 脚本。首先,它访问这个网站。然后点击右侧的箭头,进入新的网页收集一些数据。最后回到上一页,对下一项做同样的事情。

网页:https://register.fca.org.uk/s/search?q=capital&type=Companies

这是代码。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.wait import WebDriverWait
import time

url = 'https://register.fca.org.uk/s/search?q=capital&type=Companies'
service = Service('link to come driver')
service.start()
driver = webdriver.Remote(service.service_url)
driver.get(url)
time.sleep(12)


divs = driver.find_elements_by_xpath('//div[@class="result-card_main"]')
for d in divs:

   RN = ''
   companyName = ''
   companyName =   d.find_element_by_tag_name('h2').text
   RNData = d.find_element_by_xpath('.//div[@class="result-card_figure-offset"]').text
   RN = RNData.split(':')[1].strip()

   d.click()
   time.sleep(12)

   phoneNumber = ''
   phoneNumberData =  driver.find_elements_by_xpath('//*[@id="who-is-this-details-content"]/div[1]/div[2]/div[2]/div/div/div[2]')
   phoneNumber = phoneNumberData[0].text.split('\n')[1]

   print(RN)
   print(companyName)
   print(phoneNumber)

   driver.execute_script("history.back();")

它给了我这个错误:

  selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

我该如何解决这个问题?

【问题讨论】:

标签: python selenium selenium-webdriver


【解决方案1】:

这是避免该错误的快速而肮脏的方法,请像这样更改您的代码:

url = 'https://register.fca.org.uk/s/search?q=capital&type=Companies'

driver.get(url)
time.sleep(12)


divs = driver.find_elements_by_xpath('//div[@class="result-card_main"]')
for i in range(len(divs)):
   time.sleep(4)
   d = driver.find_elements_by_xpath('//div[@class="result-card_main"]')
   RN = ''
   companyName = ''
   companyName = d[i].find_element_by_tag_name('h2').text
   RNData = d[i].find_element_by_xpath('.//div[@class="result-card_figure-offset"]').text
   RN = RNData.split(':')[1].strip()

   d[i].click()
   time.sleep(12)

   phoneNumber = ''
   phoneNumberData =  driver.find_elements_by_xpath('//*[@id="who-is-this-details-content"]/div[1]/div[2]/div[2]/div/div/div[2]')
   phoneNumber = phoneNumberData[0].text.split('\n')[1]

   print(RN)
   print(companyName)
   print(phoneNumber)

   driver.execute_script("window.history.go(-1)")

【讨论】:

  • IndexError: 列表索引超出范围
  • 对不起,我之前没有测试过。现在我做到了。出于某种原因,您的导航“返回”对我不起作用,所以我找到了另一种方式。我还发现在尝试识别循环中的d 之前需要等待。我用适合我的方式更新了代码。
  • 评论:使用硬睡眠是脆弱的并且需要太长时间。您应该考虑在测试中使用webDriverWait
  • 谢谢。有用。我一定会在其中添加 webDriverWait。 :)
  • 如果我想进入下一页并一次又一次地做同样的事情,我需要在这段代码中做什么样的改变。
猜你喜欢
  • 2022-12-01
  • 2019-04-27
  • 1970-01-01
  • 2017-12-13
  • 2016-10-13
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多