如何在 Python 中让 Selenium WebDriver 休眠几毫秒

How to sleep Selenium WebDriver in Python for milliseconds

提问人:AliRehman7141 提问时间:10/2/2018 最后编辑:Peter MortensenAliRehman7141 更新时间:1/26/2022 访问量:47130

问:

我正在我的脚本中使用该库:time

import time
time.sleep(1)

它可以让我的 Selenium WebDriver 休眠一秒钟,但怎么可能休眠 250 毫秒呢?

python selenium selenium-webdriver webdriver webdriverwait

评论

0赞 sa_leinad 9/20/2019
与此问题类似:如何让我的 Python 程序休眠 50 毫秒?
1赞 Peter Mortensen 2/7/2021
这与 Selenium WebDriver(?) 无关。这是关于 Python 中的睡眠,因此可能有无数重复的问题(超过 10 年)。对此的规范是:如何让我的 Python 程序休眠 50 毫秒? (尽管没有一个答案真正解决了亚秒睡眠时间分辨率为 16.66 毫秒的常见问题) - 在这种特殊情况下可能不是问题。
0赞 Amin 1/28/2022
在一般 CPU 上以过高的精度计算时间是很困难的(如果不是不可能的话),因此一秒是可以以合理精度测量的时间。如果您想要不到一秒钟的小停顿,也许打开/关闭磁盘上的小文件大约需要这个时间。

答:

5赞 NPE 10/2/2018 #1

time.sleep()采用浮点参数:

time.sleep(0.25)

文档(它们值得一读,尤其是因为它们解释了睡眠最终可能比预期更短或更长的条件)。

3赞 Nouman 10/2/2018 #2

如果您希望它在几毫秒内进入睡眠状态,请使用浮点值:

import time
time.sleep(0.25)

#0.25 > 250ms
#0.1  > 100ms
#0.05 > 50ms
24赞 undetected Selenium 10/2/2018 #3

暂停 webdriver 的执行几毫秒,您可以传递或按如下方式执行:number of secondsfloating point number of seconds

import time
time.sleep(1) #sleep for 1 sec
time.sleep(0.25) #sleep for 250 milliseconds

但是,在使用 SeleniumWebDriver for Automation 时,在没有任何特定条件的情况下使用 time.sleep(secs) 来实现违背了自动化的目的,应不惜一切代价避免。根据文档:

time.sleep(secs) 在给定的秒数内暂停当前线程的执行。该参数可以是浮点数,以指示更精确的睡眠时间。实际暂停时间可能小于请求的时间,因为任何捕获的信号都将在执行该信号的捕获例程后终止 sleep()。此外,由于系统中安排了其他活动,暂停时间可能比任意金额要求的时间长。


因此,根据讨论,您应该将 WebDriverWait() 与 expected_conditions() 结合使用来验证元素的状态,并且三个广泛使用的expected_conditions如下:time.sleep(sec)

presence_of_element_located

presence_of_element_located(定位器)定义如下:

class selenium.webdriver.support.expected_conditions.presence_of_element_located(locator)

Parameter : locator - used to find the element returns the WebElement once it is located

Description : An expectation for checking that an element is present on the DOM of a page. This does not necessarily mean that the element is visible or interactable (i.e. clickable). 

visibility_of_element_located

visibility_of_element_located(定位器)定义如下:

class selenium.webdriver.support.expected_conditions.visibility_of_element_located(locator)

Parameter : locator -  used to find the element returns the WebElement once it is located and visible

Description : An expectation for checking that an element is present on the DOM of a page and visible. Visibility means that the element is not only displayed but also has a height and width that is greater than 0.

element_to_be_clickable

element_to_be_clickable(定位器)定义如下:

class selenium.webdriver.support.expected_conditions.element_to_be_clickable(locator)

Parameter : locator - used to find the element returns the WebElement once it is visible, enabled and interactable (i.e. clickable).

Description : An Expectation for checking an element is visible, enabled and interactable such that you can click it. 

参考

您可以在 WebDriverWait 无法按预期工作中找到详细讨论

评论

1赞 PixelEinstein 10/4/2018
很好地解释了睡眠和你应该用什么来代替睡眠。当我第一次开始使用 selenium 时,我曾经使用 sleep 来帮助加载时间,但在使用 之后,我的 selenium 脚本更加稳定并且需要更少的维护。好信息!expected_conditions
0赞 Corvus 4/8/2020
不惜一切代价避免睡眠太强烈了,并且会假设在极少数情况下,最短的完成时间是优先事项。事实上,我几乎永远不会写一个硒自动机,除非有大量的睡眠。如果你不这样做,你就有可能使CPU/驱动器/网络使用率达到最大化,这通常是一件坏事。相反,如果你放慢一切速度,你将能够更好地管理你的资源,而且你在网络服务器上的负载也大大减少。
1赞 fam 1/26/2022 #4

从理论上讲,需要等待 250 毫秒。但是,实际等待时间可能更短或更长,而不是精确的 250 毫秒。这是因为:time.sleep(0.25)

实际暂停时间可能小于请求的时间,因为任何捕获的信号都将在执行该信号的捕获例程后终止 sleep()。此外,由于系统中安排了其他活动,暂停时间可能比任意金额要求的时间长。

使用硒的等待的其他方法包括:

  1. 隐式等待:driver.implicitly_wait(0.25)
  2. 显式等待:WebDriverWait(driver).until(document_initialised)