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

一.简介

上一篇我已经将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_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:小兮说测试
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运行代码

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

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

四.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_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: 小兮说测试
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.1同步和异步

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/24608.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud面试题

组件 Spring Cloud Eureka:服务注册与发现 Spring Cloud Zuul:服务网关 Spring Cloud Ribbon:客户端负载均衡 Spring Cloud Feign:声明性的Web服务客户端 Spring Cloud Hystrix:断路器 Spring Cloud Config&#xff1…

[C++]octomap安装后测试

测试环境&#xff1a; vs2019 octomap1.9.6 release x64 代码&#xff1a; #include <octomap/octomap.h> #include <octomap/OcTree.h> using namespace std; using namespace octomap; void print_query_info(point3d query, OcTreeNode* node) { if (…

矿井水除氟,污水除氟的工艺分析

高矿化度的废水是指含有高浓度溶解性矿物质的废水&#xff0c;通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征&#xff0c;对环境…

Vivado综合属性系列之十二 BLACK_BOX

目录 一、前言 二、BLACK_BOX ​2.1 属性说明 ​2.2 工程代码 ​2.3 结果 一、前言 ​在调试中&#xff0c;有时不需要知道一个模块或实例的具体实现&#xff0c;或者需要使其对外属于不可见&#xff0c;只知道它的输入输出&#xff0c;即像一个黑盒&#xff0c;此时可以对模…

港联证券|“面值退”增多凸显A股市场化进程良性态势

近日&#xff0c;多家陷入“1元退市”危机的公司纷纷发布风险提示公告称&#xff0c;公司股票存在可能因股价低于面值被终止上市的风险。据《经济参考报》记者不完全统计&#xff0c;今年以来&#xff0c;沪深两市已有10余只个股锁定“面值退”&#xff0c;其中多以披星戴帽公司…

Windows平台下用例图中包含(include)、扩展(extend)和泛化(generalization)介绍

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows平台下用例图中包含(include)、扩展(extend)和泛化(generalization&#xff09;介绍。 用例图是解决用户需求的图&#xff0c;画好用例图一定要理清用例之间的关系。用例之间有三种关系&…

什么是跳表

什么是跳表 跳表全称为跳跃列表&#xff0c;它允许快速查询&#xff0c;插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表&#xff0c;且每一层链表中的元素是前一层链表元素的子集&#xff08;见右…

【Qt】QLocalSocket与QLocalServer问题:接收不到数据、只能收到第一条、数据不完整解决方案【2023.05.24】

简介 Qt很强大,但是Qt的帮助文档、API属实是让我们走不少弯路。QLocalSocket一个很简单的东西,我仅想用来实现一个简单的本地进程通信,就遇到了:客户端循环发送数据,服务端只能接收到一条、接收到数据不完整等奇奇怪怪的现象。 最郁闷的是,网上很多教程说的都是错的😒。…

Spring Authorization Server 系列(三)code换取token

code换取token 概述客户端认证方式换取结果 概述 在获取到code后&#xff0c;就可以使用code换取token了&#xff0c;但在换取token这一步还会对客户端进行一些校验&#xff0c;而这也支持不同的方式&#xff0c;一起来看看。 客户端认证方式 JwtClientAssertionAuthenticati…

期末复习总结【MySQL】聚合查询 + 多表联合查询(重点)

文章目录 前言一、聚合查询1, 聚合函数2, 聚合函数使用示例3, GROUP BY 子句4, HAVING 子句 二、联合查询(重点)1, 笛卡尔积2, 内连接2.1, 示例12.2, 示例22.3, 示例3 3, 外连接4, 自连接 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#…

Yolov8轻量级:EfficientViT,基于级联分组注意力模块的全新实时网络架构,better speed and accuracy

EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention 论文:https://arxiv.org/abs/2305.07027 代码:Cream/EfficientViT at main microsoft/Cream GitHub 🏆🏆🏆🏆🏆🏆Yolo轻量化模型🏆🏆🏆🏆🏆🏆 近些年对视觉Tra…

动手学习卷积神经网络(CNN)(一)---卷积运算

卷积神经网络可以直接从原始数据中学习其特征表示并完成最终任务&#xff0c;可以说卷积网络是“端”到“端”的思想&#xff0c;在整个学习流程中并进行认为的子问题划分&#xff0c;而是交给深度学习模型直接学得从原始输入到期望输出得映射。 卷积神经网络是包含卷积层&…

Ai时代降临,我们的未来又在哪里?

文章目录 背景AI智能迭代进步码农的未来展望借助gpt快速成长总结 背景 随着人工智能的不断发展&#xff0c;自然语言处理技术也一直在不断的进步和发展&#xff0c;GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型作为自然语言处理领域最前沿的技术之一&a…

lintcode-图的拓扑排序(java)

拓扑排序 拓扑排序-lintcode原题题目介绍解题思路代码演示解题方法二 (参考,不用掌握)前置知识 图的拓扑序和深度优先遍历和广度优先遍历 拓扑排序-lintcode原题 127.拓扑排序-原题链接,可以点进去测试 题目介绍 描述 给定一个有向图&#xff0c;图节点的拓扑排序定义如下: 对…

两个offer:一个996,月薪3万;一个885,月薪2万,怎么选?

找工作时&#xff0c;钱和闲&#xff0c;你选哪个&#xff1f; 一位网友拿到了两个offer&#xff0c;一个996&#xff0c;月薪3万&#xff0c;一个885&#xff0c;月薪2万&#xff0c;怎么选&#xff1f; 一部分网友选择885&#xff0c;因为自己是打工人&#xff0c;不是打工奴…

【Python】类与对象

知识目录 一、写在前面✨二、类与对象简介三、Car类的实现四、Date类的实现五、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;希望我们一路走来能坚守初心&#xff01; 今天跟大家分享的文章是 Python中面向对象编程的类与对象。 &#xff0…

Unreal Niagara粒子入门2

本次学习一下如何将Niagara参数暴露给蓝图、材质编辑器、粒子不同阶段。 1.暴露参数给蓝图 首先在左侧Parmeters参数面板的User Exposed处创建参数&#xff1a; 然后将参数拖入到想要绑定的粒子字段上&#xff0c;例如这里绑定给粒子发射数&#xff1a; 在调用粒子时&#…

【iOS】—— Tagged Pointer对象

文章目录 关于Tagged PointerNSTaggedPointer示例TaggedPointer 结构Tagged Pointer特点注意事项isa指针64位下的isa指针优化 本来打算细看一下weak的底层原理&#xff0c;看到了出现了很多次Tagged Pointer对象&#xff0c;就先来学一下Tagged Pointer&#xff0c;在之前刚学习…

Sentinel流控规则

1.Sentinel流控规则简介 1.1.基本介绍 1.2.进一步解释说明 资源名&#xff1a;唯一名称&#xff0c;默认请求路径。针对来源&#xff1a;Sentinel可以针对调用者进行限流&#xff0c;填写微服务名&#xff0c;默认default&#xff08;不区分来源&#xff09;。阈值类型/单机阈…

Linux 企业级安全原理和防范技巧

Linux 企业级安全原理和防范技巧 1. 企业级Linux系统防护概述1.1 企业级Linux系统安全威胁1.2 企业级Linux系统安全立体式防范体系1.2.1 Linux文件系统访问安全1.2.2 Linux进程安全1. 进程的种类2. 进程管理方法 1.2.3 Linux用户管理安全1. 管理用户及组文件安全2. 用户密码管理…