python中常用的等待时间以及用法
4. 测试框架中的等待(如 pytest)在测试框架中,等待操作确保在测试过程中时间依赖项能够正常工作。用法示例:
·
在使用 Python 进行自动化或其他涉及时间控制的任务时,等待时间和定时操作是常见且重要的一部分。尤其在网络爬虫、Web 自动化、以及并发编程中,经常需要设置各种类型的等待时间。
常用的等待方法和用法
1. time.sleep(seconds)
标准库 time
中的 sleep
方法用于暂停程序执行一段时间。
用法示例:
import time
print("Waiting for 3 seconds...")
time.sleep(3)
print("Wait over!")
2. Web 自动化中的等待(以 Selenium 为例)
在 Web 自动化中,使用 Selenium 进行等待操作是非常普遍的。主要有以下几种等待方式:
a. 隐式等待 (Implicit Wait)
隐式等待告诉 WebDriver 每隔一段时间检查一次 DOM,在指定的时间范围内某个元素是否已经存在。如在时间范围内找到则继续执行,否则在超时后抛出 NoSuchElementException
异常。
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 10秒隐式等待
driver.get("https://example.com")
# 查找元素,如果元素在10秒内出现,将不再等待;
# 否则,超时抛出 NoSuchElementException 异常
element = driver.find_element_by_id("some_element")
b. 显式等待 (Explicit Wait)
显式等待使得 WebDriver 在找到某个元素之前等待某个条件。可以通过 WebDriverWait
整合 expected_conditions
进行条件等待。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com")
try:
# 作为条目,该代码等待一个元素在10秒内可见
element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "some_element"))
)
finally:
driver.quit()
c. Fluent Wait
Fluent Wait 提供了更灵活的等待配置,可以在等待时间内进一步配置轮询间隔和忽略的异常情况。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
wait = WebDriverWait(driver, 10, poll_frequency=1, ignored_exceptions=[TimeoutException])
try:
element = wait.until(
EC.visibility_of_element_located((By.ID, "some_element"))
)
finally:
driver.quit()
3. 异步编程中的等待 (Asyncio)
在并发编程中,特别是使用 asyncio
框架时,有异步等待操作。
用法示例:
import asyncio
async def say_hello():
print("Hello")
await asyncio.sleep(2)
print("World")
# 运行异步任务
asyncio.run(say_hello())
4. 测试框架中的等待(如 pytest)
在测试框架中,等待操作确保在测试过程中时间依赖项能够正常工作。
用法示例:
import pytest
import time
@pytest.mark.timeout(2) # 设置2秒的超时时间
def test_sleep_short():
time.sleep(1) # 这个测试会通过
assert True
@pytest.mark.timeout(2)
def test_sleep_long():
time.sleep(3) # 这个测试会失败,因为超时
assert True
应用场景
1. 网络爬虫
在网络爬虫中,常常需要对爬取的请求进行等待处理,避免过于频繁的请求导致被服务器屏蔽。
import time
import requests
url = 'https://example.com'
for i in range(5):
response = requests.get(url)
print(response.status_code)
time.sleep(2) # 每个请求之间等待2秒
2. Web 自动化
在 Web 自动化测试中,经常使用显式和隐式等待来处理动态加载的页面元素。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://example.com')
try:
# 显式等待,等待某个元素加载完成
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'some_element'))
)
element.click()
finally:
driver.quit()
3. 并发和异步编程
在处理并发操作时,异步等待有助于提高程序的效率。
import asyncio
async def fetch_data():
await asyncio.sleep(1)
print("Data fetched")
async def main():
tasks = [fetch_data() for _ in range(5)]
await asyncio.gather(*tasks)
asyncio.run(main())
总结
等待操作在编程中有广泛的应用,从简单的线程睡眠到复杂的 Web 自动化和异步编程等待。灵活运用这些等待方法,可以确保程序的健壮性和稳定性。
更多推荐
所有评论(0)