前言
playwright 默认全局的导航时间是30秒,查找元素超时也是30秒, 有以下几个方法设置全局超时时间:
- browser_context.set_default_navigation_timeout()
- browser_context.set_default_timeout()
- page.set_default_navigation_timeout()
- page.set_default_timeout()
导航超时设置
当访问的网页加载很慢时
代码语言:javascript复制from playwright.sync_api import sync_playwright, expectwith sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
page = context.new_page() # 访问浏览器页面
page.goto('https://www.cnblogs.com/')
会报一个超时的异常:TimeoutError: Timeout 30000ms exceeded.
代码语言:javascript复制playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.
=========================== logs ===========================
navigating to "https://www.cnblogs.com/", waiting until "load"
============================================================
可以在goto() 访问网站的时候设置timeout超时时间
代码语言:javascript复制 # 访问浏览器页面
page.goto('https://www.cnblogs.com/', timeout=10000)
也可以设置全局超时
代码语言:javascript复制from playwright.sync_api import sync_playwright, expectwith sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context() # 设置全局40秒超时
context.set_default_navigation_timeout(40000)
page = context.new_page() # 访问浏览器页面
page.goto('https://www.cnblogs.com/')
设置全局导航超时
set_default_navigation_timeout 设置的时间只对以下方法有效:
- page.go_back()
- page.go_forward()
- page.goto()
- page.reload()
- page.set_content()
- page.expect_navigation()
设置全局超时有2种方式: 方式1.在context对象设置全局导航页面超时
代码语言:javascript复制# context
context.set_default_navigation_timeout(40000)
方式2.在page对象设置全局导航页面超时
代码语言:javascript复制# page 页面对象超时 20秒page.set_default_navigation_timeout(20000)
如果goto()和page对象,context 对象都有设置超时时间
代码语言:javascript复制from playwright.sync_api import sync_playwright, expect
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context()
# 设置全局context 40秒超时
context.set_default_navigation_timeout(40000)
page = context.new_page()
# page 页面对象超时 20秒
page.set_default_navigation_timeout(20000)
# 访问浏览器页面
page.goto('https://www.cnblogs.com/', timeout=1000)
那么goto()设置的优先级大于page对象,page对象设置的大于context对象设置的超时时间。
设置操作元素超时
默认情况下,操作元素时,查找元素超时时间是30秒
代码语言:javascript复制 # 操作元素
page.locator('text=找不到元素').click()
点击元素时,找不到会报超时异常TimeoutError: Timeout 30000ms exceeded.
代码语言:javascript复制playwright._impl._api_types.TimeoutError: Timeout 30000ms exceeded.
=========================== logs ===========================
waiting for locator("text=找不到元素")
============================================================
可以针对单次操作click() 方法传timeout 参数
代码语言:javascript复制page.locator('text=找不到元素').click(timeout=1000)
设置全局操作元素timeout 超时
代码语言:javascript复制 context = browser.new_context()
context.set_default_timeout(3000)
page = context.new_page()
page.set_default_timeout(2000)
与前面设置导航超时时间一样,也是可以在context 和page对象设置timeout。 优先级:单次操作设置的timeout > page.set_default_timeout() > context.set_default_timeout()
需注意的是:set_default_timeout设置的时间不仅仅对操作元素有效,对前面的页面导航也会生效。
set_default_timeout 与 set_default_navigation_timeout 优先级: page.set_default_navigation_timeout() > page.set_default_timeout() > browser_context.set_default_navigation_timeout() > browser_context.set_default_timeout()