《最新出炉》系列初窥篇-Python+Playwright自动化测试-2-playwright的API及其他知识
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的同步和异步、有头和无头。它们各有利弊,要灵活掌握其适合使用的测试场景。好了,今天时间也不早了,宏哥就讲解和分享到这里,感谢您耐心的阅读,希望对您有所帮助。
感谢您花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让博主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下左下角“推荐”按钮,您的
本文版权归作者和博客园共有,来源网址:https://www.cnblogs.com/du-hong 欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利!