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.pswp.cn/news/896653.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896653.shtml
英文地址,請注明出處:http://en.pswp.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…