python-3.x - 即使单击页面上的按钮,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
.
解决方案
原始海报在这里。我找到了问题的原因。状态正在 selenium 中更新,但由于我使用 Beautiful Soup 进行解析,Beautiful Soup 对象使用的是之前 selenium Web 驱动程序对象的源代码。但是每次点击页面时都会更新汤对象,爬虫能够成功收集到新数据。
我通过简单地调用更新了汤对象soup = BeautifulSoup(browser.page_source, 'lxml')
换句话说,我不需要担心 selenium web 驱动程序的状态,这只是更新解析器正在读取的源代码的问题。
推荐阅读
- javascript - 如何检测表格每一行中的一个文本中是否发生任何变化?
- git - Visual Studio Code git/源代码控制装订线停止显示
- .net-core - 访问 MJPEG Stream .net 核心
- java - XMLUnit-2 比较部分 XML
- android - Android - 使用 ImageView scaleType = "centerCrop" accrording original Image 在视图上定义特定坐标 x 和 y
- mysql - 如何从 wordpress 表中获取 SQL 查询
- python - Django显示更改字段的值
- java - 应用重启后如何让服务继续工作
- spring-cloud - Spring Cloud 配置客户端未从配置服务器中选择值
- java - Java 中 HH:mm 或 HH:mm:ss 中逗号分隔时间的正则表达式,例如 12:00,13:03:21