1.简介

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

2.代码解释

2.1创建浏览器对象

 '''默认为无头浏览器方式启动  '''
browser = p.webkit.launch(headless=False)

2.2创建page对象

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

page = browser.new_page()

2.3其他

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

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: 北京-宏哥 QQ交流群:705269076
Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
公众号:北京宏哥
''' # 3.导入模块
import time
from playwright.sync_api import sync_playwright def 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: 北京-宏哥 QQ交流群:705269076
公众号:北京宏哥
Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
''' # 3.导入模块
import asyncio
import time from playwright.async_api import async_playwright async 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运行代码

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

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

4.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: 北京-宏哥 QQ交流群:705269076
公众号:北京宏哥
Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
''' # 3.导入模块 from playwright.sync_api import sync_playwright with sync_playwright() as p:
browser = p.chromium.launch() # 启动 chromium 浏览器
page = browser.new_page() # 打开一个标签页
page.goto("https://www.baidu.com") # 打开百度地址
print(page.title()) # 打印当前页面title
page.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: 北京-宏哥 QQ交流群:705269076
公众号:北京宏哥
Project: 《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
''' # 3.导入模块 from playwright.sync_api import sync_playwright with sync_playwright() as p:
browser = p.chromium.launch(headless=False) # 启动 chromium 浏览器
page = browser.new_page() # 打开一个标签页
page.goto("https://www.baidu.com") # 打开百度地址
print(page.title()) # 打印当前页面title
page.click("input[name=\"wd\"]") # 点击输入框
page.fill("input[name=\"wd\"]", "chromium") # 在输入框输入浏览器名字
page.screenshot(path=f'example-{p.chromium.name}.png')
browser.close() # 关闭浏览器对象

5.小结

5.1同步和异步

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

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

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

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

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

《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识的更多相关文章

  1. Flutter 即学即用系列博客——04 Flutter UI 初窥

    前面三篇可以算是一个小小的里程碑. 主要是介绍了 Flutter 环境的搭建.如何创建 Flutter 项目以及如何在旧有 Android 项目引入 Flutter. 这一篇我们来学习下 Flutte ...

  2. Spark系列-初体验(数据准备篇)

    Spark系列-初体验(数据准备篇) Spark系列-核心概念 在Spark体验开始前需要准备环境和数据,环境的准备可以自己按照Spark官方文档安装.笔者选择使用CDH集群安装,可以参考笔者之前的文 ...

  3. Python系列之入门篇——HDFS

    Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...

  4. Python系列之入门篇——MYSQL

    Python系列之入门篇--MYSQL 简介 python提供了两种mysql api, 一是MySQL-python(不支持python3),二是PyMYSQL(支持python2和python3) ...

  5. python爬虫 scrapy2_初窥Scrapy

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  6. WWDC15 Session笔记 - Xcode 7 UI 测试初窥

    https://onevcat.com/2015/09/ui-testing/ WWDC15 Session笔记 - Xcode 7 UI 测试初窥 Unit Test 在 iOS 开发中已经有足够多 ...

  7. Scrapy001-框架初窥

    Scrapy001-框架初窥 @(Spider)[POSTS] 1.Scrapy简介 Scrapy是一个应用于抓取.提取.处理.存储等网站数据的框架(类似Django). 应用: 数据挖掘 信息处理 ...

  8. 初窥Kaggle竞赛

    初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...

  9. scrapy2_初窥Scrapy

    递归知识:oop,xpath,jsp,items,pipline等专业网络知识,初级水平并不是很scrapy,可以从简单模块自己写. 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数 ...

  10. Java发送邮件初窥

    一.背景 最近朋友的公司有用到这个功能,之前对这一块也不是很熟悉,就和他一起解决出现的异常的同时,也初窥一下使用Apache Common Email组件进行邮件发送. 二.Java发送邮件的注意事项 ...

随机推荐

  1. 跳出思维的“盒子”,聊聊 RTE 应用创新大赛的那些作品

    由声网Agora 与环信联合主办的"RTE 2021 编程挑战赛"已圆满落幕.在今年的大赛中,来自行业中不同领域的专家参与了决赛评选,包括 Linux 中国技术社区技术负责人 白宦 ...

  2. 记一次在forEach中使用aynac/await中的坑

    1.背景 在写一个对齐脚本时 发现下列问题 const timeList = await imageList.map( (item,index)=>{ return item.identify_ ...

  3. Java泛型: 主要知识点总结

    Java泛型:主要知识点总结 1 泛型的好处 解决元素存储的安全性问题. 解决获取数据元素时,需要类型强制转换的问题. Java泛型可以保证如果程序在编译时没有发出警告,运行.时就不会产生ClassC ...

  4. Mybatis 获取自增主键 useGeneratedKeys与keyProperty 解答

    Mybatis 获取自增主键 今天开发的时候遇到一个疑惑,业务场景是这样的, 但是百度好久没有找到合适的解答,于是自己向同事了解,感觉还不错,因此写上了这个文章 有一个表A和一个表B A就是一个主表, ...

  5. Barplot/pie/boxplot作图详解——R语言

    当数据以简单的可视化的形式呈现时,数据便更具有意义并且更容易理解,因为人眼很难从原始数据中得出重要的信息.因此,数据可视化成为了解读数据最重要的方式之一.条形图和箱线图是了解变量分布的最常用的图形工具 ...

  6. window设置开启启动程序的几种方式比较

    一.设置开机启动项 进入启动文件夹,拷贝程序的快捷方式到这个文件夹即可. 可在任务管理器--启动,查看是否设置成功 启动时间:用户登陆之后. 二.使用计划任务设置自启 进入计划任务界面进行配置,按wi ...

  7. postgresSQL Extended Query执行过程和sharding-proxy的处理

    pg Extended Query PostgreSQL: Documentation: 15: 55.2. Message Flow 多个阶段,可复用 Parse → DESCRIBE statem ...

  8. 聊聊Redis sentinel 机制

    Redis 的哨兵机制自动完成了以下三大功能,从而实现了主从库的自动切换,可以降低 Redis 集群的运维开销: 监控主库运行状态,并判断主库是否客观下线: 在主库客观下线后,选取新主库: 选出新主库 ...

  9. Go/Python RPC使用

    Remote Procedure Call 简单RPC调用 server实现 // 注册接口 type HelloService struct{} func (s *HelloService) Hel ...

  10. CQOI2013vp记

    新Nim游戏 因为第一次操作与其它操作不同,考虑拿出来单独做,剩下的操作就变成了 Nim游戏 了. 回忆一下 Nim游戏 先手必胜的条件是什么,是所有数的异或和不为 \(0\),那么这题就转化为求原集 ...