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

本文详细介绍了Playwright库中Page对象的各种操作,包括导航、元素定位与交互、页面内容获取、事件等待、JavaScript执行、网络请求拦截以及期待特定事件等,帮助开发者高效地进行浏览器自动化和页面操作.
摘要由CSDN通过智能技术生成

概述

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)
  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blues_C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值