文章目录
- 介绍
- 安装
- 环境安装
- 屏幕录制
- 保留记录cookie
- 基本使用
- 元素定位
- CSS选择器定位
- xpath定位
- count
- nth(index)
- inner_text()
- get_by_text(xxx)
- get_attribute(attrName)
介绍
Playwright 是一个用于自动化浏览器操作的开源工具,由 Microsoft 开发和维护。它支持多种浏览器(包括 Chromium、Firefox 和 WebKit)和多种编程语言(如 Python、JavaScript 和 C#),可以用于测试、爬虫、自动化任务等场景。
安装
环境安装
python版本的Playwright官网文档:
https://playwright.dev/python/docs/intro
-
系统要求:
- Python 3.8 或更高版本。
- Windows 10+、Windows Server 2016+ 或适用于 Linux 的 Windows 子系统 (WSL)。
- MacOS 12 Monterey 或 MacOS 13 Ventura。
- Debian 11、Debian 12、Ubuntu 20.04 或 Ubuntu 22.04。
-
安装playwright的python版本
- pip install playwright
-
安装Playwright所需的所有工具插件和所支持的浏览器
- playwright install
- 该步骤耗时较长
屏幕录制
-
创建一个py文件,比如:main.py
-
在终端中,执行如下指令:
python"> playwright codegen -o main.py
python">playwright codegen --viewport-size=800,600 www.baidu.com -o main.py
- 模拟手机设备进行网络请求(只支持手机模拟器,无需单独安装)
- 访问指定网址,并且设置浏览器窗口大小
python">playwright codegen --device="iPhone 13" -o main.py
保留记录cookie
- 在屏幕录制时,进行登录操作,登录后,cookie信息会被保存到auth.json文件中
python">playwright codegen --save-storage=auth.json http://download.java1234.com/
- 基于auth.json进行屏幕录制,会自动进入到登录成功后的页面中
python">playwright codegen --load-storage=auth.json http://download.java1234.com/ -o main.py
基本使用
python">from playwright.sync_api import sync_playwright
with sync_playwright() as p:# headless 是否是无头浏览器bro=p.chromium.launch(headless=False)page=bro.new_page()# 访问的网站page.goto("https://www.baidu.com")# 等待时长page.wait_for_timeout(1000)# 获取网页标头title=page.title()# 获取网站源码content=page.content()print(title,content)page.close()bro.close()
元素定位
CSS选择器定位
- 语法结构:page.locator()
- 参数:标签/id/层级/class 选择器
- 交互操作:
- 点击元素,
click()
方法 - 元素内输入文本,
fill()
方法
- 点击元素,
python">import randomfrom playwright.sync_api import sync_playwrightwith sync_playwright() as p:# headless 是否是无头浏览器bro = p.chromium.launch(headless=False)page = bro.new_page()# 访问的网站page.goto("https://www.baidu.com")# 等待时长page.wait_for_timeout(1000)# 定位并输入pythonpage.locator("#kw").fill("python")# 定位搜索按钮,进行搜索 #id定位 .class定位page.locator("#su").click()page.wait_for_timeout(1000)# 网页回退page.go_back()page.wait_for_timeout(1000)# 标签+属性定位page.locator("input#kw").fill("人工智能")page.locator("#su").click()page.go_back()page.wait_for_timeout(1000)# 层级定位page.locator('#form > span > input#kw').fill('数据分析')page.locator('#su').click()page.wait_for_timeout(1000)page.go_back()page.wait_for_timeout(1000)# 聚焦于当前标签page.locator('#form > span > input#kw').focus()input_text = 'Hello, World!'for char in input_text:page.keyboard.type(char, delay=random.randint(300, 600))# 定位搜索按钮,进行点击操作page.locator('#su').click()page.close()bro.close()
xpath定位
page.locator(xpath表达式)
python">from playwright.sync_api import sync_playwrightwith sync_playwright() as p:bro = p.chromium.launch(headless=False,slow_mo=2000)page = bro.new_page()page.goto('https://www.bilibili.com/')#xpath定位page.locator('//*[@id="nav-searchform"]/div[1]/input').fill('Python教程')page.locator('//*[@id="nav-searchform"]/div[2]').click()page.close()bro.close()
count
python">const count = await page.locator('div.my-class').count();
console.log(count); // 输出匹配 'div.my-class' 的元素数量
nth(index)
python">const element =page.locator('button').nth(1); // 获取第二个按钮元素
element.click();
inner_text()
python">const element = await page.locator('h1');
const text = await element.inner_text();
console.log(text); // 输出 h1 元素的内部文本
get_by_text(xxx)
python">const element =page.locator('button:text("Click me")'); // 定位包含文本 "Click me" 的按钮
element.click();
get_attribute(attrName)
python">const element = page.locator('img');
const src = element.get_attribute('src');
console.log(src); // 输出图像的 src 属性值