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

在 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】手把手带你写一个自动化测试脚本的更多相关文章

  1. 手把手带你写一个minishell

    先解释一下Shell : Shell是一个功能为命令行解释器的应用程序,连接了用户和Linux内核,让我们能高效和安全地使用Linux内核. 要写一个minishell,我们要先理解它的过程: 读取输 ...

  2. 手把手带你做一个超炫酷loading成功动画view Android自定义view

    写在前面: 本篇可能是手把手自定义view系列最后一篇了,实际上我也是一周前才开始真正接触自定义view,通过这一周的练习,基本上已经熟练自定义view,能够应对一般的view需要,那么就以本篇来结尾 ...

  3. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

  4. 用Node+wechaty写一个爬虫脚本每天定时给女(男)朋友发微信暖心话

    wechatBot 微信每日说,每日自动发送微信消息给你心爱的人 项目介绍 灵感来源 在掘金看到了一篇<用Node + EJS写一个爬虫脚本每天定时女朋友发一封暖心邮件>后, 在评论区偶然 ...

  5. 手把手带你画一个动态错误提示 Android自定义view

    嗯..再差1篇就可以获得持之以恒徽章了,今天带大家画一个比较简单的view. 转载请注明出处:http://blog.csdn.net/wingichoy/article/details/504771 ...

  6. 手把手用Monkey写一个压测脚本

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 允许有条件转载,转载请附带底部二维码. 一.为什么需要一个测试脚本? 昨天讲解了Android Monkey命 ...

  7. 手把手教你写一个java的orm(五)

    生成sql:where 上一篇里我们实现了生成insert的sql,下面要开始实现update,delete,select的sql语句了.但是这些语句有一个比较麻烦的地方是:它们一般后面都会有wher ...

  8. 手把手教你写一个java的orm(一)

    写之前的说明 其实吧. 这个东西已经写好了,地址在:https://github.com/hjx601496320/JdbcPlus 这系列文章算是我写的过程的总结吧.(恩系列,说明我可能会写好久,╮ ...

  9. 手把手教你写一个RPC

    1.1 RPC 是什么 定义:RPC(Remote Procedure Call Protocol)--远程过程调用协议 ,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数 ...

  10. 用python的time库写一个进度条

    运算符 算数运算 如a=10,b=20 +两个数相加 a+b=30 -两个数相减 a-b=-10 两个数相乘 a****b =200 /两个数相除b/a=2 %取模,并返回余数b%a=0 幂,a*** ...

随机推荐

  1. dotnet OpenXML 继承组合颜色的 GrpFill 属性

    在 OpenXML 的颜色画刷填充,有特殊的填充是 GrpFill 属性,对应 OpenXML SDK 定义的 DocumentFormat.OpenXml.Drawing.GroupFill 类型 ...

  2. Masscan入门手册

    相关文章 https://www.cnblogs.com/huim/p/12116004.html https://4hou.win/wordpress/?cat=3080 Nmap vs Massc ...

  3. Spring如何控制Bean的加载顺序

    前言 正常情况下,Spring 容器加载 Bean 的顺序是不确定的,那么我们如果需要按顺序加载 Bean 时应如何操作?本文将详细讲述我们如何才能控制 Bean 的加载顺序. 场景 我创建了 4 个 ...

  4. SpringBoot模拟插入1000000万条数据

    一.数据库表准备 CREATE TABLE `student` ( `id` bigint NOT NULL COMMENT '用户id', `name` varchar(50) COLLATE ut ...

  5. windows server2012 挂载linux的nfs共享目录

    1.安装NFS客户端 首先win-server上添加角色-----选择文件服务-----网络文件系统(或者NFS客户端)-安装 2.挂载nfs目录 先cmd检查服务端的共享目录 然后执行:showmo ...

  6. C#语言:散修笔记

    文章目录 前言 数组的几种定义方法 out 和 ref 的区别 可变参数params 静态方法与非静态方法 >❀什么时候使用静态和非静态 构造函数 >❀类中方法的重载 >❀在类中输出 ...

  7. C 编程异常 — double free or corruption (fasttop)

    问题:运行代码的时候程序崩溃. *** Error in `./parsing': double free or corruption (fasttop): 0x00000000023d2350 ** ...

  8. 『手撕Vue-CLI』编码规范检查

    前言 这篇为什么是编码规范检查呢?因为这是一个很重要的环节,一个好的编码规范可以让代码更加清晰易读,在官方的 VUE-CLI 也是有着很好的编码规范的,所以我也要加入这个环节. 其实不管在哪个项目中, ...

  9. k8s多集群切换:使用kubeconfig文件管理多套kubernetes(k8s)集群

    目录 一.系统环境 二.前言 三.kubeconfig文件 四.kubernetes(k8s)多集群切换 一.系统环境 服务器版本 docker软件版本 CPU架构 CentOS Linux rele ...

  10. GeminiDB PITR,让游戏回档“进退自如”!

    本文分享自华为云社区<GeminiDB PITR,让游戏回档"进退自如"!>,作者:GaussDB 数据库. 在实际业务场景中,客户数据库难免会出现数据损毁.数据丢失. ...