当前位置: 首页 > article >正文

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结构或遇到特定的问题,请提供更多细节,我可以为您提供更有针对性的帮助!

相关文章:

CSS Selectors

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

Java Junit框架

JUnit 是一个广泛使用的 Java 单元测试框架&#xff0c;用于编写和运行可重复的测试。它是 xUnit 家族的一部分&#xff0c;专门为 Java 语言设计。JUnit 的主要目标是帮助开发者编写可维护的测试代码&#xff0c;确保代码的正确性和稳定性。 JUnit 的主要特点 注解驱动&…...

3-3 WPS JS宏 遍历文件名获取函数(遍历指定文件夹下的所有工作)学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

STM32CubeMx DRV8833驱动

一、DRV8833驱动原理 ​ STBY口接单片机的IO口&#xff0c;STBY置0电机全部停止&#xff0c;置1才能工作。STBY置1后通过AIN1、AIN2、BIN1、BIN2 来控制正反转。 AIN1AIN2电机状态00停止1speed反转speed1正转11停止 其中A端&#xff08;AIN1与AIN2&#xff09;只能控制AO1与…...

用Python之requests库调用大型语言模型(LLM)API的流式输出与非流式输出比较

文章目录 1. 非流式输出与流式输出概述2. 非流式输出2.1 代码实例12.2 代码实例2 3. 流式输出3.1 流式输出的定义和作用3.2 流式输出适用的场景3.3 流式输出的实现方式与实现技术3.4 代码实例33.5 代码实例4 4. 小结 1. 非流式输出与流式输出概述 大模型收到输入后并不是一次性…...

【Qt】ffmpeg照片提取、视频播放▲

目录 一、图像的成像原理&#xff1a; RGB成像原理&#xff1a; YUV成像原理&#xff1a; 二、多线程 三、ffmpeg解码&#xff08;照片提取&#xff09; 1.准备工作 &#xff08;1&#xff09;在工程文件夹里面新建三个文件夹 &#xff08;2&#xff09;在main函数中加…...

Vue+Elementui 全局配置el-table表格列宽可拖拽

1、需求分析 如何让表格列宽可以拖动 elementui的el-table如果想要列宽可以拖动的话 有一个属性叫 border 在模板里添加这个属性即可实现 但是系统里面的表格我不可能一个一个去添加border太麻烦 如果能够全局配置岂不是非常省时间吗 我们在main.js里面通过全局混入的方式来…...

SQL命令详解之增删改数据

目录 简介 1 添加数据 1.1 基础语法 1.2 SQL 练习 2 修改数据 2.1 基础语法 2.2 SQL 练习 ​3 删除数据 3.1 基础语法 3.2 SQL 练习 总结 简介 在数据库操作中&#xff0c;增、删、改是最基础的操作&#xff0c;它们通常对应着SQL中的INSERT、DELETE和UPDATE命令。…...

鸿蒙开发第4篇__关于在鸿蒙应用中使用Java语言进行设计

本博文对于鸿蒙APP程序员来说&#xff0c;很重要 HarmonyOS从 API8 开始不再支持使用Java作为开发语言&#xff0c;未来的新功能将在ArkTS中实现. API 8对应的是HarmonyOS 3.0.0版本, 2022年7月27日&#xff0c; 华为发布了HarmonyOS 3.0。 请看下图&#xff1a; 因此&#…...

Linux三种网络方式

前言 发现运维啥都得会&#xff0c;这周就遇到了网络问题自己无法解决&#xff0c;因此痛定思痛学一下。 参考文献 你管这破玩意叫网络&#xff1f; 桥接模式、NAT模式、仅主机模式&#xff0c;原来是这样工作的 交换机 构成局域网&#xff0c;实现所有设备之间的通信。 …...

计算机网络之传输层(传输层提供的服务)

一、可靠的数据传输 传输层提供可靠的数据传输服务&#xff0c;确保数据在传输过程中不丢失、不重复、不乱序&#xff0c;并且能够被正确接收。这通常通过面向连接的协议&#xff08;如TCP&#xff09;来实现&#xff0c;TCP通过确认、重传、序号等机制来保证数据传输的可靠性…...

Ubuntu 防火墙iptables和 ufw

文章目录 iptables 和 ufw 的区别Ubuntu 上使用 ufw 配置 iptables 和 ufw 的区别 iptables 和 ufw 是 Linux 系统中用于管理防火墙的工具&#xff0c;但它们的设计目标和使用方式有所不同。 iptables&#xff1a;功能强大&#xff0c;适合高级用户和复杂场景&#xff0c;但配…...

11天 -- Redis 中跳表的实现原理是什么?Redis 的 hash 是什么?Redis Zset 的实现原理是什么?

Redis 中跳表的实现原理是什么&#xff1f; Redis 中的跳表&#xff08;Skip List&#xff09;是一种基于有序链表的高效数据结构&#xff0c;通过在链表上增加多级索引来提高数据的查找效率。以下是 Redis 中跳表的实现原理&#xff1a; 1. 基本概念 节点结构&#xff1a;跳…...

JavaWeb——HTML

一、什么是HTML HTML(HyperText Markup Language)&#xff1a;超文本标记语言 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息还可以定义图片&#xff0c;音频&#xff0c;视频等。标记语言&#xff1a;由标签构成的语言 HTML语言都是预定义好…...

Spring DIIoC

一.IoC 1.简介 什么是IoC&#xff1f;IoC&#xff0c;全称 Inversion of Control&#xff0c;控制反转。IoC是Spring的核心思想&#xff0c;Spring是⼀个“控制反转”的容器。 如果我们需要一个对象&#xff0c;正常来说我们是通过new一个对象&#xff0c;这个时候我们依赖的…...

【前端基础】Day 2 CSS层叠样式表

目录 1.CSS简历 2.CSS 基础选择器 2.1标签选择器 2.2类选择器 2.3 id选择器 2.4通配符选择器 2.5总结 3.CSS字体属性 字体属性总结 4.CSS文本属性 4.1颜色 4.2对齐文本 4.3装饰文本 4.4文本缩进 4.5行间距 4.6文本属性总结 5.CSS的引入方式 5.1内部样式表 …...

建易WordPress

建易WordPress是一家专业的WordPress建站服务提供商&#xff0c;专注于为企业和个人提供一站式的WordPress网站建设、维护、托管、运营推广以及搜索引擎优化(SEO)服务。 服务内容 1. 网站建设 提供模板建站和定制开发两种服务&#xff0c;满足不同客户的需求。模板建站价格为…...

计算机毕业设计SpringBoot+Vue.js汽车资讯网站(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

nuxt常用组件库html-validator、@nuxtjs/i18n、@nuxt/image、@unocss/nuxt使用解析

html-validator 主要用于自动验证nuxt服务器呈现的HTML(SSR和SSG)&#xff0c;以检测可能导致水合错误的HTML常见问题&#xff0c;有助于减少水合错误&#xff0c;检测常见的可访问性错误。 安装 npx nuxilatest module add html-validator配置 若自动更新nuxt.config.ts配置文…...

Leetcode-最大矩形(单调栈)

一、题目描述 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 输入&#xff1a;matrix [["1","0","1","0","0"],["1","0&…...

Vue核心知识:动态路由实现完整方案

在Vue中实现动态路由&#xff0c;并结合后端接口和数据库表设计&#xff0c;是一个复杂的项目&#xff0c;需要多个技术栈和步骤的配合。以下将详细描述整个实现过程&#xff0c;包括数据库设计、后端接口设计、前端路由配置以及如何实现动态路由的功能。 目录 一、需求分析二…...

【Docker】使用Docker搭建-MySQL数据库服务

零、更换Docker镜像源 因为国内现在封锁了Docker默认拉取镜像的站点&#xff08;DockerHub&#xff09;&#xff0c;而且国内大部分Docker镜像站已全部下线&#xff0c;导致现在很多朋友在拉取镜像的时候会出现无法拉取的现象&#xff0c;这时候就需要进行更换Docker镜像源。 可…...

DHCP配置和地址

DHCP&#xff1a;动态主机配置协议 DHCP系统组成 DHCP报文结构 DHCP报文类型 DHCP工作流程 DHCP租期更新 DHCP重绑定 自动保留IP 租期设置建议 IP地址释放 DHCP地址池 DHCP配置 DHCP接口地址池配置 DHCP全局地址池配置...

基于trl复现DeepSeek-R1的GRPO训练过程

1. 引入 huggingface开发了强化学习训练Transformer的库trl&#xff08;参考3&#xff09;&#xff0c;借助这个trl&#xff0c;可以用来做GRPO的强化学习训练。魔搭ModelScope社区的文章&#xff08;参考2&#xff09;给出了基于Qwen基座模型Qwen2.5-0.5B-Instruct&#xff0…...

常用的 pip 命令

pip 是 Python 的包管理工具&#xff0c;可用于安装、卸载、更新和管理 Python 包。以下是一些常用的 pip 命令&#xff1a; 1. 安装包 安装最新版本的包 pip install package_namepackage_name 是你要安装的 Python 包的名称&#xff0c;例如 pip install requests 可以安装…...

基于C#的CANoe CLR Adapter开发指南

一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具&#xff0c;它支持多种编程接口&#xff0c;方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互&#xff0c;充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…...

eMMC安全简介

1. 引言 术语“信息安全”涵盖多种不同的设计特性。一般而言&#xff0c; 信息安全是指通过实践防止信息遭受未经授权的访问、使用、披露、中断、篡改、检查、记录或销毁。 信息安全的三大核心目标为 机密性&#xff08;Confidentiality&#xff09;、完整性&#xff08;Integr…...

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(六) 导航栏 和 个人信息设置

1.导航栏&#xff08;navbar&#xff09; 在components下面 创建NavBar.jsx import { MessageSquare,Settings,User,LogOut} from "lucide-react" import {Link} from "react-router-dom" import { useAuthStore } from "../store/useAuthStore&qu…...

c#实现modbus rtu定时采集数据

以下是使用C#实现Modbus RTU定时采集数据的完整代码示例,包含定时任务、数据采集和异常处理: csharp 复制 using System; using System.IO.Ports; using System.Timers;public class ModbusRtuCollector : IDisposable {private readonly SerialPort _serialPort;private …...

【Python 语法】Python 数据结构

线性结构&#xff08;Linear Structures&#xff09;1. 顺序存储列表&#xff08;List&#xff09;元组&#xff08;Tuple&#xff09;字符串&#xff08;String&#xff09; 2. 线性存储栈&#xff08;Stack&#xff09;队列&#xff08;Queue&#xff09;双端队列&#xff08…...