Python Playwright 自动等待和断言详解
Python Playwright 是一个用于自动化测试的 Python 库,它可以对 web 程序进行操作及断言,同时它还内置了自动等待能力,可以有效地避免因为页面异步处理或延迟加载导致的时间差问题。
自动等待
在爬取网页或进行自动化测试时,通常会出现下面的情况:
- 页面可能正在进行异步处理或延迟加载,需要等待一段时间才能获取到想要的元素;
- 页面加载速度较慢,需要等待几秒钟才能保证页面顺利加载完成。
在这些情况下,如果我们使用传统的 time.sleep() 函数等待一段固定的时间,那么很可能会出现以下问题:
- 页面的加载速度不够快,等待时间不够长,导致元素没有被正确加载;
- 页面的加载速度很快,等待时间过长,导致浪费时间。
针对这些问题,Python Playwright 提供了自动等待的能力。
等待元素出现
当我们想要爬取的元素需要等待一段时间才能出现时,我们可以使用 wait_for_selector
方法,传入要等待的元素选择器和等待时间,Python Playwright 会在指定的时间内等待元素出现,并且返回元素对象,否则抛出 TimeoutError
异常。
示例:
from playwright.sync_api import Playwright, sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://example.com')
element_handle = page.wait_for_selector('h1', timeout=5000)
print(element_handle.text_content())
browser.close()
在上述代码中,页面首先打开 https://example.com
,指定了最长等待时间 5000ms,然后等待页面出现 h1
标题元素,在元素出现后返回元素对象并输出元素的文本内容。
等待网络请求完成
在某些网页中,页面中的元素可能是通过 ajax 请求来动态生成的,如果我们要爬取这些元素,就需要等待这些网络请求完成之后再进行爬取。这时我们可以使用 wait_for_request
方法,传入要等待的请求的 URL,Python Playwright 会在请求完成之后返回请求对象。
示例:
from playwright.sync_api import Playwright, sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://example.com')
element = page.wait_for_selector('#my-button')
element.click()
request = page.wait_for_request('https://example.com/download', timeout=5000)
with open('downloaded_file.txt', 'wb') as f:
f.write(request.response.body())
browser.close()
在上述代码中,页面中有一个下载按钮(即 #my-button
),我们等待这个元素出现后点击它,然后等待 URL 为 https://example.com/download
的网络请求完成,并将其响应的内容写入文件中。
断言
在自动化测试中,断言是非常重要的一个环节。Python Playwright 提供了方便的方法进行元素的断言,方便我们对页面进行验证。
判断元素是否存在
判断元素是否存在和断言元素的存在类似,我们可以使用 wait_for_selector
方法,但是这次我们加入了 state='attached'
的限制,这样 wait_for_selector
方法就会在元素存在时返回该元素对象,否则抛出 TimeoutError
异常。
示例:
from playwright.sync_api import Playwright, sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://google.com')
assert page.wait_for_selector('input[name="q"]', state='attached')
browser.close()
在上述代码中,页面首先打开 https://google.com
,然后断言页面上是否存在 input
标签的 name
属性为 q
的元素。
判断元素属性是否符合预期
为了保证网页的正确性,我们需要检查元素的一些属性是否符合预期。Python Playwright 提供了 expect_element_state
方法对元素进行验证。
示例:
from playwright.sync_api import Playwright, sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://example.com')
button = page.wait_for_selector('button')
button.click()
assert button.expect_state(
"visible",
"Interactable",
"Enabled",
"HasClass",
"HasText",
"Value=Click me"
)
browser.close()
在上述代码中,页面首先打开 https://example.com
,然后等待页面中的按钮出现,并点击该按钮。然后使用 expect_state
方法,检查按钮是否 visible
、可点击(Interactable
)、可用(Enabled
)、样式是否为 HasClass
、文本内容为 HasText
、value 值为 Value=Click me
。如果这些条件全部都满足,那么断言成功,否则断言失败。
结语
通过本文的介绍,我们了解了如何使用 Python Playwright 进行自动等待和断言。自动等待让我们的脚本更加健壮,而断言则能够保证我们对网页的验证和测试的准确性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python playwright 自动等待和断言详解 - Python技术站