《最新出炉》Python+Playwright自动化测试-2-playwright的API及其他知识

news/2024/10/17 12:37:01/

一.简介

上一篇我已经将Python+Playwright的环境搭建好了,而且也简单的演示了一下三款浏览器的启动和关闭,是不是很简单啊。今天主要是把一篇的中的代码进行一次详细的注释,然后说一下playwright的API和其他相关知识点。那么首先将上一篇中的代码进行一下详细的解释。

二.代码解释

2.1创建浏览器对象

  1. '''默认为无头浏览器方式启动 '''

  2. browser = p.webkit.launch(headless=False)

2.2创建page对象

一般来说,一个page对应一个浏览器选项卡,而Page对象的作用在于和页面的内容进行交互,以及导航和加载新的页面。这点和selenium有点像,也可以说是比selenium划分的更加细致精确。

page = browser.new_page()

2.3其他

其他的是一些选择器和操作方法,在后续的文章中我都会一一的介绍到。

三.playwright的API

Playwright支持同步和异步两种API,使用异步API需要导入asyncio库,它是一个可以用来实现Python协程的库,更详细介绍可参考Python协程 。我们可以根据自己的偏好选择适合的模式。

3.1同步与异步模式原理

同步操作方式:在代码执行时,程序会阻塞等待每个操作执行的结果,直到该操作执行结束才能继续执行后面的代码。同步代码容易理解和编写,但如果在网络请求等 I/O 操作时会造成大量的等待时间,影响程序的执行效率。

异步操作方式:在代码执行时,当遇到需要等待操作执行的时候,程序不会被阻塞,而是继续执行其他的代码。当该操作执行的结果返回时,程序会自动跳回去接着执行之前被暂停的代码。异步操作虽然需要一定的学习成本,但可以提升程序的执行效率。

3.1.1同步模式

· 直接顺序执行测试逻辑,直到完成。

· 使用上下文管理器或启动/关闭方法控制浏览器生命周期。

· 简单易用,适合同步测试场景。

· 但无法实现异步或重叠的测试逻辑。

3.1.2异步模式

· 利用asyncio模块以异步非阻塞方式执行测试逻辑。

· 浏览器启动/关闭和大多数Playwright API也是异步的,需要await。

· 可以实现复杂的异步或重叠测试逻辑。

· 但较难调试,有一定学习成本。

3.2同步和异步的概念

同步:发送一个请求,等待返回,然后再发送下一个请求。

异步:发送一个请求,不等待返回,随时可以再发送下一个请求。

3.3同步和异步实践

3.3.1测试用例

这里假设一共有2条测试用例,用例1步骤如下:
1)chrome浏览器打开百度
2)搜索框输入“test”
3)点击百度一下搜索
4)点击搜索结果的第2页
用例2步骤:
1)chrome浏览器打开搜狗搜索
2)搜索框输入“test”
3)点击搜狗搜索
4)点击搜索结果的第2页

3.3.2同步

这里我们使用sync_playwright上下文管理器同步启动Playwright,然后编写同步测试逻辑。

3.3.2.1参考代码

根据上述测试用例编写自动化测试脚本代码如下:

# coding=utf-8🔥# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2023-05-18
@author: 小兮说测试
Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
'''# 3.导入模块
import time
from playwright.sync_api import sync_playwrightdef testcase1():print('testcase1 start')with sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page()page.goto("https://www.baidu.com/")print(page.title())page.fill("input[name=\"wd\"]", "test")page.click("text=百度一下")page.click("#page >> text=2")browser.close()print('testcase1 done')def testcase2():print('testcase2 start')with sync_playwright() as p:browser2 = p.chromium.launch(headless=False)page2 = browser2.new_page()page2.goto("https://www.sogou.com/")print(page2.title())page2.fill("input[name=\"query\"]", "test")page2.click("text=搜狗搜索")page2.click("#sogou_page_2")browser2.close()print('testcase2 done')start = time.time()
testcase1()
testcase2()
end = time.time()
print('Running time: %s Seconds' % (end - start))

3.3.2.2运行代码

 3.3.3异步

这里我们使用asyncio模块异步启动Playwright,然后编写异步测试逻辑。需要使用await关键字标识异步操作。

3.3.3.1参考代码

根据上述测试用例编写自动化测试脚本代码如下:

# coding=utf-8🔥# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2023-05-18
@author:小兮说测试
Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
'''# 3.导入模块
import asyncio
import timefrom playwright.async_api import async_playwrightasync def testcase1():print('testcase1 start')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 page.fill("input[name=\"wd\"]", "test")await page.click("text=百度一下")await page.click("#page >> text=2")await browser.close()print('testcase1 done')async def testcase2():print('testcase2 start')async with async_playwright() as p:browser2 = await p.chromium.launch(headless=False)page2 = await browser2.new_page()await page2.goto("https://www.sogou.com/")print(await page2.title())await page2.fill("input[name=\"query\"]", "test")await page2.click("text=搜狗搜索")await page2.click("#sogou_page_2")await browser2.close()print('testcase2 done')async def main():task1 = asyncio.create_task(testcase1())task2 = asyncio.create_task(testcase2())tasks = [task1, task2]print('before await')await asyncio.gather(*tasks)start = time.time()
asyncio.run(main())
end = time.time()
print('Running time: %s Seconds' % (end - start))

3.3.3.2运行代码

运行代码后,控制台打印,如下图所示:

 通过对比同步和异步的运行时间可以看到,使用异步编程的方式可以显著提升测试效率。

四.headless 模式 

在launch方法的参数中添加 headless=False playwright默认是无头模式运行,True是无头模式,False是有头模式,即在电脑上能看到浏览器的运行界面。默认情况下,Playwright 以无头模式运行浏览器。要查看浏览器 UI,请headless=False在启动浏览器时传递标志。有头模式适用于调试,而无头模式适用于CI / cloud执行。

4.1headless

headless 无头模式运行浏览器示例:

# coding=utf-8🔥# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2023-05-19
@author: 缘浅啊
Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
'''# 3.导入模块from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch()          # 启动 chromium 浏览器page = browser.new_page()              # 打开一个标签页page.goto("https://www.baidu.com")     # 打开百度地址print(page.title())                    # 打印当前页面titlepage.click("input[name=\"wd\"]")       # 点击输入框page.fill("input[name=\"wd\"]", "chromium")  # 在输入框输入浏览器名字page.screenshot(path=f'example-{p.chromium.name}.png')browser.close()                        # 关闭浏览器对象

4.2非headless

非headless 无头模式运行浏览器示例:

# coding=utf-8🔥# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2023-05-19
@author: 小兮说测试
Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
'''# 3.导入模块from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)          # 启动 chromium 浏览器page = browser.new_page()              # 打开一个标签页page.goto("https://www.baidu.com")     # 打开百度地址print(page.title())                    # 打印当前页面titlepage.click("input[name=\"wd\"]")       # 点击输入框page.fill("input[name=\"wd\"]", "chromium")  # 在输入框输入浏览器名字page.screenshot(path=f'example-{p.chromium.name}.png')browser.close()                        # 关闭浏览器对象

五.小结

5.1同步和异步

Python Playwright 支持同步和异步两种操作方式。

同步操作方式:在代码执行时,程序会阻塞等待每个操作执行的结果,直到该操作执行结束才能继续执行后面的代码。同步代码容易理解和编写,但如果在网络请求等 I/O 操作时会造成大量的等待时间,影响程序的执行效率。

异步操作方式:在代码执行时,当遇到需要等待操作执行的时候,程序不会被阻塞,而是继续执行其他的代码。当该操作执行的结果返回时,程序会自动跳回去接着执行之前被暂停的代码。异步操作虽然需要一定的学习成本,但可以提升程序的执行效率。

Python Playwright 默认使用异步操作方式。可以通过使用 await 关键字或 async with 语法来定义异步操作,或者使用 sync 关键字来定义同步操作。

 今天这一篇主要给大家分享了playwright的同步和异步、有头和无头。它们各有利弊,要灵活掌握其适合使用的测试场景。好了,今天时间也不早了,我就讲解和分享到这里,感谢您耐心的阅读,希望对您有所帮助。


http://www.ppmy.cn/news/126474.html

相关文章

MIPI DSI转LVDS 支持常用分辨率,最大支持1920*1200

MIPI DSI转LVDS 支持常用分辨率,最大支持1920*1200

1920*1080就是200万像素

之前一直觉得1920*1080应该是很高清的,但是看到商家又写着200万像素以为是另一个东西,但是实际发现1920*1080就是200万像素。

office 2010 报1920错误 (未能启动服务 “Office Software Protection Platform”(osppsvc))

office 2010 在打开文档时提示需要配置office问题,配置到最后出现错误:1920 ,未能启动服务 “Office Software Protection Platform”(osppsvc) 。请确认您有足够的权限启动系统服务。 操作方法: 1.winR运行“ regedit ”&#x…

大屏 1920 布局: 响应式自适应 vw+ rem + %

需求: 1. 全屏, 设计图 1920 x 1080 ; min: 1200 x 768 2. 响应式&自适应 方法: 元素 单位 html font-size: 单位 vw 页面宽度、字体 单位 rem 页面高度 单位 % rem, (不直接使用 vh, 因为无法直接实现 min-he…

windows连接VNC设置分辨率为1920*1080pi

使用VNC Viewer连接Ubuntu18.04之后,分辨率一直不是1920*1080,所以就很不爽,查了一下资料,搞定了 环境:已经安装好了vnc viewer和vncserver 1.安装虚拟显示器的软件 sudo apt-get install xserver-xorg-core-hwe-18.04 sudo a…

虚拟机里的ubuntu设置1920x1080分辨率

在虚拟机安装完ubuntu之后,显示设置里面的默认是没有1920x1080这个选项的 解决方法: 首先打开终端,执行下面命令: xrandr获得当前显示器的名称为Virtual1 然后编辑/etc/profile文件 # 需要sudo,要不然没有写权限 …

vue始终保持1920*1080样式

1.在index.html中引入jq <script src"https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>2.写css /* html{ overflow-x: hidden; overflow-y: visible; } */body {width: 1920px;/* height: 1080px; *//* background: url(../images/bg.png) …

Centos7设置1920x1080分辨率

Centos7设置分辨率 步骤一&#xff1a; 添加自己想要修改的分辨率如cvt 1920 1080 60 步骤二&#xff1a; 复制cvt结果第二行中 ‘Modeline’ 后面的所有内容&#xff0c;并粘贴到xrandr --newmode 后面&#xff0c;即可新建一个分辨率&#xff1a; 例如 &#xff1a;xrandr…