首页 > 解决方案 > 如何处理 Python Selenium 中的“消息:过时的元素引用:元素未附加到页面文档”

问题描述

我正在编写一个脚本来从网站上抓取产品名称,按品牌过滤。某些搜索结果可能包含多个页面,这就是问题所在。我可以抓取第一页,但是当脚本单击下一页时,会selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document显示错误消息。下面是我的代码:

def scrape():
   resultList = []
   currentPage = 1

   while currentPage <= 2:
      titleResults = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'h4.mt-0')))
      resultList.append(titleResults)
      checkNextPage = WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.XPATH, "//div/nav/ul/li/a[@aria-label='Next']")))
      for cnp in checkNextPage:
         nextPageNumber = int(cnp.get_attribute("data-page"))
      currentPage += 1
      driver.find_element_by_xpath("//div/nav/ul/li/a[@aria-label='Next']").click()
   for result in resultList[0]:
      print("Result: {}".format(result.text))

我认为错误是在.click()被调用时触发的。在求助于在这里发布这个问题之前,我在互联网上做了很多搜索,因为要么我不理解其他文章/帖子的解决方案,要么它们不适用于我的案例。

标签: pythonpython-3.xseleniumselenium-webdriverselenium-chromedriver

解决方案


陈旧元素是指旧元素或不再可用的元素。

我认为错误是由最后一行引起的。

您应该在元素变得不可用之前提取元素文本。

def scrape():
   resultList = []
   currentPage = 1

   while currentPage <= 2:
      titleResults = WebDriverWait(driver, 
10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'h4.mt-0')))

      // Extract elements text 
      results_text = [titleResults[i].text for i in range(0, len(titleResults))]
      resultList.extend(results_text)

      checkNextPage = WebDriverWait(driver, 30).until(EC.visibility_of_all_elements_located((By.XPATH, "//div/nav/ul/li/a[@aria-label='Next']")))
      for cnp in checkNextPage:
         nextPageNumber = int(cnp.get_attribute("data-page"))
      currentPage += 1
      driver.find_element_by_xpath("//div/nav/ul/li/a[@aria-label='Next']").click()


  print("Result: {}".format(resultList))

推荐阅读