Playwright 基本使用
1. Playwright支持2种运行方式:同步和异步。
同步(Sync)模式
- 执行流程:
在同步模式下,代码按照从上到下的顺序执行。每个操作都会阻塞直到完成,然后再执行下一行代码。这意味着在等待某个操作(如页面加载)完成之前,程序不会继续往下执行。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.baidu.com")
print(page.title())
browser.close()
异步(Async)模式
-
执行流程:
异步模式利用Python的asyncio库,允许非阻塞的并发操作。这意味着在等待某个耗时操作(如网络请求)的同时,程序可以继续执行其他任务。你需要使用await关键字来等待异步操作的结果。 -
性能与效率:
异步模式能显著提高脚本的执行效率,特别是在进行大量网络请求或需要同时管理多个页面/浏览器实例的场景下。因为它能够更好地利用系统资源,减少闲置时间。
-
复杂度:
相比同步模式,异步编程模型引入了额外的概念,如协程(coroutine)、事件循环(event
loop)等,这可能会增加代码的复杂度,尤其是对于不熟悉异步编程的开发者而言。
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto('https://www.baidu.com')
print(await page.title())
await browser.close()
asyncio.run(main())
2.headless模式
- 默认情况下,playwright以无头模式运行浏览器,要查看浏览器UI,要在启动时加上headless=False,示例:
browser = await p.chromium.launch(headless=False)
3.关于等待
-
Playwright 打开浏览器运行脚本的速度那就是一个字:快!
-
您还可以用来slow_mo (单位是毫秒)减慢执行速度。它的作用范围是全局的,从启动浏览器
到操作元素每个动作都会有等待间隔,方便在出现问题的时候看到页面操作情况
-
使用示例:
browser = p.chromium.launch(headless=False,slow_mo=1000)
-
time.sleep() 不再使用
-
Playwright 在查找元素的时候具有自动等待功能,如果你在调试的时候需要使用等待,你应该使
用page.wait_for_timeout(5000) 代替 time.sleep(5)并且最好不要等待超时。
# 等待5秒
page.wait_for_timeout(5000)
4.录制生成脚本
(1)启动运行
-
Playwright 具有开箱即用的生成测试的能力,是快速开始测试的好方法。它将打开两个窗口,一
个是浏览器窗口,您可以在其中与要测试的网站进行交互,另一个是 Playwright Inspector 窗
口,您可以在其中记录测试、复制测试、清除测试以及更改测试语言。
-
使用命令行启动
playwright codegen https://www.baidu.com
-
启动后,电脑上出现2个窗口,左边是浏览器打开网站可以操作,右边是inspector 可以生成对应
的脚本
-
右边的inspector还可以选择生成异步代码
-
如果是写自动化测试用例,还能自动生成pytest框架的代码
(3) 录制相关命令操作
- codegen在浏览器中运行并执行操作
playwright codegen https://www.baidu.com
- Playwright 打开一个浏览器窗口,设置为特定的宽度和高度,使用该–viewport选项生成具有不同视口大小的测试
playwright codegen --viewport-size=1000,800 https://www.baidu.com
-
–device 使用设置视口大小和用户代理等选项模拟移动设备时记录脚本和测试。
模拟移动设备iPhone11,注意:device的值必须用双引号,并且区分大小写
playwright codegen --device="iPhone 11" https://www.baidu.com
- 改变元素配色方案 (没看出来区别在哪)
playwright codegen --color-scheme=dark https://www.baidu.com
- 模拟地理位置、语言和时区
playwright codegen --timezone="Europe/Rome" --geolocation="41.890221,12.492348" --lang="it-IT" maps.google.com
-
保留经过身份验证的状态
运行codegen以在会话结束时–save-storage保存cookie和localStorage 。这对于单独记录身份
验证步骤并在稍后的测试中重用它很有用。
执行身份验证并关闭浏览器后,auth.json将包含存储状态。
playwright codegen --save-storage=auth.json
-
运行–load-storage以消耗先前加载的存储。这样,所有的cookie和localStorage都将被恢复,使
大多数网络应用程序进入身份验证状态。
playwright open --load-storage=auth.json my.web.app
playwright codegen --load-storage=auth.json my.web.app
# Perform actions in authenticated state.
(4)playwright inspector使用
-
还可以在playwright inspector 工具上点开启录制按钮,在页面上点点点,就可以生成对应的元
素和操作。
-
Pick locator 使用
-
点击 Pick locator 后在浏览器上选择需要定位的元素,即可生成对应的 locator。
5.page.pause()断点
- 在代码中加入page.pause()进入断点状态
page.pause() #断点
- 运行后会弹出 playwright inspector 工具
-
console调试定位
-
我们可以在 用代码打开的浏览器上f12 打开console页面,输入 playwright.$(selector) 调试定
位
6.窗口最大化
-
playwright 默认启动的浏览器窗口大小是1280x720,我们可以通过设置no_viewport参数来禁用
固定的窗口大小
(1)no_viewport 禁用窗口大小
- 设置args参数 --start-maximized 并且设置 no_viewport=True
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False,
args=['--start-maximized'])
context = browser.new_context(no_viewport=True)
page = context.new_page()
page.goto("https://www.baidu.com")
page.pause() #断点
browser.close()
(2)viewport 指定窗口大小
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(viewport={'width':800,'height':600})
page = context.new_page()
page.goto("https://www.baidu.com")
page.pause() #断点
browser.close()
(3)如果你不是通过context 上下文创建的page对象,直接通过browser创建的page,那么参数直接写到new_page位置
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page(viewport={'width':1000,'height':800})
page.goto("https://www.baidu.com")
page.pause() #断点
browser.close()
(4)窗口最大化
browser = p.chromium.launch(headless=False,
args=['--start-maximized'])
page = browser.new_page(no_viewport=True)
7.指定channel打开浏览器
- 通过playwright -h命令查看目前支持的浏览器,默认会安装chromeium,firefox和webkit三个浏览器。
- 默认情况下,chromium.launch()不带channel参数打开的是chromium浏览器,Google Chrome 和
Microsoft Edge浏览器都是用的 chromium 内核,所以只需加一个channel=“chrome”,即可打开谷歌浏览器
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False,
channel="chrome")
page = browser.new_page(no_viewport=True)
page.goto("https://www.baidu.com")
browser.close()
- 添加channel="msedge"即可打开Microsoft Edge浏览器
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False,
channel="msedge")
page = browser.new_page(no_viewport=True)
page.goto("https://www.baidu.com")
browser.close()
8.启动本地Chrome加载用户缓存
-
playwright 启动Google Chrome 浏览器的时候默认用的是无痕模式,不加载本地的数据,这对
于测试人员运行一个干净的浏览器是没问题的。
-
大家在学selenium的时候,知道 selenium 可以启动本地的 Google Chrome
浏览器并加载本地数据,这样可以在本地已经登录过网站的情况下,下次打开网站不需要登录继续操作,对于一些爬虫用户是非常重要的功能。 -
playwright 可以使用launch_persistent_context方法启动本地的chrome 浏览器
(1)selenium加载Google Chrome插件
- 在启动浏览器的时候添加–user-data-dir用户数据目录,即可启动带插件的浏览器,并且会记住用户的cookies数据
import time
from selenium import webdriver
import getpass
option = webdriver.ChromeOptions()
user_date_dir = r'C:\Users\l\AppData\Local\Google\Chrome\User Data'
# option.add_argument(f"--user-data-dir=C:\\Users\\{getpass.getuser()}\\AppData\Local\Google\Chrome\\User Data")
option.add_argument(f"--user-data-dir={user_date_dir}")
driver = webdriver.Chrome(options=option)
driver.get("http://...")
- 查看–user-data-dir用户数据目录方法
(2)playwright 启启动本本地地 Google Chrome
- 使用 launch_persistent_context 方法启动本地的chrome 浏览器,并且设置channel=“chrome”
import getpass
from playwright.sync_api import sync_playwright
user_date_dir = r'C:\Users\l\AppData\Local\Google\Chrome\User Data'
with sync_playwright() as p:
browser = p.chromium.launch_persistent_context(
# 指定本机用户缓存地址
user_data_dir = user_date_dir,
# 接收下载事件
accept_downloads = True,
# 设置GUI模式
headless=False,
slow_mo=1000,
channel = "chrome",
)
page = browser.new_page()
page.goto('http:...')
page.pause()
-
在运行的时候,先关闭本地的chrome 浏览器,再执行代码,就可以看到启动的浏览器,打开网
站不需要登录。
(3)使用代码
- 使用代码可以在launch_presistent_context加上proxy参数
proxy=ProxySettings(server="http://xxx.xxx.xxx.xxx:xxxx"),