Получение данных из таблицы html с селеном (python): отправка изменений в цикл прерываний - PullRequest
1 голос
/ 26 февраля 2020

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

Это то, что я сделал до сих пор:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time

browser.get('https://daten.ktbl.de/feldarbeit/entry.html')

# Selecting the constant values of some of the drop downs:
fertilizer = Select(browser.find_element_by_name("hgId"))
fertilizer.select_by_value("2") 
fertilizer = Select(browser.find_element_by_name("gId"))
fertilizer.select_by_value("193") 
fertilizer = Select(browser.find_element_by_name("avId"))
fertilizer.select_by_value("383")  
fertilizer = Select(browser.find_element_by_name("hofID"))
fertilizer.select_by_value("2") 

# Looping over different combinations of plot size and amount of fertilizer:
size = Select(browser.find_element_by_name("flaecheID"))
for size_values in size.options:
    size.select_by_value(size_values.get_attribute("value"))
    time.sleep(1)

    amount= Select(browser.find_element_by_name("mengeID"))
    for amount_values in amount.options:
        amount.select_by_value(amount_values.get_attribute("value"))
        time.sleep(1)

        #Refreshing the page after the two variable values are chosen:
        button = browser.find_element_by_xpath("//*[@type='submit']")
        button.click()
        time.sleep(5)

Это приводит к ошибке: selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <option> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed. Очевидно, проблема в том, что я действительно обновил документ sh.

После отправки изменений и загрузки страницы результатов я хочу получить их с помощью:

html_source = browser.page_source
df_list = pd.read_html(html_source, match = "Dieselbedarf")

(Привет @ bink1time, который ответил на эту часть моего вопроса здесь ).

Как я могу обновить страницу, не нарушая l oop?

Я был бы очень признателен за помощь здесь!

1 Ответ

4 голосов
/ 27 февраля 2020

Исключение ссылки на устаревший элемент часто возникает при обновлении страницы sh из-за изменения UUID элемента в DOM.

Чтобы избежать этого, всегда стараются искать элемент перед взаимодействием . В вашем конкретном случае вы искали size и amount, нашли их и сохранили в переменных. Но затем, после ссылки sh, их UUID изменились, поэтому старые, которые вы сохранили, больше не привязаны к DOM. Пытаясь взаимодействовать с ними, Selenium не может найти их в DOM и выдает это исключение.

Я изменил ваш код, чтобы всегда повторно искать элементы размера и количества до взаимодействия:

# Looping over different combinations of plot size and amount of fertilizer:
size = Select(browser.find_element_by_name("flaecheID"))
for i in range(len(size.options)):
    # Search and save new select element
    size = Select(browser.find_element_by_name("flaecheID"))
    size.select_by_value(size.options[i].get_attribute("value"))
    time.sleep(1)

    amount = Select(browser.find_element_by_name("mengeID"))
    for j in range(len(amount.options)):
        # Search and save new select element
        amount = Select(browser.find_element_by_name("mengeID"))
        amount.select_by_value(amount.options[j].get_attribute("value"))
        time.sleep(1)

        #Refreshing the page after the two variable values are chosen:
        button = browser.find_element_by_xpath("//*[@type='submit']")
        button.click()
        time.sleep(5)

Попробуй это? Это сработало для меня. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...