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

news/2024/9/20 16:57:07

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

playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下:

1、同步写法:

from playwright.sync_api import sync_playwrightproxy = {'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 asyncioproxy = {'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_playwrightproxy = {'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()# 输入框输入seleniumpage.locator("#kw").fill("selenium")# 点击百度一下查询按钮page.get_by_role("button", name="百度一下").click()# 验证输入框是否输入seleniumexpect(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/")yieldprint("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 的环境下执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/47460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【游记】中考后SH四日游

中考后SH四日游6.22 6.23本来接下来还有拍摄的东方明珠旁云彩的移动的,体验到了什么是“风云变幻”,但由于是视频,懒得传了。6.246.25 6.26 6.27本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18265950,未经允许严禁转载。 版…

(Redis 理论与实践学习)Redis的数据结构:String类型

目录String的主要实现内部编码模式何为简单动态字符串SDS的底层实现C语言字符串和SDS的区别, SDS的优点有哪些?常数获取字符串长度避免缓冲区溢出,通过对数组的扩增实现空间增大合理的资源分配,减少内存分配的次数扩增时的空间预分配缩短时的惰性空间释放二进制安全总结一下…

STM32内存分布,启动过程及bootloader

STM32怎么说也用了好几年了,但是对于它的内存分布,启动过程,总是模棱两可;所以说决定写这篇文章做下梳理,水平有限,欢迎指正; 以下以F407为例 1. STM32地址空间分布图片出自M3与M4权威指南+-------------------------+----------------------------------+Address Range…

花样玩转“所见即所得”的可视化开发UI

随着技术的发展,用户对软件的界面美观度和交互体验的要求越来越高。在这样的背景下,可视化开发UI(User Interface)成为了提升用户体验和开发效率的重要工具。 通过图形界面来设计和构建用户界面的方法,可视化开发UI可以说改变了软便开发的生态,与传统的代码编写相比,它允…

UNIQUE VISION Programming Contest 2024 Summer (AtCoder Beginner Contest 359)

A - Count Takahashi 数 Takahashi 字符串的数量。 模拟。点击查看代码 #include<bits/stdc++.h> using namespace std; #define int long long const int maxn=2e5+3; char s[maxn]; int n,cnt; signed main(){cin>>n;for(int i=1;i<=n;i++){cin>>s;cnt…

【内网渗透】全网最详细的端口转发教程

场景介绍最近在真实环境测试和编写靶场实战教程时,总会遇到内网主机无法直接访问,需要通过转发端口、建立代理隧道等方式去访问,以方便后续进一步的横向渗透测试。本文章主要介绍一些端口转发工具的使用。测试场景拓扑图中所标注的IP地址为本地测试地址Kali服务只能ping通19…

好用的HAI-GPU:我将腾讯云HAI的AI绘画接入小程序

前言 感觉已经进入全面AIGC的时代了,从刚开始的ChatGPT的生成文本,到GPT-4文本到图片的发展,深刻感受到了技术的日新月异。但是GPT-4一直是付费模式,我才开始接触stable diffusion,在自己的电脑上学习AI绘画。 AI绘画的文生图还没研究透彻呢,文生视频sora又来了。对于我来…

基于Chan-Vese算法的图像边缘提取matlab仿真

1.算法运行效果图预览2.算法运行软件版本 matlab2022a3.部分核心程序% 迭代更新水平集函数 err=[]; for i = 1:Iterssubplot(132) imshow(I1,[])hold on;contour(corn, [0.5 0.5],g);title([边缘提取效果,num2str(i), iterations]);hold off;corn = func_evolution(corn, I1, …