【python自动化】Playwright基础教程(九)-悬浮元素定位自定义ID定位组合定位断言

news2024/11/25 4:03:27

【python自动化】Playwright基础教程(九)-悬浮元素定位&自定义ID定位&组合定位&断言

本文目录

文章目录

  • 【python自动化】Playwright基础教程(九)-悬浮元素定位&自定义ID定位&组合定位&断言
    • playwright系列回顾
    • 前文代码
    • 悬浮元素定位
      • 定位方式一
      • 定位方式二
      • 定位方式三(推荐)
    • 自定义ID定位
      • 官方方式
      • 我的实用方式
    • 组合定位
      • _and
      • _or
    • 其他定位
    • 断言
      • 断言列表

playwright系列回顾

playwright连接已有浏览器操作

selenium&playwright获取网站Authorization鉴权实现伪装requests请求

【python自动化】playwright长截图&切换标签页&JS注入实战

【python自动化】Playwright基础教程(二)快速入门

【python自动化】Playwright基础教程(三)定位操作

【python自动化】Playwright基础教程(四)事件操作①元素高亮&元素匹配器

【python自动化】Playwright基础教程(五)事件操作②悬停&输入&清除精讲

前文代码

直接定位指定浏览器

class Demo05:
    def __init__(self):
        """
        使用playwright连接谷歌浏览器
        :return:
        """
        self.playwright = sync_playwright().start()
        # 连接已经打开的浏览器,找好端口
        browser = self.playwright.chromium.connect_over_cdp("http://127.0.0.1:9223")
        self.default_context = browser.contexts[0]
        self.page = self.default_context.pages[0]

启动新的浏览器

class Demo06:
    def __init__(self, url):
        playwright = sync_playwright().start()
        browser = playwright.chromium.launch(headless=False)
        context = browser.new_context()
        self.page = context.new_page()
        self.page.goto(url)
       
        
if __name__ == '__main__':
    mwj = Demo05(url="指定的url")
    mwj.Locator_testid()

悬浮元素定位

image-20230914152823495

当我们打开F12进行元素定位时,如果定位的是悬浮元素(有hover样式),鼠标想要定位是很恼火的。你上去,他出现,你要定位他不见。

这里我介绍三种方法,我经常使用的是第三种,前面两种作为了解即可。

定位方式一

  • 打开F12,鼠标悬浮在目标元素上
  • 单击鼠标右键,点击键盘上的N
  • 此时可以看到Elements已经快速定位到了目标元素。

缺点:你鼠标一动,元素定位就没了(气不气,气不气?!),元素定位我总不能去截图手打吧阿伟!

定位方式二

  • 打开F12,鼠标悬浮在目标元素上
  • 按下ctrl + shift + c
  • 此时可以看到Elements已经快速定位到了目标元素。

缺点:你鼠标一动,元素定位就没了(气不气,气不气?!),元素定位我总不能去截图手打吧阿伟!

定位方式三(推荐)

优点:你把鼠标点烂,把它从20楼丢下去,元素定位就在那,他不动,我说的偶像!

  • F12打开浏览器的调试页面
  • 点击源代码Sources
  • 右侧找到事件监听器断点(Event Listener breakpoints), 点开
  • 找到Mouse, 点开
  • 找到click,勾上

image-20230914160247093

这时候你把鼠标悬浮到要定位的元素上,点击鼠标左键,这时候整个页面的事件就会被冻住,你就可以点回到Elements用定位方式进行定位,元素一直在那不会消失。

如果这次定位结束,那记得把刚刚勾选的内容取消掉,不然页面就一直在debug调试状态咯。

自定义ID定位

官方方式

get_by_test_id

网页代码

自己新建个html文件写入testID.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>点击变色</title>
    <style>
        #colorButton {
            width: 100px;
            height: 50px;
            background-color: red;
        }
    </style>
</head>
<body>
    <button id="colorButton" data-testid="xiaozai">梦无矶</button>

    <script>
        const colorButton = document.getElementById('colorButton');
        let isRed = true;

        function toggleColor() {
            if (isRed) {
                colorButton.style.backgroundColor = 'green';
                isRed = false;
            } else {
                colorButton.style.backgroundColor = 'red';
                isRed = true;
            }
        }

        colorButton.addEventListener('click', toggleColor);

        // 通过data-testid属性获取按钮
        const buttonWithTestId = document.querySelector('[data-testid="xiaozai"]');
        buttonWithTestId.addEventListener('click', toggleColor);
    </script>
</body>
</html>

上面代码实现的功能是,点击按钮变色,红色绿色交替,元素的属性为data-testid="xiaozai"

按照官方的方法来写python代码

第一步先要进行注册test_id,使用selectors.set_test_id_attribute

第二步用get_by_test_id进行定位这个id的值

直接定位指定浏览器

class Demo05:
    def __init__(self):
        """
        使用playwright连接谷歌浏览器
        :return:
        """
        self.playwright = sync_playwright().start()
        # 连接已经打开的浏览器,找好端口
        browser = self.playwright.chromium.connect_over_cdp("http://127.0.0.1:9223")
        self.default_context = browser.contexts[0]
        self.page = self.default_context.pages[0]
        
    def Locator_testid(self):
        self.playwright.selectors.set_test_id_attribute("data-testid")
        self.page.get_by_test_id("xiaozai").click()

启动新的浏览器

class Demo06:
    def __init__(self, url):
        playwright = sync_playwright().start()
        browser = playwright.chromium.launch(headless=False)
        context = browser.new_context()
        self.page = context.new_page()
        self.page.goto(url)
        
    def Locator_testid(self):
        self.playwright.selectors.set_test_id_attribute("data-testid")
        self.page.get_by_test_id("xiaozai").click()
        
if __name__ == '__main__':
    mwj = Demo05(url=r"file:///D:/L_Learning/MyLearningCode/learn_playwright/playwright_demo/testID.html")
    mwj.Locator_testid()

我的实用方式

class Demo05:
    def __init__(self):
        """
        使用playwright连接谷歌浏览器
        :return:
        """
        self.playwright = sync_playwright().start()
        # 连接已经打开的浏览器,找好端口
        browser = self.playwright.chromium.connect_over_cdp("http://127.0.0.1:9223")
        self.default_context = browser.contexts[0]
        self.page = self.default_context.pages[0]
        
    def Locator_testid(self):
        sself.page.locator("[data-testid='xiaozai']").click()

组合定位

_and

更新于1.34版本

方法 locator.and_() 通过匹配其他定位器来缩小现有定位器的范围。例如,您可以将 page.get_by_role() 和 page.get_by_title() 组合在一起,以按标题和标签角色进行匹配。

button = page.get_by_role("button").and_(page.getByTitle("Subscribe"))

_or

如果要定位两个或多个元素中的一个,并且不知道它将是哪个元素,请使用 locator.or_() 创建与任何替代元素匹配的定位器。

官方示列:您想单击“新电子邮件”按钮,但有时会显示安全设置对话框。在这种情况下,您可以等待“新电子邮件”按钮或对话框并采取相应措施。

new_email = page.get_by_role("button", name="New")
dialog = page.get_by_text("Confirm security settings")
expect(new_email.or_(dialog)).to_be_visible()

其他定位

官方文档:Other locators | Playwright Python

这些方式比较偏底层,适用于框架级别代码编写。

官方示列:点击某元素附近的元素

# Fill an input to the right of "Username".
page.locator("input:right-of(:text(\"Username\"))").fill("value")

# Click a button near the promo card.
page.locator("button:near(.promo-card)").click()

# Click the radio input in the list closest to the "Label 3".
page.locator("[type=radio]:left-of(:text(\"Label 3\"))").first.click()

断言

官方文档:https://playwright.dev/python/docs/test-assertions

如果你使用pytest结合的方式运行playwright,前提是下载了pytest-playwright库,可以进行相关的断言操作。

比如:断言页面上梦无矶元素是否可见,最长的等待时间为3秒。

expect(page.get_by_text("梦无矶").last).to_be_visible(timeout=3000)

断言列表

AssertionDescription翻译
expect(locator).to_be_checked()Checkbox is checked复选框已被勾选
expect(locator).to_be_disabled()Element is disabled元素已被禁用
expect(locator).to_be_editable()Element is editable元素是可编辑的
expect(locator).to_be_empty()Container is empty容器为空
expect(locator).to_be_enabled()Element is enabled元素启用
expect(locator).to_be_focused()Element is focused元素被聚焦
expect(locator).to_be_hidden()Element is not visible元素不可见
expect(locator).to_be_visible()Element is visible元素可见
expect(locator).to_contain_text()Element contains text元素包含文本
expect(locator).to_have_attribute()Element has a DOM attribute元素有一个DOM属性
expect(locator).to_have_class()Element has a class property元素有一个class属性
expect(locator).to_have_count()List has exact number of children列表中有确切的子元素数目
expect(locator).to_have_css()Element has CSS property元素具有CSS属性
expect(locator).to_have_id()Element has an ID元素有一个ID
expect(locator).to_have_js_property()Element has a JavaScript property元素有一个JavaScript属性
expect(locator).to_have_text()Element matches text元素匹配文本
expect(locator).to_have_value()Input has a value输入有一个值
expect(locator).to_have_values()Select has options selectedSelect已选择选项
expect(page).to_have_title()Page has a titlepage有一个标题
expect(page).to_have_url()Page has a URLpage有一个URL
expect(api_response).to_be_ok()Response has an OK status响应状态为OK

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

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

相关文章

Egg.js 中 Service 的使用

Service 服务 Service是用来编写和数据库直接交互的业务逻辑代码。Service就是在复杂业务场景下用于做业务逻辑封装的一个抽象层。 简单来说&#xff0c;就是把业务逻辑代码进一步细化和分类&#xff0c;所以和数据库交互的代码都放到Service中。这样作有三个明显的好处。 保…

学会这10个Fluent仿真优化技巧,效率蹭蹭蹭

ANSYS Fluent 是计算流体动力学 (CFD) 仿真的强大工具&#xff0c;使工程师和科学家能够分析和预测各种应用中的流体行为。然而&#xff0c;运行模拟可能需要大量计算&#xff0c;因此优化设置对于在最短的时间内获得最准确的结果非常重要。 Fluent对电脑配置要求高&#xff1f…

server2008、2016远程桌面授权的激活方法

远程桌面服务安装好之后使用的是120天临时授权&#xff0c;所以会跳出以下提示&#xff0c;我们介绍远程桌面授权的激活。 现在我们使用命令 mstsc /admin 强制登录服务器 需要在“远程桌面服务”--安装“远程桌面授权”--默认安装 “计算机”单击右键“管理”--“角色” 默认…

css实现鼠标悬停时元素的显示与隐藏

css实现鼠标悬停时元素的显示与隐藏 跟着B站黑马学习小兔鲜项目&#xff0c;有个点记录一下 就是当鼠标悬浮在商品列表上时&#xff0c;列表中的商品会显示出来&#xff0c;离开时&#xff0c;商品隐藏&#xff0c;如下&#xff1a; 感觉这个功能经常会遇到&#xff0c;但一直…

浅析网络协议-HTTP协议

1.HTTP简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图…

微信动态表情包怎么做?微信动态表情包做法

在使用手机微信聊天时经常会使用各种各样的动态表情包来增加聊天的欢乐气氛。这种动态的表情包要比静态的表情画面更丰富。那么&#xff0c;如何制作表情包呢&#xff1f;很简单&#xff0c;通过使用在线制作动画&#xff08;https://www.gif.cn/&#xff09;工具-GIF中文网&am…

Illumination Adaptive Transformer

Abstract. 现实世界中具有挑战性的照明条件&#xff08;低光、曝光不足和曝光过度&#xff09;不仅会产生令人不快的视觉外观&#xff0c;还会影响计算机视觉任务。现有的光自适应方法通常单独处理每种情况。更重要的是&#xff0c;它们中的大多数经常在 RAW 图像上运行或过度…

arcgis--NoData数据处理

方法一&#xff1a;利用【栅格计算器】可以对NoData的值进行修改。【Spatial Analyst工具】-【地图代数】-【栅格计算器】&#xff0c;将NoData修改为某一个值。 方法二&#xff1a;先对原始数据进行重分类&#xff0c;分成1类&#xff0c;将NoData赋值为2,。然后&#xff0c;将…

USB拦截工具

USB 闪存驱动器对组织的安全和数据构成了独特的威胁。它们的便携性和充足的存储容量使它们成为数据盗窃的便捷媒介。 什么是 USB 拦截器 USB&#xff08;通用串行总线&#xff09;阻止程序用于禁用插入可移动存储设备的端口&#xff0c;便携性和充足的存储容量使 USB 成为可能…

运行pytest时,给出警告 PytestConfigWarning: Unknown config option: result_log

问题&#xff1a;在ini中配置了一些选项后运行pytest&#xff0c;会出现下面的警告信息 解决&#xff1a;在ini中增加配置&#xff1a;addopts -p no:warnings

Oracle(2-2)Oracle Net Architecture

文章目录 一、基础知识1、Oracle Net Connections Oracle网络连接2、C/S Application Connection C/S应用程序连接3、OSI Communication Layers OSI通信层4、Oracle Protocol Support Oracle协议支持5、B/S Application Connections B/S应用程序连接6、TwoTypes JDBC Drivers 两…

【vue+baiduMap】百度地图绘制多边形区域

1、创建百度地图应用&#xff0c;获取权限ak 百度地图服务台 Ps.本项目里按钮等基础控件使用的是element-ui版本控件 2、项目内全局引入 index.html页面插入引用代码&#xff1a; <scriptsrc"//api.map.baidu.com/api?v2.0&ak你的密钥"type"text/ja…

单链表(8)

单链表的特点 可以发现&#xff0c;在单链表的for循环里&#xff0c;初始化就总结为这两种情况 上图中 用第一条&#xff08;要改变链表的结构&#xff0c;增加&#xff0c;减少结点个数等&#xff09;的有&#xff1a;尾插&#xff0c;插入&#xff0c;删除pos位置值&#x…

vue脚手架初始化项目搭建后配置路由【小白易学】

首先这里你已经创建好项目了&#xff0c;这是跑起来的效果 首先第一步&#xff0c;需要下载路由router npm install vue-router4下载好了之后找到main.js页面,加入router import { createApp } from vue; import App from ./App.vue; import router from ./routercreateApp(A…

做一个springboot登陆注册功能

目录 一、环境搭建 1、数据库 2、引入依赖 3、配置信息 4、创建包结构和数据库实体类 二、接口开发-注册接口 前提准备 响应数据 需求分析 全局异常处理 代码编写 测试 三、接口开发-登录接口 前提准备 响应数据 需求分析 代码编写 测试 拦截器 测试 一、环…

IP地址如何实现定位功能?

网络犯罪、保护网络安全的重要手段。近日&#xff0c;一则新闻引起了广大网友的关注&#xff1a;IP也能实现定位功能&#xff0c;这是如何做到的呢&#xff1f;本文将对此进行深入解析。 首先&#xff0c;我们需要了解什么是IP地址定位。IP地址定位是通过IP地址确定网络用户所在…

面试被问答3-5年职业规划,该怎么回答

面试官问这些问题的目的是什么&#xff1f;他想得到什么满意的答案。只要清楚这些&#xff0c;就不难回答这个问题。 1、你有没有上进心&#xff1f;公司是否值得培养呢&#xff1f; 你需要对专业能力充满向往&#xff0c;希望自己在3~5年内&#xff0c;把专业能力做好&#…

字符串和内存函数(1)

文章目录 目录1. 前言2. 函数介绍2.1 strlen2.2 strcpy2.3 strcat2.4 strcmp2.5 strncpy2.6 strncat2.7 strncmp2.8 strstr2.9 strtok2.10 strerror2.11 字符分类函数2.12 字符转换函数 目录 求字符串长度函数长度不受限制的字符串函数长度受限制的字符串函数字符串查找函数错…

TikTok影响力经济:解锁社交媒体的商业机遇

社交媒体平台的崛起改变了我们与世界互动的方式&#xff0c;而TikTok作为其中的一员&#xff0c;已经成为全球范围内的现象。这个短视频应用不仅让用户在几秒钟内分享创意和娱乐&#xff0c;还为企业和创作者提供了巨大的商业机会。本文将深入探讨TikTok的影响力经济&#xff0…

linux grub2 不引导修复 grub2-install:error:/usr/lib/grub/x86_64-efi/modinfo.sh

系统部署在物理机上&#xff0c;开机后一直pxe不进系统&#xff0c;怀疑GRUB丢失。 查看bios 里 采用uefi 启动方式&#xff0c; 无硬盘系统引导选项&#xff0c; 且BMC设置为硬盘永久启动也无效。 挂载光驱ISO进入救援模式,sda为系统盘&#xff0c;重装grub报错 grub2-inst…