Selenium по-прежнему использует предыдущее состояние страницы даже после нажатия кнопки на странице. Как обновиться до состояния браузера / HTML кода? - PullRequest
1 голос
/ 29 марта 2019

Я использую python для очистки некоторых данных с веб-сайта в сочетании с селеном и Beautiful Soup. На этой странице есть кнопки, которые вы можете щелкнуть, чтобы изменить данные, отображаемые в таблицах, но все это обрабатывается JavaScript на странице. URL страницы не меняется. Selenium успешно отображает JavaScript на странице загрузки, но продолжает использовать предыдущее состояние (до щелчков), поэтому очищает те же данные вместо новых данных.

Я пытался следовать решениям, приведенным на Повинуйтесь тестирующей козе , но всегда казалось, что время ожидания истекло, а состояние не устарело. Я попытался подождать 10 секунд вручную, используя time.sleep, чтобы он дождался, пока состояние не обновится через некоторое время. Я пытался использовать WebDriverWait, чтобы дождаться, пока старая страница не устареет. Я попытался просмотреть документацию по селену на предмет возможных решений. Приведенный ниже код пытается использовать решение, представленное на веб-сайте, но оно просто истекает вне зависимости от времени ожидания.

from selenium.webdriver.support.wait import WebDriverWait
from contextlib import contextmanager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import staleness_of
class MySeleniumTest():
    # assumes self.browser is a selenium webdriver

    def __init__(self, browser, soup):
        self.browser = browser
        self.soup = soup

    @contextmanager
    def wait_for_page_load(self, timeout=30):
        old_page = self.browser.find_element_by_tag_name('html')
        yield
        WebDriverWait(self.browser, timeout).until(staleness_of(old_page))

    def tryChangingState(self):
        with self.wait_for_page_load(timeout=20):
            og_state = self.soup
            tab = self.browser.find_element_by_link_text('Breakfast')
            tab.click()
            tab = self.browser.find_element_by_link_text('Lunch')
            tab.click()
            new_state = self.soup
            # check if the HTML code has changed
            print(og_state != new_state)
# create tester object
tester = MySeleniumTest(browser, soup)
# try changing state by after clicking on button
tester.tryChangingState()

Я не уверен, правильно ли я его использую или нет. Я также попытался создать новый с self.wait_for_page_load(timeout=20): после первого щелчка и поместил остальную часть кода в это, но это также не работало. Я ожидаю, что og_state != new_state приведет к true, что означает изменение HTML, но фактический результат - false.

1 Ответ

0 голосов
/ 30 марта 2019

Оригинальный постер здесь.Я нашел причину проблемы.Состояние обновлялось в селене, но поскольку я использовал Beautiful Soup для разбора, объект Beautiful Soup использовал исходный код из предыдущего объекта веб-драйвера selenium.Но при обновлении объекта супа при каждом нажатии страницы скребок смог успешно собрать новые данные.

Я обновил объект супа, просто вызвав soup = BeautifulSoup(browser.page_source, 'lxml')

Другими словами,Мне не нужно было беспокоиться о состоянии веб-драйвера selenium, это была просто проблема обновления исходного кода, который читал парсер.

...