一.浏览器上下文

1.BrowserContext是浏览器实例中的一个隔离的类似隐身会话。浏览器上下文创建起来既快又便捷。我们在新浏览器上下文中运行每个测试场景,以便在测试之间隔离浏览器状态。个人觉得功能类似于Seleniumdriver

  • 同步

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,pythonpython-asynccsharp,默认为python

  • -b, --browser <browserType> :要使用的浏览器,可以选择chromiumfirefoxwebkit,默认chromium

  • --channel <channel>chromium版本,比如chromechrome-betamsedge-dev等;

  • --color-scheme <scheme>:模拟器的颜色主题,可选择light或者dark样式。

  • --device <deviceName>:模拟的设备,比如iPhone 11

  • --save-storage <filename>:保存上下文状态,用于保存cookieslocalStorage,可用它来实现重用。例如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群大家一起讨论交流,里面也有各种软件测试资料和技术交流。

Logo

秉承“创新、开放、协作、共享”的开源价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新时代开发者培养的开源创新生态!支持公有云使用、私有化部署以及软硬一体化私有部署。

更多推荐