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

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】系列教程(二)手把手带你写一个脚本的更多相关文章

  1. 手把手带你写一个minishell

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

  2. Android Studio系列教程二--基本设置与运行

    Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...

  3. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  5. NGUI系列教程二

    接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...

  6. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  7. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...

  8. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) 中间件 Fastify 提供了与 Express 和 Restify ...

  9. webpack4 系列教程(二): 编译 ES6

    今天介绍webpack怎么编译ES6的各种函数和语法.敲黑板:这是webpack4版本哦, 有一些不同于webpack3的地方. >>> 本节课源码 >>> 所有课 ...

  10. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...

随机推荐

  1. dotnet 6 为什么网络请求不跟随系统网络代理变化而动态切换代理

    本文记录在 dotnet 6 的网络和在 .NET Framework 的行为的变更.在 dotnet 6 下,默认的网络请求在系统网络代理变更的时候,是不会动态切换代理的.例如在应用运行进行网络通讯 ...

  2. 阿里巴巴MySQL开源中间件Canal入门

    前言 距离上一篇文章发布又过去了两周,这次先填掉上一篇秒杀系统文章结尾处开的坑,介绍一下数据库中间件Canal的使用. Canal用途很广,并且上手非常简单,小伙伴们在平时完成公司的需求时,很有可能会 ...

  3. 🔥 PyTorch神操作:一图秒懂Tensor变形记!

    亲爱的码农小伙伴们,你们是否还在为Tensor的各种变换头大如斗?别怕,今天给大家送上一张超实用的PyTorch变换秘籍图,让你的Tensor操作如行云流水,CPU和GPU之间的切换如穿梭自如! GP ...

  4. 【GUI开发】用python爬YouTube博主信息,并开发成exe软件!

    目录 一.背景介绍 二.代码讲解 2.1 爬虫 2.2 tkinter界面 2.3 存日志 三.说明 一.背景介绍 你好,我是@马哥python说,一名10年程序猿. 最近我用python开发了一个G ...

  5. 模型压缩与部署-书生浦语大模型实战营学习笔记5&大语言模型11

    大语言模型-11.模型压缩与部署 书生浦语大模型实战营学习笔记4-模型压缩与部署 本文包括第二期实战营的第5课内容,介绍关于模型压缩的相关内容,主要包括.模型量化和模型部署的相关内容. 模型部署 定义 ...

  6. iptables命令详解

    安装iptables yum install iptables-services 编写允许访问的策略 vim /etc/sysconfig/iptables # sample configuratio ...

  7. Python——基本输入和输出

    Python提供了基本的输入和输出功能,这些功能通常是通过内置的input()函数(用于输入)和print()函数(用于输出)来实现的.以下是这两个函数的详细描述和示例: 1. print() 函数( ...

  8. 我的书《Unity3D动作游戏开发实战》出版了

    首先感谢帮助和参与前期检阅的朋友们.本书是我经验积累的提炼,书中既有干货分享也有对基础内容的详解补充. 同时由于是第一次撰写书籍,许多地方仍有不足还请读者朋友们见谅. 在京东或当当等都可以购买到本书: ...

  9. 平衡树 Treap & Splay [学习笔记]

    平衡树 \(\tt{Treap}\) & \(\tt{Splay}\) 壹.单旋 \(\tt{Treap}\) 首先了解 \(\tt{BST}\) 非常好用的东西,但是数据可以把它卡成一条链 ...

  10. Prism IoC 依赖注入

    现有2个项目,SinglePageApp是基于Prism创建的WPF项目,框架使用的是Prism.DryIoc,SinglePageApp.Services是C#类库,包含多种服务,下面通过使用Pri ...