首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

《最新出炉》系列初窥篇-Python+Playwright自动化测试-62 - 判断元素是否可操作

编程知识
2024年08月02日 10:10

1.简介

有些页面元素的生命周期如同流星一闪,昙花一现。我们也不知道这个元素在没在页面中出现过,为了捕获这一美好瞬间,让其成为永恒。我们就来判断元素是否显示出现过。

在操作元素之前,可以先判断元素的状态。判断元素操作状态也可以用于断言。

2.常用的元素判断方法

2.1page对象调用的判断方法

page对象调用的判断方法, 传一个selector 定位参数

  • page.is_checked(selector: str) # checkbox or radio 是否选中
  • page.is_disabled(selector: str) # 元素是否可以点击或编辑
  • page.is_editable(selector: str) # 元素是否可以编辑
  • page.is_enabled(selector: str) # 是否可以操作
  • page.is_hidden(selector: str) # 是否隐藏
  • page.is_visible(selector: str) # 是否可见

2.2locator对象调用的判断方法

locator对象调用的判断方法

  • locator.is_checked()
  • locator.is_disabled()
  • locator.is_editable()
  • locator.is_enabled()
  • locator.is_hidden()
  • locator.is_visible()

2.3元素句柄的判断方法

元素句柄的判断方法

  • element_handle.is_checked()
  • element_handle.is_disabled()
  • element_handle.is_editable()
  • element_handle.is_enabled()
  • element_handle.is_hidden()
  • element_handle.is_visible()

元素句柄(element_handle)是通过page.query_selector()方法调用返回的ElementHandle ,这种一般不常用。也不推荐使用。

3.项目实战

 宏哥这里用度娘的首页搜索输入框举例,判断这个搜索输入框是否可以输入内容,然后利用JavaScript加上属性readonly后,再次判断是否可以输入内容,对你没看错就是这么玩。

3.1测试用例(思路)

1.访问度娘首页

2.定位搜索输入框,判断其是否可以操作(输入搜索内容)

3.给搜索输入框通过JavaScript添加readonly属性

4.再次判断搜索输入框是否可以操作(输入搜索内容)

3.2代码设计

3.3参考代码

# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-05-17
@author: 北京-宏哥
公众号:北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project:《最新出炉》系列初窥篇-Python+Playwright自动化测试-62 - 判断元素是否可操作
'''

# 3.导入模块

from playwright.sync_api import Playwright, sync_playwright, expect
def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto("https://www.baidu.com/")
    page.wait_for_timeout(1000)
    searchInputBox = page.locator("#kw")
    if searchInputBox.is_enabled():
        print("百度首页的搜索输入框可以输入内容!")
    # 给搜索输入框通过JavaScript添加disable属性
    js = "document.getElementById('kw').setAttribute('disabled', '')";
    page.evaluate(js)
    searchInputBox1 = page.locator("//*[@id='kw']")
    # 再次判断搜索输入框是否可以操作(输入搜索内容)
    if ~searchInputBox1.is_enabled():
        print("百度首页的搜索输入框不可以输入内容!")
    page.wait_for_timeout(1000)
    print("browser will be close")
    page.close()
    context.close()
    browser.close()
with sync_playwright() as playwright:
    run(playwright)

3.4运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

3.可能小伙伴后者童鞋们没有注意宏哥在录屏中点击输入框,通过JavaScript给输入框加入不可操作属性,宏哥在这里演示一下,仍然给输入框输入内容就会报如下错误:element not interactable(元素不可交互)。如下图所示:

4.当然了你也可以通过F12查看元素已经加上了不可以操作的属性,如下图所示:

4.小结

  好了,今天时间也不早了,宏哥就分享到这里,感谢您耐心地阅读。

5.拓展

如果你不想用或者觉得selenium自带的API不能满足你的要求,你也可以根据自己的需要定义一个API,然后进行调用使用。

5.1自定义的API

# 自定义方法来判断页面元素是否存在
def is_element_present(page, selector):
    """
    判断指定选择器的元素是否存在于页面上
    :param page: Playwright的Page对象
    :param selector: 用于选择元素的CSS选择器
    :return: 如果元素存在返回True,否则返回False
    """
    try:
        # 尝试获取元素
        page.wait_for_selector(selector, timeout=5000)  # 等待元素出现,超时时间为5秒
        return True
    except Exception as e:
        # 如果在等待元素或获取元素时发生异常,说明元素不存在
        return False

5.2测试方法及参考代码

# coding=utf-8🔥

# 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行

# 2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2024-05-17
@author: 北京-宏哥
公众号:北京宏哥(微信搜索:北京宏哥,关注宏哥,提前解锁更多测试干货!)
Project:《最新出炉》系列初窥篇-Python+Playwright自动化测试-63 - 判断元素是否可操作
'''

# 3.导入模块

from playwright.sync_api import Playwright, sync_playwright, expect

# 自定义方法来判断页面元素是否存在
def is_element_present(page, selector):
    """
    判断指定选择器的元素是否存在于页面上
    :param page: Playwright的Page对象
    :param selector: 用于选择元素的CSS选择器
    :return: 如果元素存在返回True,否则返回False
    """
    try:
        # 尝试获取元素
        page.wait_for_selector(selector, timeout=5000)  # 等待元素出现,超时时间为5秒
        return True
    except Exception as e:
        # 如果在等待元素或获取元素时发生异常,说明元素不存在
        return False

def run(playwright: Playwright) -> None:
    browser = playwright.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("https://www.baidu.com/")
    page.wait_for_timeout(1000)
    if is_element_present(page,"input#kw"):
        searchInputBox = page.locator("#kw")
        '''判断searchInputBox变量对象是否处于可用状态。如果处于可用状态,则输入“百度首页的搜索输入框被成功找到!” '''
        if searchInputBox.is_enabled():
            searchInputBox.type("百度首页的搜索输入框被成功找到!")
    else:
        print("页面上的输入框元素未被找到!")
    page.wait_for_timeout(1000)
    print("browser will be close")
    page.close()
    browser.close()
with sync_playwright() as playwright:
    run(playwright)

5.3运行代码

1.运行代码,右键Run'Test',就可以看到控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作。如下图所示:

From:https://www.cnblogs.com/du-hong/p/18155646
本文地址: http://www.shuzixingkong.net/article/696
0评论
提交 加载更多评论
其他文章 CSS mask-image 实现边缘淡出过渡效果
使用场景 在生产环境中,遇到一个需求,需要在一个深色风格的大屏页面中,嵌入 Google Maps。为了减少违和感,希望地图四边能够淡出过渡。 这里的“淡出过渡”,关键是淡出,而非降低透明度。 基于 Google Maps 的深色示例中,附加上述需求,效果如下: 简单的说,就是中间放地图,四周放标题
CSS mask-image 实现边缘淡出过渡效果 CSS mask-image 实现边缘淡出过渡效果 CSS mask-image 实现边缘淡出过渡效果
不止于面向对象的SOLID原则
SOLID原则是由人称”鲍勃大叔“的Rober C. Martin所提出来的。他用五个面向对象设计原则的首字母组成了SOLID,并使其得到了广泛传播。这五个原则罗列如下: 单一指责原则(Single Responsibility Principle):类的职责应该是单一的。所谓单一,是从变化的维度衡
不止于面向对象的SOLID原则 不止于面向对象的SOLID原则 不止于面向对象的SOLID原则
Megacity Unity Demo工程学习
1.前言 Megacity Demo发布于2019年春,本博文撰写于2024年,ECS也早已Release并发布了1.2.3版本。 不过好在核心变化不大,多数接口也只是换了调用名称, 该Demo相较于之前的Book of the Dead(2018年发布),体量要小一些,主要演示DOTS相关内容。
Megacity Unity Demo工程学习 Megacity Unity Demo工程学习 Megacity Unity Demo工程学习
SourceGenerator 生成db to class代码优化结果记录
优化 上一次实验 代码写的较为随意,本次穷尽所学,优化了一把, 不过果然还是没 比过 Dapper aot, 虽然没使用 Interceptor, 但理论上其优化不该有这么大差距 知识差距不少呀,都看不懂 Dapper aot 利用了什么姿势领先, 有大神们能教教吗? 优化点 减少类型判断 提前 做
ComfyUI插件:ComfyUI layer style 节点(二)
前言: 学习ComfyUI是一场持久战,而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点。该节点几乎将PhotoShop的全部功能迁移到ComfyUI,诸如提供仿照Adobe Photoshop的图层样式、提供调整颜色功能(亮度、饱和度、对比度
ComfyUI插件:ComfyUI layer style 节点(二) ComfyUI插件:ComfyUI layer style 节点(二) ComfyUI插件:ComfyUI layer style 节点(二)
.NET 8 通用权限框架 前后端分离,开箱即用
前言​ 推荐一个基于.NET 8 实现的通用权限开发框架Admin.NET,前端使用Vue3/Element-plus开发。 基于.NET 8(Furion)/SqlSugar实现的通用管理平台。整合最新技术,模块插件式开发,前后端分离,开箱即用。 集成多租户、缓存、数据校验、鉴权、事件总线、动态A
.NET 8 通用权限框架 前后端分离,开箱即用 .NET 8 通用权限框架 前后端分离,开箱即用 .NET 8 通用权限框架 前后端分离,开箱即用
EF Core性能优化技巧
代码层面的优化 1. 使用实例池 EFCore2.0 为DbContext引入新的注册方式:透明地注册了 DbContext实例池,使用这种方式可以避免始终创建新的实例,EF Core 将重置其状态并将其存储在内部池中;当下次请求新的实例时,将返回该共用实例,而不是设置新的实例 使用示例: serv
硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计
前言 电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来。 紧接前一篇12V转5V的,本篇设计常用的12V转3.3V电路,不常用的12V转4V电路。 12V转3.3V电路 步骤一:应用典型电路 (依据底板和典型电路得差别,电感和电容在3.3~5V范围内,我们可
硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计 硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计 硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计