Я использую 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
.