【问题标题】:How to fix "Message: stale element reference: element is not attached to the page document"如何修复“消息:过时的元素引用:元素未附加到页面文档”
【发布时间】:2019-10-28 09:08:17
【问题描述】:

尝试通过 Selenium python 自动执行任务我遇到的问题是每个部分只在第一次工作,之后看不到第二个变量。还尝试添加延迟以使网页完全加载但同样的问题。

我测试了我在互联网上找到的不同场景,所以我做了手动测试,但看起来第二个 div 也无法识别其他 div

for server in browser.find_elements_by_xpath("//*[starts-with(@id,'server-list-')]"):
  #try:
  print("Server Section----")
  time.sleep(5)
  #Print server name
  print(server.text)

  #clicn on button inside the server
  server.click()

  #back into the server listing
  browser.back()

基本上自动化需要进入每个服务器(以 id server-list- 开头的 div )点击它,进入该部分后点击另一个按钮,然后返回主页。

【问题讨论】:

标签: python selenium selenium-webdriver


【解决方案1】:

由于以下原因引发了一个过时的元素引用异常

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

请检查您的元素是否仍然存在于 UI 上,与您在交互时使用的相同元素 XPath

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.XPATH, "//*[starts-with(@id,'server-list-')]"))
    )           
    for i in range(len(element)):
    element[i].click()
    driver.back()
    element = wait.until(EC.presence_of_element_located((By.XPATH, "//*[starts-with(@id,'server-list-')]")))

finally:
    driver.quit()

【讨论】:

    【解决方案2】:

    由于提供的信息有限,您可以尝试以下代码:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    browser = webdriver.Chrome()
    wait = WebDriverWait(browser, 10)
    servers = wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//*[starts-with(@id,'server-list-')]")))
    servers_count = len(servers)
    for i in range(servers_count):
        print(servers[i].text)
        servers[i].click()
        browser.back()
        servers = wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//*[starts-with(@id,'server-list-')]")))
    

    【讨论】:

      【解决方案3】:

      您捕获的服务器列表在您深入了解特定列表项后不再存在。因此,当您返回列表时,旧的不再存在,因此所有项目(包括您希望移到旁边的项目)都已过时

      您需要重新设计您的逻辑,以便每次从服务器详细信息返回时获取服务器列表,并在其中存储一个标志,让您的脚本知道您已经访问了哪些项目。

      【讨论】:

      • 请问有什么建议吗?
      • 这是我回答中的一般建议。更详细的答案需要更详细的问题。例如,代表您的服务器列表的 html sn-p 是什么
      猜你喜欢
      • 2018-10-23
      • 2021-12-19
      • 2019-09-30
      • 2022-08-17
      • 1970-01-01
      • 2019-02-03
      • 2022-01-21
      • 2021-05-10
      • 2020-11-13
      相关资源
      最近更新 更多