Playwright Python 教程:网页自动化

1. 常用工具简介及对比

主流网页自动化工具对比

工具支持语言浏览器支持特点适用场景
PlaywrightPython, JS, .NETChromium, Firefox, WebKit跨浏览器、速度快、API简洁自动化测试、爬虫、网页操作
Selenium多语言所有主流浏览器历史悠久、社区大传统自动化测试、兼容性测试
PuppeteerJavaScriptChromiumChrome官方工具、性能好Chrome相关开发、爬虫
CypressJavaScriptChromium, Firefox专注于测试、内置断言库前端测试

Playwright优势

  • 支持所有现代浏览器

  • 自动等待机制完善

  • 可以拦截修改网络请求

  • 提供设备模拟功能

  • 支持移动端网页测试

2. 安装及自动生成代码

安装步骤

# 安装Python包
pip install playwright# 安装浏览器二进制文件
playwright install

自动生成代码

Playwright提供代码生成工具,可以录制操作并生成代码:

# 启动代码生成器
playwright codegen https://example.com

这会打开浏览器窗口和代码编辑器,你的操作会被实时转换为代码。

3. 基本思路及对象介绍

Playwright核心对象

  1. Browser:对应一个浏览器实例

  2. BrowserContext:独立的会话上下文(类似隐身模式)

  3. Page:单个标签页或弹出窗口

  4. Frame:页面中的iframe

  5. Locator:元素定位器

基本工作流程

  1. 启动浏览器

  2. 创建页面

  3. 导航到目标URL

  4. 定位页面元素

  5. 执行操作

  6. 提取数据

  7. 关闭浏览器

4. 打开浏览器

基本启动方式

from playwright.sync_api import sync_playwrightwith sync_playwright() as p:# 启动Chromium浏览器(显示界面)browser = p.chromium.launch(headless=False)# 创建新页面page = browser.new_page()# 在这里添加操作代码# 关闭浏览器browser.close()

不同浏览器启动

# Firefox
browser = p.firefox.launch()# WebKit (Safari的渲染引擎)
browser = p.webkit.launch()

浏览器配置选项

browser = p.chromium.launch(headless=False,  # 显示浏览器窗口slow_mo=1000,    # 操作间延迟(毫秒),方便观察args=["--start-maximized"],  # 启动参数channel="chrome"  # 使用Chrome而非Chromium
)

5. 访问、等待、定位

访问页面

# 基本访问
page.goto("https://example.com")# 带选项的访问
page.goto("https://example.com", timeout=10000, wait_until="networkidle")

等待策略

# 等待元素出现
page.wait_for_selector(".result")# 等待导航完成
page.click("a.link")
page.wait_for_url("**/target-page")# 等待函数返回True
page.wait_for_function("document.readyState === 'complete'")# 隐式等待(Playwright自动处理)

元素定位

推荐使用新的定位器API:

# 通过文本定位
page.get_by_text("Submit").click()# 通过角色定位
page.get_by_role("button", name="Sign in").click()# 通过标签文本定位
page.get_by_label("Username").fill("admin")# 通过占位文本定位
page.get_by_placeholder("Enter your email").fill("test@example.com")# 传统CSS/XPath选择器
page.locator("button#submit").click()
page.locator("xpath=//button[@id='submit']").click()

6. 动作

基本交互

# 点击
page.get_by_text("Click me").click()
page.get_by_role("button").click(button="right")  # 右键点击# 输入
page.get_by_label("Username").fill("admin")
page.get_by_label("Password").fill("password")# 键盘操作
page.get_by_label("Search").press("Enter")# 鼠标移动
page.get_by_text("Menu").hover()# 拖放
page.locator("#item").drag_to(page.locator("#target"))

表单操作

# 选择单选按钮
page.get_by_label("Agree").check()# 选择复选框
page.get_by_label("Subscribe").set_checked(True)# 选择下拉选项
page.get_by_label("Country").select_option("China")# 上传文件
page.get_by_label("Upload file").set_input_files("myfile.pdf")# 日期选择
page.get_by_label("Birthday").fill("1990-01-01")

7. 内容解析

获取文本内容

# 获取单个元素文本
title = page.locator("h1").text_content()# 获取多个元素文本
items = page.locator(".item").all()
for item in items:print(item.text_content())

获取属性

# 获取属性值
href = page.locator("a").get_attribute("href")# 获取输入框值
value = page.locator("input").input_value()

获取HTML和截图

# 获取整个页面HTML
html = page.content()# 获取元素内部HTML
inner_html = page.locator("div.container").inner_html()# 截图
page.screenshot(path="screenshot.png")# 元素截图
page.locator(".header").screenshot(path="header.png")

执行JavaScript获取数据

# 执行JavaScript获取数据
data = page.evaluate("""() => {return {title: document.title,width: window.innerWidth}
}""")
print(data["title"])

8. 案例

案例1:自动登录并截图

from playwright.sync_api import sync_playwrightdef auto_login():with sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()# 访问登录页page.goto("https://example.com/login")# 填写登录表单page.get_by_label("Username").fill("testuser")page.get_by_label("Password").fill("password123")page.get_by_role("button", name="Login").click()# 等待登录成功page.wait_for_url("**/dashboard")# 截图保存page.screenshot(path="dashboard.png")# 获取欢迎信息welcome = page.get_by_text("Welcome,").text_content()print(welcome)browser.close()auto_login()

案例2:爬取商品列表

from playwright.sync_api import sync_playwright
import csvdef scrape_products():with sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()page.goto("https://example.com/products")products = []# 获取所有商品元素items = page.locator(".product-item").all()for item in items:product = {"name": item.locator(".product-name").text_content(),"price": item.locator(".price").text_content(),"link": item.locator("a").get_attribute("href")}products.append(product)# 保存到CSVwith open("products.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=["name", "price", "link"])writer.writeheader()writer.writerows(products)browser.close()scrape_products()

案例3:处理动态加载内容

from playwright.sync_api import sync_playwright
import timedef scrape_infinite_scroll():with sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()page.goto("https://example.com/infinite-scroll")# 获取初始项目数items = page.locator(".item")last_count = items.count()while True:# 滚动到底部page.evaluate("window.scrollTo(0, document.body.scrollHeight)")# 等待新内容加载time.sleep(2)  # 简单等待,实际项目应该用wait_for_selector# 检查是否加载了新内容new_count = items.count()if new_count == last_count:break  # 没有新内容了last_count = new_count# 提取所有内容all_items = items.all()for item in all_items:print(item.text_content())browser.close()scrape_infinite_scroll()

案例4:下载文件

from playwright.sync_api import sync_playwrightdef download_file():with sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()# 监听下载事件with page.expect_download() as download_info:page.goto("https://example.com/download")page.click("#download-button")download = download_info.valueprint(f"Downloading: {download.url}")# 保存文件path = download.path()download.save_as("downloaded_file.pdf")print(f"File saved to: {path}")browser.close()download_file()

这些案例展示了Playwright在网页自动化中的常见应用场景。根据实际需求,你可以组合这些基本操作来实现更复杂的自动化任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89099.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态数组:ArrayList的实现原理

动态数组:ArrayList的实现原理 大家好!今天我们来聊聊Java集合框架中一个非常重要的数据结构——ArrayList。就像我们日常生活中使用的伸缩收纳盒一样,ArrayList可以根据需要自动调整大小,既方便又高效。那么它是如何实现这种&quo…

MIPI DSI(五) DBI 和 DPI 格式

关于 DBI 和 DPI 这两种格式的详细协议内容,请参考《MIPI Alliance Standard for Display Bus Interface(V2.0) .pdf》和《MIPI Alliance Standard for Display Pixel Interface(DPI- 2) .pdf》这两份文档。首先先了解…

FRP Ubuntu 服务端 + MacOS 客户端配置

一、服务端配置 1、下载frp并解压 # 创建目录并进入 mkdir -p /opt/frp && cd /opt/frp # 下载最新版(替换URL为GitHub发布页最新版本) wget https://github.com/fatedier/frp/releases/download/v0.59.0/frp_0.59.0_linux_amd64.tar.gz # 解压 …

Video Python(Pyav)解码二

在 PyAV 中,input_container.decode() 和 input_container.demux() 是两种处理视频流数据的不同方法,它们分别适用于不同的场景。下面通过代码示例和对比来详细说明它们的用法和区别。1. input_container.decode()功能直接解码:从容器中读取数…

闲庭信步使用图像验证平台加速FPGA的开发:第十六课——图像五行缓存的FPGA实现

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程…

头文件与源文件及区别

使用场景上的区别头文件:变量的声明,函数的声明,宏的定义,类的定义等。 源文件:变量的定义。函数的定义实现,类成员函数的定义实现等。这样方便于我们去管理、规划,更重要的是避免了重定义的问题…

图机器学习(4)——图机器学习与嵌入算法

图机器学习(4)——图机器学习与嵌入算法0. 前言1. 图机器学习1.1 机器学习基本原理1.2 图机器学习的独特优势2. 广义图嵌入问题3. 图嵌入算法分类小结0. 前言 机器学习是人工智能的一个重要分支,它致力于让系统能够从数据中自主学习并持续优…

网络基础10--ACL与包过滤

一、ACL 定义与核心功能ACL(访问控制列表)是通过规则匹配实现数据包过滤或分类的核心技术,广泛应用于包过滤、NAT、QoS、路由策略等场景。其核心由规则条目组成,每条规则包含匹配条件(如源 / 目 IP、端口、协议&#x…

Web安全 - 基于 SM2/SM4 的前后端国产加解密方案详解

文章目录概述一、背景与法规要求二、算法选型三、核心流程四、前端实现要点(伪代码)五、后端实现要点(伪代码)六、公钥存储策略七、全流程示例图八、总结与最佳实践推荐概述 随着信息安全法规日益严格,如《网络安全法》《数据安全法》和等保…

ACL动态路由实验全攻略:配置与安全实战

实验拓扑图 实验需求 步骤1.按照图示配置IP地址2.按照图示区域划分配置对应的动态路由协议3.在R7上配置dhcp服务器,能够让pc可以获取IP地址4.将所有环回宣告进ospf中,将环回17宣告进rip中,将rip路由引rospf中,ospf路由引.rip中5.要…

电动汽车制动系统及其工作原理

制动系统是实现车辆减速、停车功能的重要系统。电动汽车的制动系统按照制动实现方式分为机械制动和电机再生制动,机械制动根据制动力实现方式不同又可分为液压机械制动系统、气压机械制动系统和电子机械制动系统。目前,电动汽车的制动系统实现一般为协调…

CentOS 7 Linux 离线安装 docker-compose

CentOS 7 Linux 离线安装 docker-compose 1. docker-compose 简介 1.1. docker-compose 是什么? docker-compose 是 Docker 官方提供的工具,用于定义和运行多容器 Docker 应用程序。通过一个 YAML 文件(通常为 docker-compose.yml&#xf…

排序算法实战(上)

一、引言在力扣刷题的旅程中,排序类题目是绕不开的重要板块。今天就来分享两道经典排序题——912. 排序数组和75. 颜色分类的解题思路与代码实现,带你深入理解排序算法在实际题目中的应用 。二、题目剖析与解题思路(一)912. 排序数…

python学智能算法(二十)|SVM基础概念-感知机算法及代码

引言 前序学习进程中,已经学习了超平面的基础知识,学习链接为:超平面 在此基础上,要想正确绘制超平面,还需要了解感知机的相关概念。 感知机 感知机是对生物神经网络的模拟,当输入信号达到感知机的阈值时…

操作HTML网页

一、HTML网页的介绍 HTML,即超文本标记语言(HyperText Markup Language),它不是一种编程语言,而是一种标记语言,用于描述网页的结构。HTML 通过一系列标签来定义网页中的各种元素,如文本、图片…

Django--03视图和模板

Django–03视图和模板 Part 3: Views and templates 本教程承接第二部分,我们将继续开发投票应用,重点介绍 Django 的表单处理和通用视图。 文章目录Django--03视图和模板前言概述一、编写更多视图二、编写实际执行操作的视图三、快捷方式:r…

《每日AI-人工智能-编程日报》--2025年7月15日

介绍:AI :英伟达恢复向中国销售 H20 并推出新 GPU:7 月 15 日,英伟达官宣将恢复向中国销售 H20,并推出全新的 NVIDIA RTX PRO GPU,其中 B30 性能约为 H20 的 75%,定价在 6500 至 8000 美元之间&…

C++STL-list

一.基础概念相当于数据结构里面的双向链表二.基础操作1.list对象创建1. 默认构造函数list<int> l1;2. 初始化列表list<int> l2_1 { 9,8,7,6,5 };list<int> l2_2({ 9, 8, 7, 1, 5 });3. 迭代器list <int> l3(l2_1.begin(), l2_1.end());4. 全0初始化li…

【PTA数据结构 | C语言版】字符串插入操作

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;将给定字符串 t 插入到另一个给定字符串 s 的第 pos 个字符的位置。 输入格式&#xff1a; 输入先后给出主串 s 和待插入的字符串 t&#xff0c;每个非空字符串占一行&#…

Postman + Newman + Jenkins 接口自动化测试

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 </