Как исправить «Сообщение: устаревшая ссылка на элемент: элемент не прикреплен к документу страницы» - PullRequest
0 голосов
/ 28 октября 2019

Попытка автоматизировать задачу через 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()

В основном для автоматизации необходимо ввести каждый сервер (div, начиная с id server-list-), ​​щелкнуть по нему, после входа в этот раздел нажать другую кнопку и затем вернуться на главнуюстр.

Ответы [ 3 ]

0 голосов
/ 28 октября 2019

Имея ограниченную информацию, вы можете попробовать код ниже:

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-')]")))
0 голосов
/ 28 октября 2019

Вы захватываете список серверов, которые больше не существуют после того, как вы углубились в конкретный элемент списка . Поэтому, когда вы вернетесь к списку, старый уже не существует, следовательно, все предметы (включая тот, который вы ожидаете переместить рядом) устарели .

Вам нужно переделатьваша логика, так что вы получаете список серверов каждый раз, когда вы возвращаетесь из сведений о сервере, и сохраняете там флаг, который позволил бы вашему сценарию знать, какие элементы вы уже посетили.

0 голосов
/ 28 октября 2019

Исключение ссылки на устаревший элемент генерируется по следующей причине:

  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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...