python+playwright 学习-79 设置全局导航超时和全局查找元素超时

2023-09-11 19:36:35 浏览数 (2)

前言

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()

0 人点赞