即使在单击页面上的按钮后,Selenium 仍然使用页面的先前状态.如何更新到浏览器/HTML 代码的状态?



我正在使用python从网站上抓取一些数据,并结合硒和美丽的汤。此页面具有您可以单击的按钮,这些按钮可以更改表格中显示的数据,但这全部由页面中的javascript处理。页面网址不会更改。 Selenium 在加载时成功地在页面上呈现 javascript,但它继续使用以前的状态(点击之前),因此抓取相同的数据而不是新数据。

我尝试遵循 Obey The Test Goat 上给出的解决方案,但它似乎总是超时并且不会使状态过时。我尝试使用 time.sleep 手动等待 10 秒,让它等待状态可能在一段时间内刷新。我尝试使用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()

我不确定我是否以正确的方式使用它。我还尝试在第一次单击后创建一个新的 withself.wait_for_page_load(timeout=20):并将其余代码放入其中,但这也没有奏效。我希望og_state != new_state会导致true暗示 HTML 已更改,但实际结果是false.

原始海报在这里。我找到了问题的原因。状态正在硒中更新,但由于我使用美丽的汤进行解析,美丽的汤对象使用的是以前的硒 Web 驱动程序对象的源代码。但是每次点击页面时更新汤对象,抓取器都能够成功收集新数据。

我通过简单地调用soup = BeautifulSoup(browser.page_source, 'lxml')来更新汤对象

换句话说,我不需要担心 selenium Web 驱动程序的状态,这只是更新解析器正在读取的源代码的问题。

最新更新