Python Playwright教程(1):Page页面操作详解

Python + Playwright(1):Page 页面操作[详细介绍]

  • 概述
  • Page常用方法
  • 1. 导航和页面操作API
  • 2. 页面元素定位和交互API
  • 3. 页面内容获取API
  • 4. 页面事件和等待API
  • 5. JavaScript 执行和脚本处理API
  • 6. 网络请求和拦截处理API
  • 7. 期待特定事件或条件发生API
  • 8. 其他操作API
  • 概述

    Playwright 提供了丰富的页面操作功能,通过 page 对象可以实现对网页的导航、元素定位、交互、页面事件监测等操作。

    page 对象是 Playwright 中表示页面的核心对象,它允许我们控制和操作浏览器中的页面。

    Page常用方法

    Page类的常用方法包括的API类别如下:

    1. 导航和页面操作API:控制浏览器的导航行为,如 goto 跳转到新页面,reload 重新加载当前页面,go_backgo_forward 在历史记录中前进和后退。

    2. 页面元素定位和交互API:提供了 clickfilltype 等方法,模拟用户与页面元素的交互,以及 locator 用于通过 CSS 选择器、XPath 等定位页面元素。

    3. 页面内容获取API:通过 content 获取页面的 HTML 内容,title 获取页面标题,screenshot 进行页面截图,以及 pdf 生成页面的 PDF。

    4. 页面事件和等待API:使用 wait_for_event 等待页面上的特定事件,wait_for_load_state 等待页面加载到特定状态,以及 expect_event 期待事件的发生。

    5. JavaScript 执行和脚本处理APIevaluate 在页面上下文中执行 JavaScript 并获取结果,evaluate_handle 执行脚本并返回一个 JSHandle 对象,允许进一步操作。

    6. 网络请求和拦截处理APIroute 拦截网络请求,unroute 取消拦截,以及 requestresponsewebsocket 相关的 API 来处理网络交互。

    7. 期待特定事件或条件发生APIexpect 系列 API 允许等待页面上特定条件的满足,如 expect_navigationexpect_console_message 等。

    8. 其他操作API:包括设置页面的 HTTP 头、模拟媒体类型、自定义导航和操作超时等,如 set_extra_http_headersemulate_mediaset_default_navigation_timeout

    1. 导航和页面操作API

  • page.goto(url, **kwargs): 导航到指定的 URL。
  • page.go_back(): 后退到浏览器历史记录中的上一页。
  • page.go_forward(): 前进到浏览器历史记录中的下一页。
  • page.reload(**kwargs): 重新加载当前页面。
  • page.set_content(html, **kwargs): 设置页面的 HTML 内容。
  • page.opener(): 返回新的 Page 实例,表示打开当前页面的页面。
  • page.wait_for_timeout(timeout): 暂停执行一段时间。
  • page.bring_to_front(): 将页面置于浏览器前台。
  • page.set_viewport_size(width, height): 设置页面视口大小。
  • page.close(): 关闭页面。
  • 代码示例如下:

    2. 页面元素定位和交互API

  • page.locator(selector): 创建一个定位器,用于查找页面元素。
  • page.click(selector, **kwargs): 点击页面元素。
  • page.fill(selector, value, **kwargs): 向表单元素填充值。
  • page.drag_and_drop(source, target, **kwargs): 拖拽元素从源位置到目标位置。
  • page.frame(url=None, name=None): 返回新的 Frame 实例。
  • page.frame_locator(selector): 使用选择器返回新的 Frame 实例。
  • 代码示例如下:

    请注意,上述代码中的选择器(如 ‘button’, ‘#inputField’, ‘.draggable’, ‘.target’, ‘iframe’)是示例选择器,需要根据实际页面的元素来替换它们。

    3. 页面内容获取API

  • page.title(): 获取当前页面的标题。
  • page.content(): 获取当前页面的 HTML 内容。
  • page.screenshot(**kwargs): 对页面进行截图。
  • page.pdf(**kwargs): 生成页面的 PDF 版本。
  • 代码示例如下:

    4. 页面事件和等待API

  • page.wait_for_load_state(state=None, timeout=None): 等待页面加载状态变为指定状态。
  • page.wait_for_url(url, timeout=None): 等待 URL 变为指定值。
  • page.wait_for_event(event, predicate=None, timeout=None): 等待特定事件发生。
  • page.wait_for_function(page_function, *args, timeout=None, force_expr=False, polling=None): 等待函数执行。
  • 代码示例如下:

    5. JavaScript 执行和脚本处理API

  • page.evaluate(page_function, *args, force_expr=False): 在页面上下文中执行 JavaScript 代码并返回结果。
  • page.evaluate_handle(page_function, *args, force_expr=False): 在页面上下文中执行 JavaScript 代码并返回 JSHandle 对象。
  • page.add_init_script(script, **kwargs): 添加一个初始化脚本,将在每次新页面加载时执行。
  • page.add_script_tag(url=None, path=None, content=None): 向页面添加一个 script 标签,可以是 URL、文件路径或者直接提供脚本内容。
  • page.add_locator_handler(name, script=None, handler=None): 添加一个定位器处理程序,允许使用自定义定位器。
  • page.add_style_tag(url=None, path=None, content=None): 向页面添加一个 style 标签,可以是 URL、文件路径或者直接提供样式内容。
  • page.expose_binding(name, callback): 公开绑定,使得 JavaScript 环境可以调用 Python 中的函数。
  • page.expose_function(name, callback): 公开函数,使得 JavaScript 环境可以调用 Python 中的函数。
  • 代码示例如下:

    from playwright.sync_api import sync_playwright, Playwright
    
    def run(playwright: Playwright) -> None:
        browser = playwright.chromium.launch(headless=False)
        page = browser.new_page()
      
        page.add_script_tag(content="window.addScriptTagTest = true;")     # 向页面添加一个 script 标签
        page.add_style_tag(content="body { background-color: #f0f0f0; }")   # 向页面添加一个 style 标签    
        page.add_init_script("console.log('Initialization script loaded');") # 添加一个初始化脚本,将在每次新页面加载时执行
        
        # 公开一个 Python 函数到页面的 JavaScript 环境中
        def greet(name):
            return f"Hello, {name}!"
        page.expose_binding("greet", greet)
    
        # 导航到指定的URL
        page.goto("https://example.com")   
      
        # 在页面上下文中执行 JavaScript 代码并返回结果
        result = page.evaluate("() => document.title")
        print(f"页面标题是: {result}")
      
        # 在页面上下文中执行 JavaScript 代码并返回 JSHandle 对象
        handle = page.evaluate_handle("() => document.body")
        body_content = handle.json_value()
        handle.dispose()  # 记得释放handle资源
        print(f"页面body内容是: {body_content}")
        
        # 使用自定义定位器处理程序
        page.add_locator_handler("myCustomSelector", script="return document.querySelector('.my-selector')")
       
        # 然后可以使用自定义的定位器来查找元素
        custom_element = page.locator("myCustomSelector")
        custom_element.click()
    
    
    with sync_playwright() as playwright:
        run(playwright)
    

    6. 网络请求和拦截处理API

  • page.route(url, handler): 拦截并路由给定 URL 的请求。
  • page.route_from_har(entries): 使用 HAR(HTTP 归档文件格式)中的条目设置路由规则。
  • page.unroute(url=None): 取消对指定 URL 的请求拦截。
  • page.unroute_all(): 取消所有请求的拦截。
  • 代码示例如下:

    from playwright.sync_api import sync_playwright, Playwright
    
    def handle_request(route, request):
        # 可以在这里修改请求头、响应等
        # 例如,我们打印请求的 URL 并继续路由
        print(f"Intercepted request to {request.url}")
        route.continue_()
        # 如果你想修改响应,可以使用 route.fulfill 方法
        # route.fulfill(method="GET", path=request.url, headers={"Content-Type": "text/plain"}, body="Modified response")
    
    def run(playwright: Playwright) -> None:
        # 创建浏览器实例,非无头模式
        browser = playwright.chromium.launch(headless=False)
        # 创建页面实例
        page = browser.new_page()
        
        # 拦截特定的 URL 请求
        page.route('**', handle_request)
        
        # 导航到指定的URL
        page.goto("https://example.com")
        
        # ... 其他操作 ...
        
        # 取消对指定 URL 的请求拦截
        # page.unroute('https://example.com')
        
        # 取消所有请求的拦截
        # page.unroute_all()
    
    with sync_playwright() as playwright:
        run(playwright)
    

    7. 期待特定事件或条件发生API

  • page.expect_console_message(text=None, predicate=None, timeout=None): 期待控制台消息。
  • page.expect_download(**kwargs): 期待下载。
  • page.expect_event(event, predicate=None, timeout=None): 期待特定事件。
  • page.expect_file_chooser(predicate=None, timeout=None): 期待文件选择器。
  • page.expect_popup(**kwargs): 期待弹出窗口。
  • page.expect_request(url=None, predicate=None, timeout=None): 期待特定请求。
  • page.expect_request_finished(url=None, predicate=None, timeout=None): 期待特定请求完成。
  • expect_response(url=None, predicate=None, timeout=None): 期待特定响应。
  • page.expect_websocket(url=None, predicate=None, timeout=None): 期待 WebSocket 连接。
  • page.expect_worker(url=None, predicate=None, timeout=None): 期待工作线程。
  • 代码示例如下:

    from playwright.sync_api import sync_playwright, Playwright
    
    def run(playwright: Playwright) -> None:
        browser = playwright.chromium.launch(headless=False)
        page = browser.new_page()
        page.goto("https://example.com")
        # 期待控制台消息包含特定的文本
        page.expect_console_message(lambda message: "Error" in message.text)
        # 期待下载开始
        download = page.expect_download()
        # 期待特定事件发生,例如 'load'
        page.expect_event("load")
        # 期待文件选择器出现
        file_chooser = page.expect_file_chooser()
        # 期待弹出窗口
        popup = page.expect_popup()
        # 期待特定请求
        request = page.expect_request("https://example.com/data")
        # 期待请求完成
        response = page.expect_request_finished()
        # 期待特定响应
        response = page.expect_response(lambda response: response.status == 200)
        # 期待 WebSocket 连接
        ws = page.expect_websocket("wss://example.com/ws")
        # 期待工作线程
        worker = page.expect_worker()
    
    with sync_playwright() as playwright:
        run(playwright)
    

    8. 其他操作API

  • page.set_default_navigation_timeout(timeout): 设置默认的页面导航超时时间。
  • page.set_default_timeout(timeout): 设置默认的操作超时时间。
  • page.set_extra_http_headers(headers): 设置额外的 HTTP 请求头。
  • page.set_content(html, **kwargs): 设置页面内容。
  • page.emulate_media(media=None, **kwargs): 模拟媒体类型
  • 代码示例如下:

    from playwright.sync_api import sync_playwright, Playwright
    
    def run(playwright: Playwright) -> None:
        browser = playwright.chromium.launch(headless=False)
        page = browser.new_page()
        
        # 设置默认的页面导航超时时间为 60 秒
        page.set_default_navigation_timeout(60000)
        # 设置默认的操作超时时间为 30 秒
        page.set_default_timeout(30000)
        # 设置额外的 HTTP 请求头,例如自定义 User-Agent
        headers = {
            "User-Agent": "Playwright Custom User-Agent"
        }
        page.set_extra_http_headers(headers)
        # 导航到指定的URL
        page.goto("https://example.com")
        # 设置页面内容
        page.set_content("<html><body><h1>自定义页面内容</h1></body></html>")
        # 模拟媒体类型,例如打印
        page.emulate_media(media="print")
        
    with sync_playwright() as playwright:
        run(playwright)
    

    作者:blues_C

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python Playwright教程(1):Page页面操作详解

    发表回复