
一般提到 Web 自动化测试,大多人会立即想到使用 Selenium。Selenium 无疑很强大,但也古老,仅仅浏览器不小心升级,就很大可能导致项目运行不了,语法也略显繁琐。
Playwright 由微软推出,相较于 Selenium 更现代化、更简洁和更快,支持智能等待(元素)。缺点是不支持IE、社区资料少。
每个自动化测试项目,我都推荐单独搭建虚拟环境,以便管理。如何搭建虚拟环境,查阅Python进阶教程丨虚拟环境搭建和Pycharm 创建并管理虚拟环境。
关于系统要求,官方文档这样描述:
-
Python 3.8 或更高版本。
-
Windows 10+、Windows Server 2016+ 或适用于 Linux 的 Windows 子系统 (WSL)。
-
macOS 14 Ventura 或更高版本。
-
Debian 12、Ubuntu 22.04、Ubuntu 24.04,基于 x86-64 和 arm64 架构。
官方文档看起来非常详细了,为什么还要写文章呢?
最主要为了记录自己学习的过程,另一方面官方文档也不是那么详细,观看它需要一点门槛。
安装 Playwright
本地终端运行:
pip install --upgrade pip
pip install playwright
playwright install
需要注意:运行 playwright install 命令会安装 Chromium、Firefox 和 WebKit 三种浏览器。你需要知道 Chromium 不等于 Google Chrome。如果你的测试机上已安装 Google Chrome 、 Microsoft Edge(两者都基于 Chromium)或者其它浏览器,且只关注它们,完全不需要执行 playwright install
命令。
你也可以使用 playwright install --help
查看如何下载浏览器:
playwright install --help
用法:playwright 安装 [选项] [浏览器...]
确保安装了此版本 Playwright 所需的浏览器。
选项:
--with-deps 安装浏览器的系统依赖项
--dry-run 不执行安装,仅打印信息
--force 强制重新安装稳定浏览器通道
--only-shell 安装 Chromium 时仅安装无头 shell
--no-shell 安装 Chromium 时不安装无头 shell
-h, --help 显示命令的帮助信息
示例:
- $ install
安装默认浏览器。
- $ install chrome firefox
安装自定义浏览器,支持 chromium、chromium-headless-shell、chromium-tip-of-tree-headless-shell、chrome、chrome-beta、msedge、msedge-beta、msedge-dev、bidi-chromium、firefox、webkit。
比如你的测试机上没有 chrome 浏览器,你可以 playwright install chrome
,或者同时安装多个 playwright install chrome msedge
。
启动浏览器并导航到目标网站
playwright 支持打开三种类型浏览器:
- sync_playwright.chromium.launch()
- sync_playwright.webkit.launch()
- sync_playwright.firefox.launch()
现在 playwright 只对 chromium 支持 channel 参数。例如打开 Edge 浏览器:
browser = sync_playwright.chromium.launch(channel="msedge")
全部 channel 参数如下:
现在我们启动浏览器:
from playwright.sync_api import sync_playwright
def test_browser():
with sync_playwright() as p:
# 实例化。这里启动 Edge 浏览器,你的测试中请选择已安装的浏览器
# 默认headless=True(无头模式),如果想看到浏览器界面: headless=False
browser = p.chromium.launch(channel="msedge", headless=False)
# 打开一个新页面
page = browser.new_page()
# 导航到目标网站
page.goto("https://www.baidu.com ")
# 等待一段时间以便观察结果
page.wait_for_timeout(5000)
# 关闭浏览器
browser.close()
if __name__ == "__main__":
test_browser()