当前位置: 首页 > news >正文

Python程序员,你还在用selenium吗?试试Playwright吧

文章目录

    • ⛳️ 实战场景
    • ⛳️ 实战操作

⛳️ 实战场景

本篇博客为大家介绍一款新的自动化测试工具,效果类似 selenium,但是这个模块年轻。

模块名称为 playwright-python,微软开源的,是针对 Python 语言的纯自动化工具,可以通过 API 调用浏览器,github 地址在本文末尾。

接下来将通过 3 篇博客为大家详细介绍该 playwright-python,彻彻底底了解它。

谁让自动化测试和爬虫不分家呢,这不,橡皮擦来了!

正式开始前依旧是模块安装:

pip install playwright

该模块安装非常快,但完整体验还需要安装浏览器相关驱动,这个有点大,命令如下:

python -m playwright install

安装时注意使用国内源!
Python程序员,你还在用selenium吗?试试Playwright吧
等待过程中,可以查阅输出日志,核对安装了哪些模块:

  • Downloading FFMPEG:FFMPEG;
  • Downloading Firefox 104.0:火狐浏览器驱动;
  • Downloading Chromium :谷歌浏览器驱动;
  • Downloading Webkit 16.0 :Webkit 浏览器驱动。

⛳️ 实战操作

第一次实战操作,先从不写代码开始,通过下述命令启动浏览器,然后【录制】我们的操作过程。

python -m playwright codegen

运行代码之后,弹出默认浏览器和一个代码录制展示框,具体如下所示:

Python程序员,你还在用selenium吗?试试Playwright吧
下面就可以在左侧的浏览器窗口中进行操作,然后观察右侧自动生成的代码段。

在地址栏输入 baidu.com 跳转到百度首页,然后输入 航天员,点击搜索按钮,生成的代码如下所示。

Python程序员,你还在用selenium吗?试试Playwright吧
将生成的代码复制到开发工具中,直接运行就可以得到刚刚相同的操作。

from playwright.sync_api import Playwright, sync_playwright, expect


def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    # Open new page
    page = context.new_page()
    # Go to https://www.baidu.com/
    page.goto("https://www.baidu.com/")
    # Click input[name="wd"]
    page.locator("input[name=\"wd\"]").click()
    # Fill input[name="wd"]
    page.locator("input[name=\"wd\"]").fill("航天员")
    # Press Enter
    page.locator("input[name=\"wd\"]").press("Enter")
    page.wait_for_url(
        "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E8%88%AA%E5%A4%A9%E5%91%98&fenlei=256&rsv_pq=0xfde7decb0011bfe6&rsv_t=3a67vLT%2Buti4VKw0mDppSrydbnq6CGsyOVNNxN%2F39naR6lYvxacuqvbYKRs0&rqlang=en&rsv_enter=1&rsv_dl=tb&rsv_sug3=24&rsv_sug1=24&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&prefixsug=%25E8%2588%25AA%25E5%25A4%25A9%25E5%2591%2598&rsp=5&inputT=5824&rsv_sug4=6786&rsv_jmp=fail")
    # ---------------------
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

接下来我们分析一下其生成的代码含义。

from playwright.sync_api import Playwright, sync_playwright

playwright.sync_api 模块导入 Playwrightsync_playwright,看到关键字 sync,可以猜测这是一个同步操作,那与之对应的,也是未来我们要对比学习的,就是异步接口相关内容,这里先埋下一个伏笔,下篇博客在进行讨论。

browser = playwright.chromium.launch(headless=False)

初始化一个谷歌浏览器对象,并且不是无头浏览器,即在桌面打开浏览器窗口。launch() 方法包含很多参数,常用的有以下内容:

  • headless:是否为无头浏览器,即是否显示浏览器窗口,默认为不显示;
  • channel:浏览器版本,“chrome”, “chrome-beta”, “chrome-dev”, “chrome-canary”;
  • proxy:代理设置;
  • timeout:超时时间,默认 30s。
context = browser.new_context()
page = context.new_page()

打开一个新浏览器,创建一个新页面,其中 browser.new_context() 的参数都是与浏览器配置相关的内容,实践的时候需要特别设置的在这里设置,例如下述参数:

  • user_agent:UA 代理;
  • viewport:页面大小,比例,例 1024*768;
  • offline:离线模式加载。
page.goto("https://www.baidu.com/")
page.locator("input[name=\"wd\"]").click()
……
page.wait_for_url(……)
  • goto() :地址跳转,即浏览器跳转;
  • locator():定位元素;
  • wait_for_url():等待页面加载完毕。

本文末尾重点介绍一下 goto() 相关内容,剩余函数下篇博客继续说明。
goto() 函数的重要参数:

  • url:跳转地址,必须包含协议,例如 http:// 或者 https://
  • referer:请求头中的 referer 参数;
  • timeout:最大操作时间(毫秒),默认为 30 秒;
  • wait_until:默认操作成功时,执行的内容,还有几个事件,分别是 domcontentloadednetworkidlecommit

项目开源地址:https://github.com/microsoft/playwright-python
官方手册:https://playwright.dev/python/docs/intro

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 729 篇原创博客

从订购之日起,案例 5 年内保证更新

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

相关文章:

  • STM32Fxx位带操作还不会?哲学三问让你实现位带自由(含位带操作核心代码)以LED与键盘为例
  • 大厂笔试面试总汇目录
  • ESP32 LVGL8.1 M5 Core2 + LVGL + IDF 详细的移植教程 (30)
  • 【论文阅读】Search-Based Testing Approach for Deep Reinforcement Learning Agents
  • c++版模板匹配与特征金字塔结构
  • 软件工程和Maven
  • 基于haarlike特征提取和Adaboost 的红绿灯/人行道检测识别matlab仿真
  • React的高阶组件详解
  • Python基础快速入门
  • FigDraw 22. SCI文章中绘图之核密度及山峦图 (ggridges)
  • 并联四足机器人项目开源教程(一)--- 机器人学导论的学习
  • 【CSS】笔记6-精灵图、字体图标
  • 秒懂如何使用SpringBoot+Junit4进行单元测试
  • 【C++】模板进阶 — 模板的特化
  • 11:跨域访问-Java Spring
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • bootstrap创建登录注册页面
  • fetch 从初识到应用
  • node 版本过低
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 回顾 Swift 多平台移植进度 #2
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前言-如何学习区块链
  • 入门到放弃node系列之Hello Word篇
  • 思维导图—你不知道的JavaScript中卷
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信开放平台全网发布【失败】的几点排查方法
  • 微信小程序设置上一页数据
  • 线上 python http server profile 实践
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​Spring Boot 分片上传文件
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #考研#计算机文化知识1(局域网及网络互联)
  • (C语言)fgets与fputs函数详解
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .NET 的程序集加载上下文
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [20170705]diff比较执行结果的内容.txt
  • [C/C++]数据结构 循环队列
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [IE 技巧] 显示/隐藏IE 的菜单/工具栏
  • [Java、Android面试]_05_内存泄漏和内存溢出
  • [Labtools 27-1429] XML parser encountered a problem in file
  • [LeetCode] 93. Restore IP Addresses 复原IP地址