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

playwright,python · 浏览次数 : 0

小编点评

本文介绍了如何在 Python 中使用 Playwright 库通过代理打开网页。Playwright 是一个用于自动化 Web 应用程序的跨平台工具库,支持多种浏览器(包括 Chromium 和 Firefox)。 **同步与异步编写方式** 本文给出了一个同步和异步的示例代码,以展示它们之间的区别: - 同步编写方式适合简单任务和小规模项目。它更容易理解和使用,因为不需要了解 async/await 语法。 - 异步编写方式更适合需要处理长时间 IO 操作的任务,例如网络请求。它可以提高系统资源的利用率并支持并发执行。 **选择适当的编写方式** 根据具体需求选择同步或异步编写方式。对于小任务和学习目的,同步代码结构更简单。而对于需要长时间 IO 等待的任务,使用异步可以提高效率。 **自动化测试脚本示例** 以下是一个自动化测试脚本的示例,演示了如何使用 Playwright 进行 Web 自动化测试: ```python import re from playwright.sync_api import Page, expect, sync_playwright proxy = {'server': 'http://127.0.0.1:8080'} def test_baidu(): with sync_playwright() as p: browser = p.chromium.launch(headless=False, proxy=proxy) page = browser.new_page() # 跳转到 baidu 页面 page.goto("https://www.baidu.com/") # 点击输入框 page.locator("#kw").click() # 输入框输入 selenium page.locator("#kw").fill("selenium") # 点击百度一下查询按钮 page.get_by_role("button", name="百度一下").click() # 验证输入框是否输入 selenium expect(page.locator("#kw")).to_have_value("selenium") # 验证页面是否包含文本 “大家还在搜” expect(page.locator("#content_left")).to_contain_text("大家还在搜") # 退出浏览器 browser.close() # 运行测试 test_baidu() ``` **Playwright 操作列表及断言操作** Playwright 提供了一系列操作,以便在 Web 应用程序中进行导航、填写表单、点击元素等操作。此外,还提供了断言操作,用于验证页面元素的属性和文本内容。 **Fixtures 示例** Fixtures 是 Playwright 中用于在测试之间共享状态的机制。在本例中,我们使用了一个名为 `before_each_after_each` 的 fixture 来设置浏览器环境。 **结论** 本文介绍了在 Python 中使用 Playwright 库进行 Web 自动化的基本概念,包括同步和异步编写方式、选择适当的编写方式以及自动化测试脚本示例。此外,还展示了 Playwright 的操作列表和断言操作,以及如何使用 fixtures 来共享测试环境。

正文

 

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

 

 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 的环境下执行。

 

与【Playwright+Python】手把手带你写一个自动化测试脚本相似的内容:

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

​ 如何使用代理方式打开网页 在 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下: 1、同步写法: 1 from playwright.sync_api import sync_playwright 2 3 proxy = {'server': 

【Playwright+Python】系列教程(二)手把手带你写一个脚本

一、如何使用代理方式打开网页 在 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下: 1、同步写法: from playwright.sync_api import sync_playwright proxy = {'server': 'http:

《最新出炉》系列初窥篇-Python+Playwright自动化测试-6-元素定位大法-下篇

1.简介 上一篇主要是讲解我们日常工作中在使用Playwright进行元素定位的一些比较常用的定位方法的理论基础知识以及在什么情况下推荐使用。今天这一篇讲解和分享一下,在日常中很少用到或者很少见的定位,但是遇到了我们也要会,俗话说:手里有粮心里不慌。 2.阴影定位-Shadow DOM 在做web自

【Playwright+Python】系列教程(五)元素定位

一、常见元素定位 定位器是 Playwright 自动等待和重试能力的核心部分。简而言之,定位器代表了一种随时在页面上查找元素的方法,以下是常用的内置定位器。 1、按角色定位 按显式和隐式可访问性属性进行定位 语法:page.get_by_role() Dom结构示例1: 示例代码1: page.g

【Playwright+Python】系列教程(一)环境搭建及脚本录制

一、前言 看到这个文章,有的同学会说: 六哥,你为啥不早早就写完python系列的文章。 因为有徒弟需要吧,如果你也想学自学,那这篇文章,可以说是我们结缘一起学习的开始吧! 如果对你有用,建议收藏和转发! 二、Playwright是什么? 微软开源自动化测试工具Playwright,支持主流浏览器,

【Playwright+Python】系列教程(四)Pytest 插件在Playwright中的使用

一、命令行使用详解 使用Pytest插件在Playwright 中来编写端到端的测试。 1、命令行执行测试 pytest --browser webkit --headed 2、使用 pytest.ini 文件配置 内容如下: [pytest] # Run firefox with UI addop

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-1-环境准备与搭建

1.简介 Python+Playwright系列的文章还没有结束,就有好的小伙伴或者童鞋们私信公众号留言,问宏哥什么时候出Java语言的Playwright的自动化测试文章。本来想趁热打铁将Python+Playwright完结后,就开始Java语言的Playwright的自动化测试文章,但是好多人

《最新出炉》系列入门篇-Python+Playwright自动化测试-52- 字符串操作 - 下篇

1.简介 在日常的自动化测试工作中进行断言的时候,我们可能经常遇到的场景。从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言。这个时候就需要我们对字符串进行操作,宏哥这里介绍两种方法:正则和字符串切片函数split()。 2.测试场景 宏哥在这里说一下,自己的胡诌的

《最新出炉》系列入门篇-Python+Playwright自动化测试-51- 字符串操作 - 上篇

1.简介 在日常的自动化测试工作中进行断言的时候,我们可能经常遇到的场景。从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言。这个时候就需要我们对字符串进行操作,宏哥这里介绍两种方法:正则和字符串切片函数split()。 2.测试场景 宏哥在这里说一下,自己的胡诌的

《最新出炉》系列入门篇-Python+Playwright自动化测试-50-滚动条操作

1.简介 有些页面的内容不是打开页面时直接加载的,需要我们滚动页面,直到页面的位置显示在屏幕上时,才会去请求服务器,加载相关的内容,这就是我们常说的懒加载。还有就是在日常工作和学习中,经常会遇到我们的页面内容较多,一个屏幕范围无法完整展示内容,我们就需要滚动滚动条去到我们想要的地方,所以有时候我们就