Ошибка Selenium «Элемент больше не привязан к DOM» при очистке данных

for i in driver.find_elements_by_class_name("endorse-count"): try: i.click() except: continue elem = WebDriverWait(driver, 100).until(EC.presence_of_element_located((By.CLASS_NAME, "dialog-window"))) src = elem.get_attribute("innerHTML") add_skill(name, src) WebDriverWait(driver, timeout=10) 

При выполнении приведенного выше кода возникает следующая ошибка:

 selenium.common.exceptions.StaleElementReferenceException: Message: u'Element is no longer attached to the DOM' ; Stacktrace: at fxdriver.cache.getElementAt (resource://fxdriver/modules/web_element_cache.js:7646) 

для линии –

 src = elem.get_attribute("innerHTML") 

Я запускаю этот код на странице профиля пользователя LinkedIn после входа в систему.

Я попытался поставить следующую строку кода после «i.click ()» –

 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

Но потом я вижу, что функция «add_skill (name, src)» не вызывается и ни один из кода после вызова driver.manage () не выполняется, хотя для цикла и далее i.click () работает нормально.

3 Solutions collect form web for “Ошибка Selenium «Элемент больше не привязан к DOM» при очистке данных”

Selenium пытается выполнить действия (например, нажать кнопку или ссылку), прежде чем проверять, что целевой элемент отобразился на странице. Селен может быть более терпеливым, но вы должны прямо спросить его.

Например, если вы тестируете что-то, что делает запрос AJAX, вы можете попробовать что-то вроде этого (в Ruby):

 # timeout is in seconds def wait_for_ajax(timeout=x) time_limit, interval = (Time.now + timeout), 0.5 loop do break if @driver.execute_script "return jQuery.active == 0" sleep interval raise "Wait for AJAX timed out after waiting for #{timeout} seconds" if Time.now > time_limit end end 

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

Я столкнулся с подобной проблемой и попытался обновить страницу, прежде чем найти этот элемент, и он сработал …

 driver.navigate().refresh(); 

Хотя я не мог понять, как это сработало.

Если это сработает и для вас, пожалуйста, дайте мне знать. Я просто хочу узнать больше об этом исключении.

вы можете ссылаться на эту страницу, чтобы узнать о подобной проблеме

У меня была аналогичная проблема при попытке выполнить некоторый javascript (IJavaScripExecutor). Я создал IWebElement и передал это JSE, и это не помогло мне. Когда я переместил driver.FindElement (BySelector) в мой JSE-вызов, тогда он сработал. (Код C # впереди).

Вместо:

 IJavaScriptExecutor js = (IJavaScriptExecutor)driver; IWebElement tableEl = driver.FindElement(selector); js.ExecuteScript(script, tableEl); 

Я должен был сделать:

 IJavaScriptExecutor js = (IJavaScriptExecutor)driver; js.ExecuteScript(script, driver.FindElement(selector)); 

Возможно, вам придется сделать что-то подобное: переместите свой селектор или создание элемента в ту же строку, что и вы, что вы пытаетесь сделать. Или, может быть, в вашем случае:

 src = driver.find_element_by_class_name("dialog-window").get_attribute("innerHTML") 

При ближайшем рассмотрении, вот что выглядит вашей проблемой, есть старый объект веб-элемента, когда вы пытаетесь использовать метод get_attribute.

  • Pytest: как пропустить остальные тесты в классе, если один из них не прошел?
  • Использование chromedriver с селеном / python / ubuntu
  • Как отправить несколько ключей в WebDriver с помощью Python?
  • Как загрузить сеанс и файлы cookie из браузера Selenium в библиотеку запросов в Python?
  • Передача профиля Firefox для удаленного веб-браузера Firefox не работает
  • Selenium с использованием Python: введите / укажите пароль HTTP-прокси для Firefox
  • Получение всего видимого текста с веб-страницы с использованием Selenium
  • Получение возвращаемого значения кода Javascript в Selenium
  • Python - лучший язык программирования в мире.