CSS Selectors

当然,理解纯CSS选择器(CSS Selectors)对于进行UI自动化测试非常重要。CSS选择器允许您通过元素的属性、层级关系、类名、ID等来精准定位页面上的元素。下面我将详细讲解CSS选择器的常见用法,并结合您的需求提供具体的示例。

1. 基本选择器

  • 元素选择器:选择特定类型的HTML元素。

    div { /* 选择所有div元素 */ }
    
  • ID选择器:通过元素的id属性选择单个元素。

    #stats-8306 { /* 选择id为stats-8306的元素 */ }
    
  • 类选择器:通过元素的class属性选择元素。

    .canvas-class { /* 选择所有具有class="canvas-class"的元素 */ }
    

2. 组合选择器

  • 后代选择器:选择某个元素内部的所有特定后代元素。

    div.parent-class span { /* 选择所有在div.parent-class内的span元素 */ }
    
  • 子选择器:选择某个元素的直接子元素。

    div > span { /* 选择所有div元素的直接子span元素 */ }
    
  • 相邻兄弟选择器:选择紧接在另一个元素之后的同级元素。

    div#stats-8306 + div { /* 选择紧跟在div#stats-8306后面的div元素 */ }
    
  • 通用兄弟选择器:选择某个元素之后的所有同级元素。

    div#stats-8306 ~ div { /* 选择所有在div#stats-8306之后的div元素 */ }
    

3. 属性选择器

  • 属性存在选择器:选择具有特定属性的元素。

    [data-stats-id] { /* 选择所有具有data-stats-id属性的元素 */ }
    
  • 属性值选择器:选择属性值等于特定值的元素。

    [data-stats-id="8306"] { /* 选择data-stats-id属性值为8306的元素 */ }
    
  • 包含文本的选择器:CSS标准中没有直接通过文本内容选择元素的选择器,但有些框架(如jQuery)支持:contains伪类。在纯CSS中,无法实现这一点,需要通过其他方式。

4. 伪类选择器

伪类用于定义元素的特殊状态。

  • :nth-of-type(n):选择同类型中的第n个元素。

    div:nth-of-type(1) { /* 选择第一个div元素 */ }
    
  • :last-child:选择父元素的最后一个子元素。

    div:last-child { /* 选择父元素中的最后一个div元素 */ }
    

5. 综合示例

假设您的HTML结构如下:

<div data-stats-id="8306"><div>鲜时光</div><div><div class="solar-combo-chart"><canvas></canvas></div></div>
</div>
目标

定位data-stats-id="8306"下的文本为“鲜时光”的div之后的canvas元素。

CSS选择器实现

由于纯CSS无法通过文本内容直接选择元素,我们需要依赖元素的层级和属性来定位。

  1. 通过层级关系定位canvas

    如果“鲜时光”的div后面紧跟包含canvasdiv,可以使用相邻兄弟选择器:

    div[data-stats-id="8306"] > div + div .solar-combo-chart canvas
    

    解释

    • div[data-stats-id="8306"]:选择具有data-stats-id="8306"属性的div
    • > div:选择其直接子div(即“鲜时光”所在的div)。
    • + div:选择紧随其后的兄弟div(即包含canvasdiv)。
    • .solar-combo-chart canvas:在找到的div中选择具有类名solar-combo-chart的子div中的canvas元素。
  2. 如果结构更复杂,使用通用兄弟选择器

    如果“鲜时光”的div和包含canvasdiv之间有不确定的层级,可以使用通用兄弟选择器:

    div[data-stats-id="8306"] div:contains('鲜时光') ~ div .solar-combo-chart canvas
    

    注意:contains在标准CSS中不可用。因此,这种方法需要确保HTML结构允许使用其他选择器。

  3. 通过明确的类名或属性

    如果“鲜时光”的div有唯一的类名,可以更精准地定位:

    <div class="unique-class">鲜时光</div>
    

    对应的CSS选择器:

    div[data-stats-id="8306"] > .unique-class + div .solar-combo-chart canvas
    

6. 在UI自动化中的应用

在UI自动化测试中,CSS选择器通常用于定位页面元素,以便进行点击、输入等操作。以下是一些常见框架中使用CSS选择器的示例:

  • Selenium(Python)

    from selenium import webdriverdriver = webdriver.Chrome()
    driver.get('your_website_url')# 定位canvas元素
    canvas = driver.find_element_by_css_selector("div[data-stats-id='8306'] > div + div .solar-combo-chart canvas")# 进行操作,例如点击
    canvas.click()
    
  • Cypress

    cy.get("div[data-stats-id='8306'] > div + div .solar-combo-chart canvas").should('exist').click();
    
  • Playwright

    const { chromium } = require('playwright');(async () => {const browser = await chromium.launch();const page = await browser.newPage();await page.goto('your_website_url');const canvas = await page.$("div[data-stats-id='8306'] > div + div .solar-combo-chart canvas");await canvas.click();await browser.close();
    })();
    

7. 实用技巧

  • 使用开发者工具验证选择器

    1. 打开浏览器的开发者工具(通常按F12)。
    2. 在“Elements”面板中,右键点击目标元素,选择“Copy” > “Copy selector”(复制选择器)。
    3. 或者在控制台中使用document.querySelector测试选择器:
      document.querySelector("div[data-stats-id='8306'] > div + div .solar-combo-chart canvas");
      
      如果返回目标元素,说明选择器正确。
  • 避免过于复杂的选择器
    尽量保持选择器的简洁和可维护性。过于复杂的选择器可能在HTML结构变化时容易失效。

  • 优先使用唯一标识符
    如果元素有唯一的idclass,优先使用它们来定位,这样更高效且稳定。

8. 总结

纯CSS选择器功能强大,能够满足大多数UI自动化测试中的元素定位需求。通过理解元素的结构、属性和层级关系,您可以编写精准且高效的选择器来定位目标元素。以下是您可能需要记住的一些关键点:

  • 使用data-*属性进行定位,因为它们通常用于存储自定义数据,且具有较高的唯一性。
  • 利用层级关系(如子选择器和相邻兄弟选择器)来缩小选择范围。
  • 尽量避免依赖文本内容进行定位,除非使用支持伪类的框架。

如果您有更具体的HTML结构或遇到特定的问题,请提供更多细节,我可以为您提供更有针对性的帮助!

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

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

相关文章

【java】@Transactional导致@DS注解切换数据源失效

最近业务中出现了多商户多租户的逻辑&#xff0c;所以需要分库&#xff0c;项目框架使用了mybatisplus所以我们自然而然的选择了同是baomidou开发的dynamic.datasource来实现多数据源的切换。在使用初期程序运行都很好&#xff0c;但之后发现在调用com.baomidou.mybatisplus.ex…

浅入浅出Selenium DevTools

前言 在自动化测试领域&#xff0c;Selenium一直是主流工具之一。随着前端技术的不断发展&#xff0c;浏览器的功能也在不断丰富。 Selenium 3版本前&#xff0c;一套通用的采集流程如上图所示&#xff1a; 打开Charles&#xff0c;设置Session自动导出频次及导出路径Seleniu…

04 路由表的IP分组传输过程

目录 1、路由表的核心结构 2、IP分组传输过程和数据包转发过程 2.1、IP分组传输过程 2.2、数据包转发过程 2.3、IP分组传输过程和数据包转发的区别 3、数据包的变化 3.1、拓扑结构 3.2、传输过程详解&#xff08;主机A → 主机B&#xff09; 3.2.1、主机A发送数据 3.2…

【子网掩码计算器:Python + Tkinter 实现】

子网掩码计算器&#xff1a;Python Tkinter 实现 引言代码功能概述代码实现思路1. 界面设计2. 功能实现3. 事件处理 子网掩码计算器实现步骤1. 导入必要的库2. 定义主窗口类 SubnetCalculatorApp3. 创建菜单栏4. 创建界面组件5. 判断 IP 地址类别6. 计算子网信息7. 其他功能函…

【练习】【贪心】力扣1005. K 次取反后最大化的数组和

题目 1005 K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可…

3dsmax中使用python创建PBR材质并挂接贴图

前言 笔者处理模型时下载到一个pbr材质库贴图包&#xff0c;手动每次创建材质过于麻烦&#xff0c;因此计划使用自动化脚本根据贴图名自动创建材质。 3dsmax的原本脚本使用的是maxscript&#xff0c;语法有点奇怪懒得学&#xff0c;发现也支持使用python编写脚本&#…

Metal学习笔记九:光照基础

光和阴影是使场景流行的重要要求。通过一些着色器艺术&#xff0c;您可以突出重要的对象、描述天气和一天中的时间并设置场景的气氛。即使您的场景由卡通对象组成&#xff0c;如果您没有正确地照亮它们&#xff0c;场景也会变得平淡无奇。 最简单的光照方法之一是 Phong 反射模…

JAVA学习笔记038——bean的概念和常见注解标注

什么是bean? Bean 就是 被 Spring 管理的对象&#xff0c;就像工厂流水线上生产的“标准产品”。这些对象不是你自己 new 出来的&#xff0c;而是由 Spring 容器&#xff08;一个超级工厂&#xff09;帮你创建、组装、管理。 由 Component、Service、Controller 等注解标记的…

start DL from stratch (2)!!!

start DL from stratch &#xff08;2&#xff09;!!! 一、CPU and GPUcpuGPU安培架构爱达洛夫莱斯架构 二、使用conda创建一个新的虚拟环境三、autodl操作先知Linux复习目录文件和数据上传对于整个镜像的操作守护进程Tips 四、autodl租用创建实例<big>没有所需要的版本的…

机器学习:线性回归,梯度下降

线性回归模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的数学公式

论文笔记-NeurIPS2017-DropoutNet

论文笔记-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet&#xff1a;解决推荐系统中的冷启动问题摘要1.引言2.前言3.方法3.1模型架构3.2冷启动训练3.3推荐 4.实验4.1实验设置4.2在CiteULike上的实验结果4.2.1 Dropout率的影响4.2.2 实验结…

nvm的学习

学习 nvm&#xff08;Node Version Manager&#xff09; 是掌握 Node.js 开发的关键技能之一。以下是系统的学习路径和实战指南&#xff0c;涵盖从基础到进阶的内容&#xff1a; 一、基础入门 1. nvm 的核心作用 多版本共存&#xff1a;安装和管理多个 Node.js 版本&#xff…

GPT-4.5实际性能评测:实际探索

摘要 经过数万轮严格测试&#xff0c;GPT-4.5的性能并未超越其前代产品GPT-4。此前发布的《GPT-4.5 一手实测&#xff1a;垃圾》一文中存在不准确描述&#xff0c;在此向读者致歉。尽管GPT-4.5在价格上有所提升且响应速度较慢&#xff0c;但测试结果显示其模型素质并未达到预期…

从UNIX到Linux:操作系统进化史与开源革命

从UNIX到Linux&#xff1a;操作系统进化史与开源革命 一、操作系统&#xff1a;数字世界的基石 1.1 什么是操作系统&#xff1f; 操作系统&#xff08;OS&#xff09;是计算机系统的核心管理者&#xff0c;承担着三大核心使命&#xff1a; 硬件指挥官&#xff1a;直接管理C…

如何修改安全帽/反光衣检测AI边缘计算智能分析网关V4的IP地址?

TSINGSEE青犀推出的智能分析网关V4&#xff0c;是一款集成了BM1684芯片的高性能AI边缘计算智能硬件。其内置的高性能8核ARM A53处理器&#xff0c;主频可高达2.3GHz&#xff0c;INT8峰值算力更是达到了惊人的17.6Tops。此外&#xff0c;该硬件还预装了近40种AI算法模型&#xf…

【全栈开发】----Mysql基本配置与使用

本篇是在已下载Mysql的情况下进行的&#xff0c;若还未下载或未创建Mysql服务&#xff0c;请转到这篇: 2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易&#xff08;保姆级&#xff09;_mysql8.0.40下载安装教程-CSDN博客 本文对于mysql的操作均使用控制台sql原生代码…

C++ primer plus 第四节 复合类型

本章内容包括: • 创建和使用数组 • 创建和使用 c-风格字符串 • 创建和使用 string 类字符串 • 使用方法getline( )和 get( )读取字符串 • 混合输入字符串和数字 • 创建和使用结构 • 创建和使用共用休 • 创建和使用枚举 • 创建和使用指针 • 使用 new和delete 管理动态…

Java中的泛型类 --为集合的学习做准备

学习目标 ● 掌握在集合中正确使用泛型 ● 了解泛型类、泛型接口、泛型方法 ● 了解泛型上下限 ● 了解基本的使用场景 1.有关泛型 1.1泛型的概念 泛型&#xff08;Generics&#xff09;是Java中引入的参数化类型机制&#xff0c;允许在定义类、接口或方法时使用类型参数&a…

VUE3+Vite使用TailwindCSS【若依前后端分离框架】

参考&#xff1a;https://tailwind.nodejs.cn/docs/guides/vite#vue 和 https://blog.csdn.net/hjl_and_djj/article/details/144694485依次运行命令&#xff1a; cnpm install -D tailwindcss3.4.17 postcss autoprefixernpx tailwindcss init -p修改配置文件tailwind.config.…

FFmpeg入门:最简单的音频播放器

FFmpeg入门&#xff1a;最简单的音频播放器 欢迎大家来到FFmpeg入门的第二章&#xff0c;今天只做一个最简单的FFmpeg音频播放器&#xff1b;同样&#xff0c;话不多说&#xff0c;先上流程图 流程图 以上流程和视频播放器的解码过程基本上是一致的&#xff1b; 不同点在于 S…