首页 > Python资料 博客日记
【Playwright+Python】手把手带你写一个自动化测试脚本
2024-06-25 21:00:04Python资料围观61次
如何使用代理方式打开网页
在 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 的环境下执行。
标签:
相关文章
最新发布
- 【python爬虫案例】利用python爬取豆瓣读书评分TOP250排行数据
- 【Python】Tkinter + Pandas实现窗口表格显示
- 【Python系列】SQLAlchemy 基本介绍
- 【Python】selenium 的EC.presence_of_element_located 和 EC.element_to_be_clickable 的区别
- 从零到一!超详细Pycharm安装教程(图解+详细步骤)
- python json jsonl 的用法
- 【Python篇】深度探索NumPy(下篇):从科学计算到机器学习的高效实战技巧
- boto3:Python连接S3对象存储并进行文件操作(上传、下载、删除)
- 全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
- Python pycryptodome类库使用学习总结
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj
- Python pyinstaller打包exe最完整教程
- Anaconda版本和Python版本对应关系(持续更新...)
- Python与PyTorch的版本对应