一、简介
-
Playwright
是由微软公司
2020年初
发布的新一代自动化测试工具,相较于目前最常用的Selenium
,它仅用一个API
即可自动执行Chromium
、Firefox
、WebKit
等主流浏览器自动化操作。作为针对Python
语言纯自动化的工具,在回归测试中可更快的实现自动化。 -
Playwright
需要Python >=3.7
版本。推荐:Python 使用 pyenv 多版本管理。 -
Playwright 最详细使用教程,这篇文章使用细节介绍的非常好。
二、为什么选择 Playwright
?
-
Playwright
的优势1、
Selenium
需要通过WebDriver
操作浏览器;Playwright
通过开发者工具与浏览器交互,安装简洁,不需要安装各种Driver
。2、
Playwright
几乎支持所有语言,且不依赖于各种Driver
,通过调用内置浏览器所以启动速度更快。3、
Selenium
基于HTTP
协议(单向通讯),Playwright
基于Websocket
(双向通讯)可自动获取浏览器实际情况。4、
Playwright
为自动等待,而在Selenium
中经常需要写sleep
去作为一个等待,保证程序正常运行。-
等待元素出现(定位元素时,自动等待30s,等待时间可以自定义,单位毫秒)
-
等待事件发生
-
-
已知局限性
1、
Playwright
不支持旧版Microsoft Edge
或IE11
。支持新的Microsoft Edge(在 Chromium 上)
,所以对浏览器版本有硬性要求的项目不适用。2、需要
SSL
证书进行访问的网站可能无法录制,该过程需要单独定位编写。
三、安装
-
1)安装 (
Playwright
支持Async\Await
语法,故需要Python3.7+
)$ pip install playwright
-
2)安装
Chromium
、Firefox
、WebKit
等浏览器的驱动文件(内置浏览器)和ffmpeg
用于视频录制注意,下面这种安装方式安装,会安装所有驱动文件,如果需要打包成
exe/app
文件还会报错 Please run the following command to download new browsers,所以可以按需安装就行。# 全装 $ python -m playwright install # 按需安装,重新安装一下(chromium 是其中一个浏览器插件,看自己用什么就装什么) # Expecting one of: chromium, chrome, chrome-beta, msedge, msedge-beta, msedge-dev, firefox, webkit # PLAYWRIGHT_BROWSERS_PATH=0 是为了支持 pyinstaller 打包报错 Please run the following command to download new browsers 问题 $ PLAYWRIGHT_BROWSERS_PATH=0 playwright install chromium
四、案例
-
案例一(同步案例)
# 导入 from playwright.sync_api import Playwright, sync_playwright # 导入 定时器 # from time import sleep # 创建浏览器 def run (playwright: Playwright) -> None: # 创建浏览器 browser = playwright.chromium.launch(headless=False) # 使用 selenium 如果要打开多个网页,需要创建多个浏览器,但是 playwright 中只需要创建多个上下文即可 # 例如:content1 = browser.new_context()、content2 = browser.new_context() 分别去访问网页做处理 content = browser.new_context() # 每个 content 就是一个会话窗口,可以创建自己的页面,也就是浏览器上的 tab 栏,在每个会话窗口中,可以创建多个页面,也就是多个 tab 栏 # 例如:page1 = content.new_page()、page2 = content.new_page() 封面去访问页面 page = content.new_page() # 页面打开指定网址 page.goto('https://www.baidu.com') # 找到百度输入框( locator 会自动识别传入的选择器是 css xpath .... 不需要像 selenium 指定 By.XPATH/ID 这样的 ) # page.locator('//input[@id="kw"]').fill('周杰伦') # 也可以写成下面这样: page.fill('//input[@id="kw"]', '周杰伦') # 点击百度一下进行搜索 # page.locator('//input[@id="su"]').click() # 也可以写成下面这样: page.click('//input[@id="su"]') # 延迟关闭(为啥需要延迟一下,这里是用于测试,因为代码执行完马上就回关闭,运行太快了,还以为崩溃了 # 暂时没找到配置不需要进行自动关闭,但是肯定跟 selenium 一样有这个配置) # sleep(10) # 之前使用使用 sleep 的方式进行等待,传入的是单位是秒 # 但是在 playwright 中有自带的延迟等待,单位是毫秒 page.wait_for_timeout(10000) # 使用完成关闭上下文(也就是会话窗口) content.close() # 关闭浏览器 browser.close() # 调用 with sync_playwright() as playwright: run(playwright)
-
案例二 (有
hover
)# 导入 from playwright.sync_api import Playwright, sync_playwright # 创建浏览器 def run (playwright: Playwright) -> None: # 创建浏览器 browser = playwright.chromium.launch(headless=False) # 新建窗口 content = browser.new_context() # 新建页面 page = content.new_page() # 访问首页 page.goto('https://hepai.video/') # 点击登录 page.click('//a[@href="/login"]') # 延迟 page.wait_for_timeout(1000) # 密码登录 page.click('//a[contains(text(), "密码登录")]') # 写入账号 page.fill('//input[@id="username"]', 'xxxx') # 写入密码 page.fill('//input[@id="password"]', 'dzm123456') # 点击登录 page.click('//button[@type="submit"]') # 延迟 page.wait_for_timeout(1000) # hover 出菜单(失败) # page.hover('//div[@class="nav-adv nav-adv-home u-info"]/p') # page.wait_for_selector('//div[@class="nav-adv nav-adv-home u-info"]/ul', state='visible', timeout=30000) # page.locator('//div[@class="nav-adv nav-adv-home u-info"]/ul') # 延迟 # page.wait_for_timeout(1000) # 点击财务管理 # page.click('//a[@href="/pipeline-record"]') # 上面 hover 失败,那就直接手动加载网页 page.goto('https://hepai.video/pipeline-record') # 延迟 page.wait_for_timeout(1000) # hover 出菜单 page.hover('//div[@class="u-info"]/img') # 退出登录 page.click('//a[contains(text(), "退出登录")]') # 点击确定按钮 page.click('//button/span[contains(text(), "确")]/..') # 延迟 page.wait_for_timeout(10000) # 关闭上下文 content.close() # 关闭浏览器 browser.close() # 调用 with sync_playwright() as playwright: run(playwright)
文章出处登录后可见!