【Playwright+Python】手把手带你写一个自动化测试脚本

如何使用代理方式打开网页

playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下:

1、同步写法:
 1 from playwright.sync\_api import sync\_playwright 2 
 3 proxy = {'server': 'http:/127.0.0.1:8080'}
 4 
 5 
 6 def run(): 7     with sync\_playwright() as p: 8         browser = p.chromium.launch(headless=False, proxy=proxy)
 9         page = browser.new\_page()
10 
11         page.goto('https://www.baidu.com')
12 
13         title = page.title()
14         if "百度" in title:
15             print("打开百度成功")
16         else:
17             print("打开百度失败")
18 
19         browser.close()
20 
21 
22 run()
2、异步写法:
 1 from playwright.async\_api import async\_playwright 2 import asyncio 3 
 4 proxy = {'server': 'http:/127.0.0.1:8080'}
 5 
 6 
 7 async def run(): 8     async with async\_playwright() as p:
 9         browser = await p.chromium.launch(headless=False, proxy=proxy)
10         page = await browser.new\_page()
11 
12         await page.goto('https://www.baidu.com')
13 
14         title = await page.title()
15         if "百度" in title:
16             print("打开百度成功")
17         else:
18             print("打开百度失败")
19 
20 await browser.close()
21 
22 
23 asyncio.get\_event\_loop().run\_until\_complete(run())

同步和异步写法对比

1、同步的优点:
  • 代码结构简单易懂,不需要学习async/await语法

  • 适用于小规模或简单任务

  • 调试和理解同步代码更简单

2、异步的优点:
  • 能更高效地利用系统资源,避免阻塞等待IO

  • 对于长时间操作如网络请求更高效

  • 可以支持并发执行多个任务

  • 对于大规模和复杂系统更有利

3、区别
  • 对于小任务和学习用途,同步代码结构更简单。

  • 对于需要长时间IO等待的任务(如网络请求),使用异步可以更高效。

  • 对于需要支持高并发的系统(如网站),使用异步模型可以支持更多并发连接。

  • 多线程同步会带来锁的问题,而异步避免了锁的使用。

  • 异步的FUTURE模式也更易于扩展性好,支持动态增加回调函数。

4、总结
  • 小任务用同步

  • 长时间IO任务用异步

  • 高并发系统用异步

  • 以后的功能扩展考虑异步更灵活

一般来说对于现代化系统,异步编程模型将是主流趋势。但同步在某些场景也同样易用。选择时要根据具体需求来权衡。

写一个自动化测试脚本

1、示例脚本

算是个入门的例子,关于每句话的意思,看我注释即可,示例代码如下:

 1 import re 2 from playwright.sync\_api import Page, expect, sync\_playwright 3 
 4 proxy = {'server': 'http://127.0.0.1:8080'}
 5 
 6 
 7 def test\_baidu(): 8     with sync\_playwright() as p:
 9         browser = p.chromium.launch(headless=False, proxy=proxy)
10         page = browser.new\_page()
11         # 跳转到baidu页面
12         page.goto("https://www.baidu.com/")
13         # 点击输入框
14         page.locator("#kw").click()
15         # 输入框输入selenium
16         page.locator("#kw").fill("selenium")
17         # 点击百度一下查询按钮
18         page.get\_by\_role("button", name="百度一下").click()
19         # 验证输入框是否输入selenium
20         expect(page.locator("#kw")).to\_have\_value("selenium")
21         # 验证页面是否包含文本“大家还在搜”
22         expect(page.locator("#content\_left")).to\_contain\_text("大家还在搜")
23         # 退出浏览器
24         browser.close()

**注意:**测试类和测试方法都要用test_ 前缀命名

2、基本操作

这是 Playwright 常用操作列表,请注意,还有许多其他操作,请务必查看定位器 API 部分以了解更多相关信息。

操作描述
locator.check()选中输入复选框
locator.click()点击元素
locator.uncheck()取消选中输入复选框
locator.hover()将鼠标悬停在元素上
locator.fill()填写表单字段,输入文本
locator.focus()聚焦元素
locator.press()按下单个键
locator.set_input_files()选择要上传的文件
locator.select_option()从下拉菜单中选择选项
3、断言操作
断言描述
expect(locator).to_be_checked()复选框处于选中状态
expect(locator).to_be_enabled()控件已启用
expect(locator).to_be_visible()元素可见
expect(locator).to_contain_text()元素包含文本
expect(locator).to_have_attribute()元素具有属性
expect(locator).to_have_count()元素列表已给出长度
expect(locator).to_have_text()元素匹配文本
expect(locator).to_have_value()输入元素具有值
expect(page).to_have_title()页面有标题
expect(page).to_have_url()页面有 URL
4、fixtures夹具的使用

示例代码:

 1 import pytest 2 from playwright.sync\_api import Page, expect, sync\_playwright 3 
 4 
 5 @pytest.fixture(scope="function", autouse=True)
 6 def before\_each\_after\_each(page: Page): 7     print("before the test runs")
 8 
 9     page.goto("https://www.baidu.com/")
10     yield
11 
12     print("after the test runs")
13 
14 
15 def test\_main\_navigation(page: Page):
16     page.locator("#kw").fill("万物皆可连 博客园")
17     page.get\_by\_role("button", name="百度一下").click()
18     expect(page.locator("#content\_left")).to\_contain\_text("万物皆可连 - 博客园")

代码解释:

  • 定义了一个名为 before_each_after_each 的 fixture(夹具),它的作用域是每个测试函数,并且设置为自动应用于每个测试函数。

  • 在这个 fixture 中:打印 “before the test runs”,表示测试运行前执行的操作。使用 page.goto(“https://www.baidu.com/”) 打开百度首页。

  • yield 关键字在这个 fixture 运行期间挂起,等待测试函数执行。测试函数将在 fixture 的环境下执行。

更多学习代码和方法戳这里:学习籽料和学习视频

​如有侵权,请联系删除。

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值