首页 > 解决方案 > 即使单击页面上的按钮,Selenium 仍使用页面的先前状态。如何更新到浏览器/HTML 代码的状态?

问题描述

我正在使用 python 结合 selenium 和 Beautiful Soup 从网站上抓取一些数据。该页面有一些按钮,您可以单击这些按钮更改表格中显示的数据,但这一切都由页面中的 javascript 处理。页面 url 不会改变。Selenium 成功地在加载页面上呈现 javascript,但它继续使用先前的状态(点击之前),因此抓取相同的数据而不是新数据。

我尝试遵循Obey The Testing Goat上给出的解决方案,但它似乎总是超时并且不会使状态过时。我尝试使用 time.sleep 手动等待 10 秒,以等待状态可能在一段时间内刷新。我试过用WebDriverWait等到旧页面过时。我已经尝试通过 selenium 文档寻找可能的解决方案。下面提供的代码尝试使用网站中提供的解决方案,但无论超时率如何,它都会超时。

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.

标签: python-3.xseleniumselenium-webdriverbeautifulsoupselenium-chromedriver

解决方案


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

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

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


推荐阅读