Selenium 等待 HTML 元素更改

Posted

技术标签:

【中文标题】Selenium 等待 HTML 元素更改【英文标题】:Selenium Wait Until HTML Element Changes 【发布时间】:2021-10-09 22:56:27 【问题描述】:

我正在尝试从网站上抓取预订数据。进入网站后,我必须:

    将默认日期范围(起初,网站显示默认日期范围的预订数据)更改为我要搜索的日期范围 点击“刷新”按钮 等待网站更新页面上显示的结果。

使用 Selenium、Python 和 BeautifulSoup,当我执行 Selenium 命令更新日期范围的字段并单击“刷新”按钮时,当代码到达我使用 BeautifulSoup 提取 html 数据的行时,提取的是默认网站日期范围的默认预订数据,而不是我填写的日期范围的预订数据。

根据观察,使用 Selenium 时该网站的移动速度似乎过快,无法提取更新的数据,这需要一些时间来加载。我尝试使用driver.implicitly_wait(5) 解决此问题,但这会返回高度不一致的结果。

我想检测一个允许稳定提取且没有错误的 HTML 元素。我意识到,当我单击“刷新”按钮时,这个特定元素...

<div id="textArea" style="visibility: visible; display: block;">

...更改为...

<div id="textArea" style="visibility: hidden; display: block;">

... 并变回 ...

<div id="textArea" style="visibility: visible; display: block;">

...当页面上的预订数据更新时。

是否有一个 Selenium 命令可以在进入我的 Python 代码的下一行之前检测到这种变化?例如,单击“刷新”按钮后,“等到 style=visibility 可见”命令?

【问题讨论】:

【参考方案1】:
while True:
    a = driver.find_element_by_id('textArea').get_attribute('style')
    if a == r"visibility: hidden; display: block;"
        break
    else:
        time.sleep(.05)
while True:
    a = driver.find_element_by_id('textArea').get_attribute('style')
    if a == r"visibility: visible; display: block;"
        break
    else:
        time.sleep(.05)

这将等到它变得不可见,然后在您的程序执行任何操作之前变为可见

【讨论】:

案例1:如果元素在给定的时间段内从可见变为隐藏然后隐藏变为可见怎么办(我相信在这里等待5秒)?更好的是,我们可以将其减少到尽可能少并尝试。案例 2:如果一个属性添加了一些超出上面列出的额外内容怎么办?我们可以让它动态化,只是为了检查隐藏和可见.. 对于第一个问题,您可能可以为第一个循环创建一个计时器,该循环会在 n 秒后中断。对于第二个问题,您应该只使用 html 的元素而不是更独特的 ID

以上是关于Selenium 等待 HTML 元素更改的主要内容,如果未能解决你的问题,请参考以下文章

python selenium中等待元素出现及等待元素消失操作

Python +selenium之设置元素等待

Python+Selenium笔记:元素等待机制

python+selenium2自动化---设置元素等待

python selenium等待特定网页元素加载完毕

python selenium系列元素等待