如何修复“消息:陈旧元素引用:元素未附加到页面文档”

时间:2019-10-28 09:08:17

标签: python selenium selenium-webdriver

尝试通过Selenium python自动化任务,我遇到的问题是for每个部分仅在第一次才起作用,在那之后看不到第二个变量。还尝试增加延迟,以便网页可以完全加载,但存在相同的问题。

我测试了我在互联网上发现的不同情况,所以也进行了手动测试,但是看起来第二个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),然后在该部分上单击另一个按钮,然后返回主页。

3 个答案:

答案 0 :(得分:0)

由于以下原因,引发了陈旧元素引用异常

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

请检查您的元素在用户界面上是否仍具有与您交互时使用的相同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()

答案 1 :(得分:0)

在提供有限信息的情况下,您可以尝试以下代码:

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-')]")))

答案 2 :(得分:0)

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

您需要重新设计逻辑,以便每次从服务器详细信息中获取时都获得服务器列表,并存储一些标记,该标记将使您的脚本知道您已经访问了哪些项目。