CSS Selectors

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

1. 基本选择器

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

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

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

    css 复制代码
    .canvas-class { /* 选择所有具有class="canvas-class"的元素 */ }

2. 组合选择器

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

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

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

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

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

3. 属性选择器

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

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

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

4. 伪类选择器

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

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

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

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

5. 综合示例

假设您的HTML结构如下:

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,可以使用相邻兄弟选择器:

    css 复制代码
    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之间有不确定的层级,可以使用通用兄弟选择器:

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

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

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

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

    html 复制代码
    <div class="unique-class">鲜时光</div>

    对应的CSS选择器:

    css 复制代码
    div[data-stats-id="8306"] > .unique-class + div .solar-combo-chart canvas

6. 在UI自动化中的应用

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

  • Selenium(Python)

    python 复制代码
    from selenium import webdriver
    
    driver = 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

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

    javascript 复制代码
    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测试选择器:

      javascript 复制代码
      document.querySelector("div[data-stats-id='8306'] > div + div .solar-combo-chart canvas");

      如果返回目标元素,说明选择器正确。

  • 避免过于复杂的选择器

    尽量保持选择器的简洁和可维护性。过于复杂的选择器可能在HTML结构变化时容易失效。

  • 优先使用唯一标识符

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

8. 总结

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

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

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

相关推荐
mldong1 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排2 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60613 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角4 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!4 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰4 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi6 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen6 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马7 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu7 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss