如何在使用 Selenium 和 Python 调用函数之前等待特定 URL 加载

Posted

技术标签:

【中文标题】如何在使用 Selenium 和 Python 调用函数之前等待特定 URL 加载【英文标题】:How to wait for a specific URL to load before calling a function using Selenium and Python 【发布时间】:2020-05-01 02:48:36 【问题描述】:

这是我第一次在 *** 上发帖,我对 Selenium 和 Python 还有些陌生。

当 URL 等于 fx:https://www.example.com 时,我不想运行函数。

我在另一个讨论中阅读了this 的答案,但我不太明白发生了什么。

希望您能花时间回答我的问题。

好的,所以我刚刚尝试过:

driver.get('https://www.google.com')
time.sleep(4)
driver.get('https://www.***.com')

if WebDriverWait(driver, 10).until(EC.url_to_be('https://***.com')):
    print('Desired url was rendered within allocated time')
else:
    print('Desired url was not rendered within allocated time')

但它没有工作。有什么想法吗? 控制台说

Traceback (most recent call last):
  File "/Users/holger/PycharmProjects/waitTest/wait.py", line 15, in <module>
    if WebDriverWait(browser, 10).until(EC.url_to_be('https://www.***.com')):
  File "/Users/holger/PycharmProjects/waitTest/venv/lib/python3.8/site-packages/selenium/webdriver/support/wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: 

【问题讨论】:

如果这是一个个人项目,并且您希望在有人访问 URL 时运行一些代码,您可以考虑使用 Python Flask,这也很酷。 不,我不希望程序在前一个网站重定向到另一个网站时运行一个功能,该程序应该执行一项任务。所有这些都在 webdriver 上运行。 您导航到“***.com”,然后等待 URL 等于“***.com”...这不是同一个 URL。您是否尝试过在两个地方使用相同的网址? 我尝试修复它,但仍然打印错误消息。 @Holger 找到解决方案了吗,请更新。我也面临同样的问题 【参考方案1】:

如果您的用例是在 url 等于 https://www.example.com 时运行一个函数,则您会诱导 WebDriverWait 与以下任一 expected_conditions 结合使用:

url_changes(url): 期望检查当前 url 不能完全匹配。

WebDriverWait(driver, 30).until(EC.url_changes("https://www.example.com"))

url_contains(url):期望当前页面的 URL 包含特定文本。

WebDriverWait(driver, 30).until(EC.url_contains("example"))

url_matches(pattern):期望 URL 匹配特定的正则表达式。

WebDriverWait(driver, 30).until(EC.url_matches("a_matching_pattern_of_the_expected_url"))

url_to_be(url):期望当前页面的 URL 是一个特定的 url。

WebDriverWait(driver, 30).until(EC.url_to_be("https://www.example.com"))

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

但是,WebDriverWait 与上述expected_conditions 一起可能无法保证DOM Tree 中的所有元素都已完全加载。

您可以在Do we have any generic function to check if page has completely loaded in Selenium找到详细讨论


更新

如果WebDriverWait 返回True,要运行函数,您可以使用以下解决方案:

try:
    WebDriverWait(driver, 30).until(EC.url_to_be("https://www.example.com")))
    print("Desired url was rendered with in allocated time")
    # now you can call the method/function
    # test_me("Holger")
except TimeoutException:
    print("Desired url was not rendered with in allocated time")

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

参考

您可以在以下位置找到相关的详细讨论:

How to Wait for a Redirect Chain to Settle using Selenium WebDriver where final page loaded is not predictable?

【讨论】:

你能举一个用例的例子来说明这些应该如何使用吗? @Holger 查看更新的答案并让我知道状态。 如果函数返回 True,我该如何运行? @Holger 查看更新的答案并让我知道状态。 您无缘无故地从文档中转储了所有与 url 相关的 EC 方法,然后使用了与 OP 相同的 EC...这应该如何解决问题?

以上是关于如何在使用 Selenium 和 Python 调用函数之前等待特定 URL 加载的主要内容,如果未能解决你的问题,请参考以下文章

Python 的selenium打包成程序后,电脑里没有安装chrom浏览器,如何运行?

使用python+selenium对12306车票数据读取

如何使用 python 和 Selenium 将 cookie 保存在浏览器中

如何使用Selenium和Python在网站内的页面中导航?

如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]

如何使用Python和Selenium分页来抓取页面