【Playwright+Python】系列教程(二)手把手带你写一个脚本
一、如何使用代理方式打开网页
在 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下:
1、同步写法:
from playwright.sync_api import sync_playwright
proxy = {'server': 'http:/127.0.0.1:8080'}
def run():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, proxy=proxy)
page = browser.new_page()
page.goto('https://www.baidu.com')
title = page.title()
if "百度" in title:
print("打开百度成功")
else:
print("打开百度失败")
browser.close()
run()
2、异步写法:
from playwright.async_api import async_playwright
import asyncio
proxy = {'server': 'http:/127.0.0.1:8080'}
async def run():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False, proxy=proxy)
page = await browser.new_page()
await page.goto('https://www.baidu.com')
title = await page.title()
if "百度" in title:
print("打开百度成功")
else:
print("打开百度失败")
await browser.close()
asyncio.get_event_loop().run_until_complete(run())
二、同步和异步写法对比
1、同步的优点:
- 代码结构简单易懂,不需要学习
async/await语法 - 适用于小规模或简单任务
- 调试和理解同步代码更简单
2、异步的优点:
- 能更高效地利用系统资源,避免阻塞等待IO
- 对于长时间操作如网络请求更高效
- 可以支持并发执行多个任务
- 对于大规模和复杂系统更有利
3、区别
- 对于小任务和学习用途,同步代码结构更简单。
- 对于需要长时间IO等待的任务(如网络请求),使用异步可以更高效。
- 对于需要支持高并发的系统(如网站),使用异步模型可以支持更多并发连接。
- 多线程同步会带来锁的问题,而异步避免了锁的使用。
- 异步的FUTURE模式也更易于扩展性好,支持动态增加回调函数。
4、总结
- 小任务用同步
- 长时间IO任务用异步
- 高并发系统用异步
- 以后的功能扩展考虑异步更灵活
一般来说对于现代化系统,异步编程模型将是主流趋势。但同步在某些场景也同样易用。选择时要根据具体需求来权衡。
三、写一个用例
1、示例脚本
算是个入门的例子,关于每句话的意思,看我注释即可,示例代码如下:
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_ 前缀命名
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夹具的使用
示例代码:
import pytest
from playwright.sync_api import Page, expect, sync_playwright
@pytest.fixture(scope="function", autouse=True)
def before_each_after_each(page: Page):
print("before the test runs")
page.goto("https://www.baidu.com/")
yield
print("after the test runs")
def test_main_navigation(page: Page):
page.locator("#kw").fill("久曲健 博客园")
page.get_by_role("button", name="百度一下").click()
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】系列教程(二)手把手带你写一个脚本的更多相关文章
- 手把手带你写一个minishell
先解释一下Shell : Shell是一个功能为命令行解释器的应用程序,连接了用户和Linux内核,让我们能高效和安全地使用Linux内核. 要写一个minishell,我们要先理解它的过程: 读取输 ...
- Android Studio系列教程二--基本设置与运行
Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- C#微信公众号开发系列教程二(新手接入指南)
http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...
- NGUI系列教程二
接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...
- Fastify 系列教程二 (中间件、钩子函数和装饰器)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) 中间件 Fastify 提供了与 Express 和 Restify ...
- webpack4 系列教程(二): 编译 ES6
今天介绍webpack怎么编译ES6的各种函数和语法.敲黑板:这是webpack4版本哦, 有一些不同于webpack3的地方. >>> 本节课源码 >>> 所有课 ...
- Fastify 系列教程二 (中间件、钩子函数和装饰器)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...
随机推荐
- Navicat Premium 16永久激活
链接: https://pan.baidu.com/s/1wG0IGWOpgF1tmQRxcsvkBw 提取码: gtmk
- HAL库移植RT-Thread Nano
一.移植RT-Thread Nano准备 keil软件 CubeMx软件 STM32 CubeMx使用教程:https://www.cnblogs.com/jzcn/p/16313803.html S ...
- dotnet build error CS5001: Program does not contain a static 'Main' method suitable for an entry point
前言 Docker环境编译.Net6项目,出现诡异的CS5001 Program does not contain a static 'Main' method suitable for an ent ...
- 一键自动化博客发布工具,用过的人都说好(segmentfault篇)
segmentfault是我在这些平台中看过界面最为简洁的博客平台了. 今天就以segmentfault为例,讲讲在blog-auto-publishing-tools中的实现原理. 前提条件 前提条 ...
- 飞桨PaddleLite架构研读
一.架构全景图 二.源码详细解读 1. Lite体系下似乎有多种 op_desc/program_desc 的定义,之间的关系是什么?这样设计的背景和好处是什么? model_parser目录下,包含 ...
- GPS坐标、火星坐标、百度坐标之间的转换--提供java版本转换代码
参考文章:https://www.jianshu.com/p/c39a2c72dc65?from=singlemessage 1.国内几种常用坐标系说明 (1)名词解释 坐标系统:用于定位的系统,就跟 ...
- 2020年9月至10月 Splashtop 新功能
Splashtop 已为 Splashtop Business Access.Splashtop Remote Support.Splashtop SOS 和 Splashtop On-Prem ...
- 网络性能评估工具Iperf详解
一.网络性能评估工具Iperf 网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理.网络存在安全漏洞等原因,都会导致网络带宽利用率不高.要找到网络 ...
- 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2022):基于异构图GCN和GAT的DTI预测
(2022.4.16)Briefings-DTI-HETA:基于异构图GCN和GAT的DTI预测 目录 (2022.4.16)Briefings-DTI-HETA:基于异构图GCN和GAT的DTI预测 ...
- 深入剖析Arthas源码
一. 前言 Arthas 相信大家已经不陌生了,肯定用过太多次了,平时说到 Arthas 的时候都知道是基于Java Agent的,那么他具体是怎么实现呢,今天就一起来看看. 首先 Arthas 是在 ...