playwright 学习复仇记-2 Selector选择器定位元素

news2024/12/24 21:33:13

前言

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_playwright


with 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_playwright


with 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_playwright


with 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 选择器组合定位

查找目标元素

python+playwright 学习-2.Selector 选择器定位元素_百度_03

不同的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_playwright

with 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_playwright

with 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_playwright

with 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_playwright

with 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.value
        new_page.check("#TANGRAM__PSP_4__isAgree") #选择同意协议

9、操作复选框和单选框(select_option)

适用于在<select>元素中选择一个或多个选项

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

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

相关文章

【Delphi】modbus-TCP 协议库

在日常开发中&#xff0c;也会遇到使用modbus的部件&#xff0c;比如温度控制器、读卡器等等&#xff0c;那么使用Delphi开发&#xff0c;也就必须遵守modbus-TCP协议&#xff0c;如果自己使用TCP控件写也没有问题&#xff0c;不过如果有开源的三方库&#xff0c;别人已经调试过…

深度神经网络模型压缩学习笔记一:模型压缩概述

文章目录 一、模型压缩主要常用方法1&#xff09;量化&#xff08;1&#xff09;scale和Qint8的计算、对称性和非对称性量化&#xff08;2&#xff09;静态量化和动态量化&#xff08;3&#xff09;量化粒度选择和PTQ\QAT分类&#xff08;4&#xff09;模型量化技术为什么会带来…

架构师:Dubbo 服务请求失败处理的实践指南

1、简述 在分布式服务中,服务调用失败是不可避免的,可能由于网络抖动、服务不可用等原因导致。Dubbo 作为一款高性能的 RPC 框架,提供了多种机制来处理服务请求失败问题。本文将介绍如何在 Dubbo 中优雅地处理服务请求失败,并结合具体实践步骤进行讲解。 2、常见处理方式 …

YoloV10-yaml文件理解

最近在学习和尝试改进yolov结记录一下原始代码的理解,希望大佬指正.10,在这里总 [1] 论文&#xff1a;https://arxiv.org/abs/2405.14458 [2] 代码&#xff1a;GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024] YOLOv10的新特性 1. 无…

Flutter:city_pickers省市区三级联动

pubspec.yaml city_pickers插件地址 自己用的GetBuilder页面模板 cupertino_icons: ^1.0.8 # 省市区城市选择 city_pickers: ^1.3.0编辑地址页面&#xff1a;controller class AddressEditController extends GetxController {AddressEditController();Future<Result?>…

【C语言】结构体(一)

一&#xff0c;是什么 结构体就是一些值的集合&#xff0c;这些值称为成员变量。 结构体的每个成员可以是不同类型的变量。说到集合&#xff0c;数组也是集合&#xff0c;但是不同的是数组只能是相同类型元素的集合。 二&#xff0c;结构体的声明 struct tag {   member1;…

请求头referer #号后的截掉了

解决办法&#xff1a; 用传参方式不要用refer和Refer&#xff0c;用其它名字

PostgreSQL最常用数据类型-重点说明自增主键处理

简介 PostgreSQL提供了非常丰富的数据类型&#xff0c;我们平常使用最多的基本就3类&#xff1a; 数字类型字符类型时间类型 这篇文章重点介绍这3中类型&#xff0c;因为对于高并发项目还是推荐&#xff1a;尽量使用简单类型&#xff0c;把运算和逻辑放在应用中&#xff0c;…

【深度学习】四大图像分类网络之ResNet

ResNet网络是在2015年由微软实验室中的何凯明等几位提出&#xff0c;在CVPR 2016发表影响深远的网络模型&#xff0c;由何凯明团队提出来&#xff0c;在ImageNet的分类比赛上将网络深度直接提高到了152层&#xff0c;前一年夺冠的VGG只有19层。斩获当年ImageNet竞赛中分类任务第…

基于树莓派的安保巡逻机器人--项目介绍

目录 一、项目简介 二、项目背景 三、作品研发技术方案 作品主要内容&#xff1a; 方案的科学性 设计的合理性 四、作品创新性及特点 五、作品自我评价 本篇为项目“基于树莓派的安保巡逻机器人”介绍博客 演示视频链接&#xff1a; 基于树莓派的安保巡逻机器人_音游…

nn.RNN解析

以下是RNN的计算公式,t时刻的隐藏状态H(t)等于前一时刻隐藏状态H(t-1)乘以参数矩阵&#xff0c;再加t时刻的输入x(t)乘以参数矩阵&#xff0c;最后再通过激活函数&#xff0c;等到t时刻隐藏状态。 下图是输出input和初始化的隐藏状态&#xff0c;当参数batch_first True时候&…

Unity网络框架对比 Mirror|FishNet|NGO

在Unity中制作非单机项目常用的免费网络框架&#xff0c;这里选取了三款比较火的网络框架&#xff0c;Mirror、FishNet和Netcode for GameObject(NGO)。 比较了最常用的免费网络解决方案。可能还有值得探索的付费选项。您需要对此进行自己的研究。数据表格更新日志截止到&#…

【C++】深度剖析 scanf 函数:原理、应用与优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;scanf 函数的基本原理&#x1f4af;基本用法示例常见占位符示例 &#x1f4af;使用 scanf 时的注意事项&#x1f4af;引入 cstdio 头文件&#x1f4af;scanf 与 cin 的对比…

YOLOv1 (You Only Look Once)

YOLO (You Only Look Once) 是一种经典的目标检测算法&#xff0c;旨在通过一个统一的卷积神经网络&#xff08;CNN&#xff09;进行目标检测&#xff0c;最大化检测速度并保持较高的精度。YOLO 在目标检测领域产生了巨大的影响&#xff0c;并且经过了多个版本的迭代。下面是 Y…

【Verilog】实验二 数据选择器的设计与vivado集成开发环境

目录 一、实验目的 二、实验环境 三、实验任务 四、实验原理 五、实验步骤 top.v mux2_1.v 一、实验目的 1. 掌握数据选择器的工作原理和逻辑功能。 2. 熟悉vivado集成开发环境。 3. 熟悉vivado中进行开发设计的流程。 二、实验环境 1. 装有vivado的计算机。 2. Sw…

【CSS in Depth 2 精译_063】10.2 深入理解 CSS 容器查询中的容器

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 10.1.1 容器尺寸查询的用法 10.2 深入理解容器 ✔️ 10.2.1 容器的类型 ✔️10.2.2 容器的名称 ✔️10.2.3 容器与模块化 CSS ✔️ 10.3…

今天我们来聊聊Maven中两个高级的概念—— 插件和目标

插件&#xff08;plugin&#xff09; Maven的核心是一个插件执行框架;所有的工作都是由插件完成的。 Maven中Plugin分为两种类型&#xff1a; build类型Plugin只能在build阶段执行&#xff0c;在POM中需要在 <build/> 标签下进行配置。 reporting类型&#xff1a;在si…

【触想智能】自动售票机选择工控一体机配套的原因分析

自动售票机是现代公共交通系统中常见的设备之一&#xff0c;它能够方便、快速地为乘客提供票务服务。为了实现高效、可靠的运营&#xff0c;许多自动售票机都采用工控一体机作为核心控制硬件。 触想工控一体机TPC-W200系列 下面&#xff0c;触想智能小编为大家分析为什么自动售…

[计算机网络] HTTP/HTTPS

一. HTTP/HTTPS简介 1.1 HTTP HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模型之上&#xff0c;通常使用端口 …

element-ui的下拉框报错:Cannot read properties of null (reading ‘disabled‘)

在使用element下拉框时&#xff0c;下拉框option必须点击输入框才关闭&#xff0c;点击其他地方报错&#xff1a;Cannot read properties of null (reading disabled) 造成报错原因&#xff1a;项目中使用了el-dropdown组件&#xff0c;但是在el-dropdown里面没有定义el-dropdo…