一.浏览器上下文
1.BrowserContext
是浏览器实例中的一个隔离的类似隐身会话。浏览器上下文创建起来既快又便捷。我们在新浏览器上下文中运行每个测试场景,以便在测试之间隔离浏览器状态。个人觉得功能类似于Selenium
的driver
。
-
同步
browser = playwright.chromium.launch()
context = browser.new_context()
page = context.new_page()
举个栗子
import time
from playwright.sync_api import sync_playwright
'''
采用同步模式依次打开两个Chrome浏览器
第一个打开百度
第二个打开搜狗
'''
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, channel="chrome")
page = browser.new_page()
page.goto("https://www.baidu.com/")
time.sleep(3)
print(page.title())
time.sleep(3)
page.fill("input[name=\"wd\"]", "mrjade")
time.sleep(3)
page.click("text=百度一下")
time.sleep(3)
page.click("#page >> text=2")
time.sleep(3)
context = browser.new_context()
page2 = context.new_page()
page2.goto("https://www.sogou.com/")
time.sleep(3)
print(page2.title())
time.sleep(3)
page2.fill("input[name=\"query\"]", "mrjade")
time.sleep(3)
page2.click("text=搜狗搜索")
time.sleep(3)
page2.click("#sogou_page_2")
time.sleep(3)
print(page.title())
time.sleep(3)
-
异步
browser = await playwright.chromium.launch()
context = await browser.new_context()
page = await context.new_page()
举个栗子
import asyncio
import time
from playwright.async_api import async_playwright
'''
采用异步模式打开Chrome,依次打开两个tab页
'''
async def test_browser_contexts_2():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False,channel="chrome")
context = await browser.new_context()
page_baidu = await context.new_page()
await page_baidu.goto("https://cn.bing.com/")
print(await page_baidu.title())
await page_baidu.fill("input[id=\"sb_form_q\"]", "mrjade")
await page_baidu.click("label[id='search_icon']")
await page_baidu.click("a[aria-label='第 2 页']")
time.sleep(3)
page_sougou = await context.new_page()
await page_sougou.goto("https://www.sogou.com/")
print(await page_sougou.title())
await page_sougou.fill("input[name=\"query\"]", "mrjade")
await page_sougou.click("text=搜狗搜索")
await page_sougou.click("#sogou_page_2")
asyncio.run(test_browser_contexts_2())
3.浏览器上下文还可用于模拟涉及移动设备、权限、区域设置和配色方案的多页场景。
-
同步
import time
'''
同步模式模拟手机
'''
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
iphone_11 = p.devices['iPhone 11 Pro']
browser = p.chromium.launch(headless=False,channel="chrome")
context = browser.new_context(
**iphone_11,
locale='de-DE',
geolocation={ 'longitude': 12.492507, 'latitude': 41.889938 },
permissions=['geolocation']
)
page = context.new_page()
page.goto("https://www.baidu.com")
time.sleep(10)
browser.close()
同步模式-手机
-
异步
import time
'''
异步模式模拟手机
'''
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
iphone_11 = p.devices['iPhone 11 Pro']
browser = await p.chromium.launch(headless=False,channel="chrome")
context = await browser.new_context(
**iphone_11,
locale='de-DE',
geolocation={ 'longitude': 12.492507, 'latitude': 41.889938 },
permissions=['geolocation'],
color_scheme='dark',
)
page = await context.new_page()
await page.goto("https://www.baidu.com")
await browser.close()
asyncio.run(main())
异步模式-手机
二.使用Chrome浏览器扩展
使用过selenium
的人都知道,我们可以在实例化chrome driver
的时候可以加载浏览器扩展插件。
1.方式一
# 启用带插件的浏览器
option = webdriver.ChromeOptions()
option.add_argument("--user-data-dir="+r"C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/")
driver = webdriver.Chrome(chrome_options=option) # 打开chrome浏览器
2.方式二
option = webdriver.ChromeOptions()
# 设置好应用扩展
extension_path = '/Users/TesterRoad/Downloads/xxx.crx'
option.add_extension(extension_path)
# 启动浏览器,并设置好wait
browser = webdriver.Chrome(chrome_options=option)
那么我们来看下,playwright
如何加载Chrome
浏览器插件呢?
扩展程序仅在 Chrome / Chromium GUI模式中使用。
from playwright.sync_api import sync_playwright
# chrome插件目录,下载后解压crx
path_to_extension = "/Users/TesterRoad/Downloads/extension/onetab_extension_1_58_0_0"
# 用户缓存目录,chrome://version/
user_data_dir = "/Users/TesterRoad/Library/Application Support/Google/Chrome/Default"
def run(playwright):
context = playwright.chromium.launch_persistent_context(
user_data_dir,
headless=False,
channel="chrome",
args=[
f"--disable-extensions-except={path_to_extension}",
f"--load-extension={path_to_extension}"
],
)
# 在当前窗口打开baidu
page = context.pages[0]
page.goto("https://www.baidu.com")
context.close()
with sync_playwright() as playwright:
run(playwright)
更多args
参数请参考https://peter.sh/experiments/chromium-command-line-switches/
注意:在使用脚本安装插件时,一定要解压crx文件,不要直接安装crx,否则会报以下错误
无法加载以下来源的扩展程序:/Users/TesterRoad/Downloads/extension/onetab_extension_1_58_0_0.crx. 清单文件缺失或不可读取
三.命令行工具
Playwright
有一个非常强大的功能,就是可以录制浏览器中的操作并自动生成代码,对于代码基础弱的小伙伴真是个福音(PS:好像Selenium
也有这个录制功能),这个功能可以通过 playwright
命令行调用codegen
来实现。codegen
参数如下:
-
-o, --output <file name>
:保存生成脚本; -
--target <language>
:生成的脚本语言,可以设置javascript
,python
,python-async
和csharp
,默认为python
; -
-b, --browser <browserType>
:要使用的浏览器,可以选择chromium
,firefox
和webkit
,默认chromium
; -
--channel <channel>
:chromium
版本,比如chrome
,chrome-beta
,msedge-dev
等; -
--color-scheme <scheme>
:模拟器的颜色主题,可选择light
或者dark
样式。 -
--device <deviceName>
:模拟的设备,比如iPhone 11
; -
--save-storage <filename>
:保存上下文状态,用于保存cookies
和localStorage
,可用它来实现重用。例如playwright codegen --save-storage=auth.json
; -
--load-storage <filename>
:加载--save-storage
保存的数据,重用认证数据; -
--proxy-server:指定代理服务器;
-
--timezone <time zone>
:指定时区; -
--geolocation <coordinates>
:指定地理位置坐标; -
--lang <language>
:指定语言/地区,比如中国大陆zh-CN
; -
--timeout <timeout>
:超时时间,定位毫秒,默认10000ms
; -
--user-agent <ua string>
:用户代理; -
--viewport-size <size>
:浏览器窗口大小; -
-h, --help
:查看帮助信息;
# 录制脚本命令
playwright codegen -o ./Downloads/extension/test_playwright_command.py --target python -b chromium --channel chrome https://www.baidu.com
脚本录制中
录制的脚本
注意:最终用下来感觉跟
Selenium IDE
的功能差不多,录制的脚本只能说是半成品,不能完全复用,至于为什么不能完全复用,使用过Selenium IDE
的人都懂。但是对于初学者,熟悉playwright
是个不错的选择。
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…….
如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入下方我的qq群大家一起讨论交流,里面也有各种软件测试资料和技术交流。
更多推荐