playwright 学习复仇记-2 Selector选择器定位元素
前言
Selector 选择器,也就是通常说的元素定位了,页面上点点点的操作,都是基于元素定位,所以这块是重点需要学的核心内容。
Selector 选择器
说到元素定位,大家肯定会首先想到 selenium 的八大元素定位,其中xpath 和 css才是最主要的。
playwright 可以通过 CSS selector
, XPath selector
, HTML 属性(比如 id, data-test-id
)或者是 text 文本内容
定位元素。
除了xpath selector外,所有selector默认都是指向shadow DOM,如果要指向常规DOM,可使用*:light。不过通常不需要。
操作元素,可以先定位再操作
# coding=utf-8
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:# 创建服务器对象(指定浏览器驱动)# browser = p.chromium.launch() # 不填写参数表示从计算机环境变量读取chromium驱动,启动无头模式(无界面版)browser = p.chromium.launch(headless=False,executable_path="C:\\Users\\19076\AppData\Local\Google\Chrome\Application\chrome.exe")# 创建一个窗口context = browser.new_context()# 在此窗口创建一个标签页page = context.new_page()page.goto("https://www.baidu.com/")#通过id识别元素page.locator("#kw").fill("百度热搜")page.locator("#su").click()page.wait_for_timeout(5000)# 一定不要忘记关闭对象page.close()context.close()
CSS 或 XPath 选择器(个人比较推荐xpath,动态元素除外)
# coding=utf-8
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:# 创建服务器对象(指定浏览器驱动)# browser = p.chromium.launch() # 不填写参数表示从计算机环境变量读取chromium驱动,启动无头模式(无界面版)browser = p.chromium.launch(headless=False,executable_path="C:\\Users\\19076\AppData\Local\Google\Chrome\Application\chrome.exe")# 创建一个窗口context = browser.new_context()# 在此窗口创建一个标签页page = context.new_page()page.goto("https://www.baidu.com/")# page.locator("#kw").fill("百度热搜")# page.locator("#su").click()# fill可输入文字page.fill("css=#kw","百度热搜")"""其他用法:#元素调用fill方法 element_handle = page.query_selector("#kw")element_handle.fill("百度热搜") #向百度搜索框输入playwright"""# xpath用法page.click('//*[@id="su"]')"""# copy full xpath,效果更趋向于静态元素page.click("/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input")"""page.wait_for_timeout(5000)# 一定不要忘记关闭对象page.close()context.close()
或者可以直接写xpath和css语法,不需要前面的前缀css=
和 xpath=
, 它会自动判断你写的是css还是xpath语法,前提是你语法没有错误。
text 文本选择器
文本选择器是一个非常实用的定位方式,根据页面上看到的text文本就可以定位了,比如我们经常使用xpath 的文本选择器定位
text 文本除了可以定位 a 标签,还可以定位 button 按钮,input标签value值
# coding=utf-8
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:# 创建服务器对象(指定浏览器驱动)# browser = p.chromium.launch() # 不填写参数表示从计算机环境变量读取chromium驱动,启动无头模式(无界面版)browser = p.chromium.launch(headless=False,executable_path="C:\\Users\\19076\AppData\Local\Google\Chrome\Application\chrome.exe")# 创建一个窗口context = browser.new_context()# 在此窗口创建一个标签页page = context.new_page()page.goto("https://www.baidu.com/")print(page.title())# <a>标签# page.click('text=新闻')# <input type=button value="百度一下">,input标签value值# <button>百度一下</button> button标签page.click("text=百度一下")page.wait_for_timeout(5000)# 一定不要忘记关闭对象page.close()context.close()browser.close()
Selector 选择器组合定位
查找目标元素
不同的selector可组合使用,用>>
连接
# id 属性+ css
page.fill('form >> [name="username"]', "super")
page.fill('form >> #password', "a123456.")
page.click("text=立即登录")# form >> [name="username"] 定位方式等价于# page.fill('form >> [name="username"]', "super")
# page.locator("form").locator('[name="username"]').fill("super")
相当于是根据父元素找到子元素了
登录按钮的值是value="立即登录 > "
,可以用text文本定位的方式,模糊匹配到,这个人性化的设计提高了定位的效率。
<input class="btn btn-success btn-block" id="loginBtn" type="submit" value="立即登录 > ">
内置定位器
这些是 playwright 推荐的内置定位器。
- page.get_by_role()通过显式和隐式可访问性属性进行定位。
- page.get_by_text()通过文本内容定位。
- page.get_by_label()通过关联标签的文本定位表单控件。
- page.get_by_placeholder()按占位符定位输入。
- page.get_by_alt_text()通过替代文本定位元素,通常是图像。
- page.get_by_title()通过标题属性定位元素。
- page.get_by_test_id()根据data-testid属性定位元素(可以配置其他属性)。
使用示例
page.get_by_label("User Name").fill("John")
page.get_by_label("Password").fill("secret-password")
page.get_by_role("button", name="Sign in").click()
expect(page.get_by_text("Welcome, John!")).to_be_visible()
元素操作
1、输入文字(fill)
适用于:<input>
,<textarea>
或[contenteditable],其他类型的会报错,page、element、frame都可以使用fill方法
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False,slow_mo=1000)page = browser.new_page()page.goto("https://www.baidu.com")#页面直接调用fill方法page.fill("#kw", "playwright") #向百度搜索框输入playwright#元素调用fill方法 element_handle = page.query_selector("#kw")element_handle.fill("playwright") #向百度搜索框输入playwright
2、模拟键盘挨个输入字符(type)
我们也可以在type方法中增加delay参数,设置每个字符之间输入的延迟。page、element、frame都可以使用type方法。不适用于ctrl、enter等特殊键
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False,slow_mo=1000)page = browser.new_page()page.goto("https://www.baidu.com")page.type("#kw", "哈哈哈")
3、模拟键盘按键操作(press)
模拟键盘上的每个按键,也支持Control+c等组合按键,不支持连续按键(例如先按a、再按b)
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False,slow_mo=1000)page = browser.new_page()page.goto("https://www.baidu.com")page.type("#kw", "enter")#模拟键盘挨个输入字符page.press("#kw", "Control+a") #模拟ctrl+a键page.press("#kw", "Control+x")
4、聚焦到某个元素(focus)
page.focus('元素')
5、鼠标点击(click)
page.click("元素")
selector参数:指定元素
button:右击、左击、中建 "left", "middle", "right",默认左
click_count:点击次数
6、鼠标双击(dbclick)
page.dbclick("元素")
7、鼠标悬浮(hover)
page.hover('#item')
8、操作复选框和单选框(check、uncheck)
适用于input[type=checkbox]
,input[type=radio]
,[role=checkbox]
或label
与复选框或单选按钮相关联
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False,slow_mo=1000)context = browser.new_context()page = context.new_page()page.goto('https://passport.baidu.com/v2/?login') #进入百度的登录页面with context.expect_page() as new_page_info:page.click("#TANGRAM__PSP_3__regLink")#点击我要注册new_page = new_page_info.valuenew_page.check("#TANGRAM__PSP_4__isAgree") #选择同意协议
9、操作复选框和单选框(select_option)
适用于在<select>
元素中选择一个或多个选项
相关文章:
playwright 学习复仇记-2 Selector选择器定位元素
前言 Selector 选择器,也就是通常说的元素定位了,页面上点点点的操作,都是基于元素定位,所以这块是重点需要学的核心内容。 Selector 选择器 说到元素定位,大家肯定会首先想到 selenium 的八大元素定位,其…...
C语言——实现计算房屋总价
//功能:计算房屋总价 //房屋总价 房屋面积 * 单价 //契税 房屋总价 * 0.15% //印花税 房屋总价 * 0.05% //功能:计算房屋总价 //房屋总价 房屋面积 * 单价 //契税 房屋总价 * 0.15% //印花税 房屋总价 * 0.05%#include<stdio.h>void main()…...
Vue3 脚手架扩展
当 yarn dev 运行成功后,我们继续添加扩展 首先我们要安装一些依赖 其中的vue-router和vuex安装最新版的就行,因为项目是vue3 element-plus和less,less-loader最好按照我这个版本来下载 element-plus是一个vue常用的ui组件库 element-plus/…...
Ubuntu 20.04 程序运行导致“段错误 (核心已转储)”的原因分析及解决方案 ubuntu
Ubuntu 20.04 程序运行导致“段错误 (核心已转储)”的原因分析及解决方案 在Ubuntu 20.04系统中,运行程序时出现“段错误 (核心已转储)”是一种常见的错误提示。本文将详细解析导致段错误的原因,并提供完整的解决方案,辅以示例说明ÿ…...
Mysql常用sql语句
数据库操作 # 创建数据库 create database 库名 charsetutf8; # 使用数据库 use 库名; # 退出数据库 quit # 查看所有数据库 show databases; # 查看当前使用的数据库 select database(); # 删除数据库 drop database 库名; 表操作 #查看当前数据库中所有表 show tables;#创…...
SpringBoot 架构下的在线家具商城:规划与实践之路
第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和笔记本的广泛运用,以及各种计算机硬件的完善和升…...
request和websocket
当然,可以为你详细介绍 FastAPI 中的 Request 对象。Request 对象在 FastAPI 中扮演着重要的角色,负责封装来自客户端的 HTTP 请求信息。了解 Request 对象的使用方法和属性,有助于你更高效地处理请求数据、访问请求上下文以及进行各种操作。…...
前端【9种前端常见的设计模式】
🌟9种前端常见的设计模式 哈喽小伙伴们,这期给大家整理了一些有关9种前端常见的设计模式,覆盖多方面基础知识,建议大家收藏阅读。 文章目录 🌟9种前端常见的设计模式🌟1. 外观模式🌟 2. 代理模…...
IDEA使用HotSwapHelper进行热部署
目录 前言JDK1.8特殊准备DECVM安装插件安装与配置参考文档相关下载 前言 碰到了一个项目,用jrebel启动项目时一直报错,不用jrebel时又没问题,找不到原因,又不想放弃热部署功能 因此思考能否通过其他方式进行热部署,找…...
【Django-xadmin】
时间长不用,会忘的系列 1、Django-xadmin后台字段显示处理 主要是修改每个模块下adminx.py文件 代码解释:第1行控制表单字段显示第2行控制列表字段显示第3行控制搜索条件第4行控制过滤条件第5行支持单个或多个字段信息修改第6行列表分页,每页显示多少行…...
AI 计算基础设施的战略转折点分析
核心技术范式转移 我们正处于计算架构的重大转折点。第一个根本性转变是从传统的 CPU 编程范式,向以 GPU 为核心的神经网络运算模式转移。这不仅仅是硬件架构的改变,更代表了整个软件开发和应用部署方式的革新。第二个转变则是在这个新的基础设施之上&a…...
Java基于SpringBoot+Vue的IT技术交流和分享平台(附源码+lw+部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
二:OpenStack环境准备-controller node
一:工具、环境准备-controller node 二:OpenStack环境准备-controller node 三:安装服务-controller node 四:工具、环境准备-compute node 五:OpenStack环境准备-compute node 六:安装服务-compute node 七…...
解决stable-diffusion-webui时的问题:No module ‘xformers‘. Proceeding without it
p.s 被另一篇文章坑了,装个xformers把我原先的pytorch降智了&%$^# 注意:!!!xformers非强制安装;可优化显存,提高性能和出图速率,对于GPU能力有限的用户很有用;安装过…...
清理Linux/CentOS7根目录的思路
在使用Linux服务器过程中,经常会遇到磁盘空间不足的问题,好多应用默认安装在根目录下,记录一下如何找到问题所在,清理根目录(/) 1. 检查空间使用情况 1.1 查看分区占用: df -h输出࿱…...
人工智能-深度学习-BP算法
BP算法的核心思想是通过计算损失函数对网络参数的梯度,然后使用梯度下降法来更新网络参数,从而最小化损失函数。 误差反向传播算法(BP)的基本步骤: 前向传播:正向计算得到预测值。 计算损失:通过损失函数计算预测值和真实值的差…...
C++小问题
怎么分辨const修饰的是谁 是限定谁不能被改变的? 在C中,const关键字的用途和位置非常关键,它决定了谁不能被修改。const可以修饰变量、指针、引用等不同的对象,并且具体的作用取决于const的修饰位置。理解const的规则能够帮助我们…...
如何让控件始终处于父容器的居中位置(父容器可任意改变大小)
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在C#开发winform程序的时候,有时候需要将一个控件居中显示,…...
Python 调用 Umi-OCR API 批量识别图片/PDF文档数据
目录 一、需求分析 二、方案设计(概要/详细) 三、技术选型 四、OCR 测试 Demo 五、批量文件识别完整代码实现 六、总结 一、需求分析 市场部同事进行采购或给客户报价时,往往基于过往采购合同数据,给出现在采购或报价的金额…...
Java基础访问修饰符全解析
一、Java 访问修饰符概述 Java 中的访问修饰符用于控制类、方法、变量和构造函数的可见性和访问权限,主要有四种:public、protected、default(无修饰符)和 private。 Java 的访问修饰符在编程中起着至关重要的作用,它…...
朗迪锋亮相2024人因工程与智能系统交互国际会议
2024年11月28日至30日,2024人因工程与智能系统交互国际会议在深圳隆重举办。此次大会以推动我国人因工程学科发展为目标,致力于加强国际学术交流,深入探讨人工智能时代的智能系统交互,旨在培育新质生产力,助力经济社会…...
OpenGL学习过程总结
1、矩阵 参考链接 第三课:矩阵变换...
webGL入门教程_06变换矩阵与绕轴旋转总结
变换矩阵与绕轴旋转总结 目录 1. 变换矩阵简介2. 平移矩阵3. 缩放矩阵4. 旋转矩阵 4.1 绕 Z 轴旋转4.2 绕 X 轴旋转4.3 绕 Y 轴旋转 5. 组合变换矩阵6. 结论 1. 变换矩阵简介 在计算机图形学中,变换矩阵用于在三维空间中对物体进行操作,包括ÿ…...
mysql 查询所有的触发器
SELECTTRIGGER_SCHEMA AS Database,TRIGGER_NAME AS Trigger,EVENT_OBJECT_TABLE AS Table,EVENT_MANIPULATION AS Event,ACTION_STATEMENT AS Statement FROMinformation_schema.TRIGGERS;创建触发器遇到报错: You do not have the SUPER privilege and binary lo…...
基于Java Springboot个人财务APP且微信小程序
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…...
GateWay使用手册
好的,下面是优化后的版本。为了提高可读性和规范性,我对内容进行了结构化、简化了部分代码,同时增加了注释说明,便于理解。 1. 引入依赖 在 pom.xml 中添加以下依赖: <dependencies><!-- Spring Cloud Gate…...
go语言读取yaml配置文件内容
1、config.yaml配置文件内容假设如下 name: "example" version: 1.0 settings:timeout: 30debug: truefeatures:- feature1- feature22、定义结构体 go语言定义结构体匹配yaml内容 package mainimport ("fmt""log""os""gopkg.…...
Proteus8.17下载安装教程
Proteus是一款嵌入式系统仿真开发软件,实现了从原理图设计、单片机编程、系统仿真到PCB设计,真正实现了从概念到产品的完整设计,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,能够帮助用…...
【AI】Sklearn
长期更新,建议关注、收藏、点赞。 友情链接: AI中的数学_线代微积分概率论最优化 Python numpy_pandas_matplotlib_spicy 建议路线:机器学习->深度学习->强化学习 目录 预处理模型选择分类实例: 二分类比赛 网格搜索实例&…...
图数据库 | 10、图数据库架构设计——高性能图存储架构(上)
老夫在之前的三大篇内容中,介绍了图数据库的三大组件—图计算、图存储以及图查询语言。(都归拢在图数据库原理、架构与应用这个专栏中了,感兴趣的朋友可以在去找阅读。) 接下来,老夫还将继续深化这三大组件࿰…...
el-table 组件二次封装(vue2)
PublicTable.vue <!-- 公共表格组件 --> <template><div class"table-common"><el-table v-loading"loading" :ref"tableid" border style"width: 100%" :data"tableDatas" :row-key"rowKey&quo…...
张量并行和流水线并行在Transformer中的具体部位
目录 张量并行和流水线并行在Transformer中的具体部位 一、张量并行 二、流水线并行 张量并行和流水线并行在Transformer中的具体部位 张量并行和流水线并行是Transformer模型中用于提高训练效率的两种并行策略。它们分别作用于模型的不同部位,以下是对这两种并行的具体说…...
详解Qt pdf 之QPdfSelection 选择文本类
文章目录 QPdfSelection 类详解前言 详细说明公共函数说明1. 构造函数2. text3. boundingRect4. isEmpty5. startPage6. endPage 使用场景示例代码代码说明总结 QPdfSelection 类详解 前言 QPdfSelection 是 Qt PDF 模块中的一个类,用于表示在 PDF 文档中被选中的…...
一款支持80+语言,包括:拉丁文、中文、阿拉伯文、梵文等开源OCR库
大家好,今天给大家分享一个基于PyTorch的OCR库EasyOCR,它允许开发者通过简单的API调用来读取图片中的文本,无需复杂的模型训练过程。 项目介绍 EasyOCR 是一个基于Python的开源项目,它提供了一个简单易用的光学字符识别ÿ…...
matlab 中的 bug
在matlab中绘图,设置 axe 的背景颜色 axes_in3.Color #00235B ;打印的时候 print(figure_handle1,-dpng,-r300,"merge_yt_ey") ;此时保存的图片无法识别背景颜色 原因在于 matlab 中的 InverseHardcopy 将 InvertHardcopy 设置成 off 则可以解决这个问…...
【算法刷题指南】优先级队列
🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…...
android user版本默认usb模式为充电模式
android插入usb时会切换至默认设置的模式,debug版本为adb,user版本为mtp protected long getChargingFunctions() {// if ADB is enabled, reset functions to ADB// else enable MTP as usual.if (isAdbEnabled()) {return UsbManager.FUNCTION_ADB;} e…...
[极客大挑战 2019]HardSQL--详细解析
信息搜集 登录系统,有两个可能的注入点: 随便输一下看看传参类型: 都是GET型。 SQL注入 传参 usernameadmin’&password123 传参 usernameadmin&password123’ username和password传参,四种闭合方式只有单引号报错&a…...
java基础概念46-数据结构1
一、引入 List集合的三种实现类使用了不同的数据结构! 二、数据结构的定义 三、常见的数据结构 3-1、栈 特点:先进后出,后进先出。 java内存容器: 3-2、队列 特点:先进先出、后进后出。 栈VS队列-小结 3-3、数组 3-…...
数学建模选MATLAB还是Python?
在进行数学建模时,选择合适的编程语言和工具对于建模的效率和效果至关重要。目前,MATLAB和Python是两个常用的数学建模工具,它们各自有优缺点,适用于不同的场景。本文将从多个维度对MATLAB和Python进行比较,帮助大家做…...
【C++】多线程
目录 一 概念 1 多线程 2 多进程与多线程 3 多线程理解 二 创建线程 1 thread 2 join() 和 detach() 3 this_thread 三 std::mutex 1 lock 和 unlock 2 lock_guard 3 unique_lock 四 condition_variable 五 std::atomic 一 概念 1 多线程 在C11之前࿰…...
【计算机网络】实验2:总线型以太网的特性
实验 2:总线型以太网的特性 一、 实验目的 加深对MAC地址,IP地址,ARP协议的理解。 了解总线型以太网的特性(广播,竞争总线,冲突)。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实…...
基于Matlab合成孔径雷达(SAR)回波信号建模与多指标质量评估
本研究基于合成孔径雷达(SAR)技术,建立了一个雷达回波信号的模拟模型,并通过多项评价指标对信号质量进行深入评估。首先,研究定义了与SAR系统相关的关键物理参数,如工作频率、平台速度、脉冲宽度、采样率等…...
spring boot3.3.5 logback-spring.xml 配置
新建 resources/logback-spring.xml 控制台输出颜色有点花 可以自己更改 <?xml version"1.0" encoding"UTF-8"?> <!--关闭文件扫描 scanfalse --> <configuration debug"false" scan"false"><springProperty …...
浅谈C#库之DevExpress
一、DevExpress库介绍 DevExpress是一个功能强大、界面美观的UI组件库,广泛应用于桌面应用程序和Web应用程序的开发中。它提供了丰富的控件和工具,帮助开发人员快速构建现代化的用户界面。DevExpress控件库以其功能丰富、应用简便、界面华丽以及方便定制…...
【webApp之h5端实战】项目基础结构搭建及欢迎页面的实现
这是一个实战项目的webapp,主要是使用原生js/css/html来实现我们的业务。预览下面的实战效果,我们将会从0到1实现这个系列的项目。包括大量的原生js知识,css3动画的开发,以及页面的交互实现。 效果预览 项目准备工作 封装的工具类,用于获取原生dom节点,处理原生dom事件的…...
生成树详解(STP、RSTP、MSTP)
目录 1、STP 1.概述 2.基本概念 3.端口角色及其作用 4.报文结构 5.STP的端口状态 6.三种定时器 7.STP选举步骤 8.配置BPDU的比较原则 9.TCN BPDU 10.临时环路的问题 11.传统STP的不足 拓扑变更处理过程 2、RSTP 1.端口角色 2.端口状态 3.P/A(Propo…...
C++趣味编程:基于树莓派Pico的模拟沙漏-倾斜开关与LED的互动实现
沙漏,作为一种古老的计时工具,利用重力让沙子通过狭小通道,形成了计时效果。在现代,我们可以通过电子元件模拟沙漏的工作原理。本项目利用树莓派Pico、倾斜开关和LED,实现了一个电子沙漏。以下是项目的详细技术解析与C++代码实现。 一、项目概述 1. 项目目标 通过倾斜开关…...
Matlab Simulink 电力电子仿真-单相电压型半桥逆变电路分析
目录 一、单相电压型半桥逆变电路仿真模型 1.电路模型 2.电路模型参数 二、仿真分析 三、总结 1.优缺点 2.应用场景 一、单相电压型半桥逆变电路仿真模型 1.电路模型 单相电压型半桥逆变电路是一种常见的逆变电路,主要用于将直流电源转换为交流电源。 &…...
在超表面中琼斯矩阵的使用
琼斯矩阵(Jones Matrix) 是一种线性代数方法,用于描述光的偏振状态和偏振变化,是偏振光学中重要的数学工具。它在 超表面理论设计 中广泛应用,尤其是在设计和调控光与物质相互作用时,例如偏振控制、相位调制…...