前言

CSS定位方式和XPATH定位方式基本相同,只是CSS定位表达式有其自己的格式。CSS定位方式拥有比XPATH定位速度快,且比XPATH稳定的特性。下面详细介绍CSS定位方式的使用方法

被测网页的HTML代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style type="text/css">
input.spread { Font-SIZE:20pt;}
input.tight { FONT-SIZE:10pt;}
</style>
</head>
<body onload="document.getElementById('div1input').focus()">
<div id="div1" style="text-align:center">
<input id="div1input" class="spread"/></input>
<a href="http://www.sogou.com">搜狗搜索</a>
<img alt="div1-img1" src="http://www.sogou.com/images/logo/new/sogou.png"
href="http://www.sogou.com">搜狗图片</img>
<input type="button" value="查询"></input>
</div>
<br>
<p>第一段文字</p>
<p>第二段文字</p>
<div name= "div2" style="text-align:center">
<input name="div2input" class="tight"></input>
<a href="http://www.baid.com">百度搜索</a>
<img alt="div2-img2" src="http://www.baidu.com/img/bdlogo.png"
href="http://www.baidu.com">百度图片</img>
<input type="button" value="查询"></input>
</div>
<div class="foodDiv">
<ul id="recordlist">
<p>土豆</p>
<li>西红柿</li>
</ul>
</div>
</body>
</html>

被测代码

①使用绝对路径定位元素

目的

在被测试网页中,查找第一个div中的查询按钮

CSS定位方式:

html > body > div >input[value="查询"]

Python定位语句:

element = driver.find_element_by_css_selector('html > body > div >input[value="查询"]')

代码解释:

上述CSS定位表达式使用绝对路径定位属性value的值为“查询”的页面元素。从CSS定位表达式可以看出,步间通过“>"分割,区别于XPATH路径中的正”/“,并且也不再使用@符号选择属性。

②使用相对路径定位元素

目的

在被测试网页中,查找第一个div下的查询按钮

CSS定位表达式:

input[value="查询"]

Python定位语句:

element = driver.find_element_by_css_selector('input[value="查询"]')

代码解释

上述CSS表达式通过相对路径使用元素名称和元素的属性及属性值进行页面元素的定位。

③使用class名称定位元素

目的

在被测网页中,查找第一个div元素下的input输入框

CSS定位表达式:

css.spread

python定位语句:

element = driver.find_element_by_css_selector('css.spread')

代码解释

上述CSS定位表达式使用input页面元素的class属性名称spread来进行定位,用点(.)分割元素名与class属性名,点号后面是class属性名称

④使用ID属性值定位元素

目的

在被测试网页中,查找第一个dic元素下ID属性值为div1input“的input元素

CSS定位语句:

input#div1input

Python定位语句:

element = driver.find_element_by_css_selector('input#div1input')

代码解释

上述CSS定位表达式使用input页面元素的ID属性值div1input进行定位,使用#号分割元素名和ID属性值,#后面是ID属性值

⑤使用页面其他属性值定位元素

目的

在被测网页中,查找div元素下的第一张图片元素img

CSS定位表达式:

img[alt="div1-img1"]
img[alt="div1-img1"][href="http://www.sogou.com"]

Python定位语句:

element = driver.find_element_by_css_selector('img[alt="div1-img1"]')
element = driver.find_element_by_css_selector('img[alt="div1-img1"][href="http://www.sogou.com"]')

代码解释:

表达式1和表达式2是等价的,都是定位第一个img元素

表达式1:表示使用img页面元素的alt元素的属性值div1-img1进行定位。若定位的页面元素始终具有唯一的属性值,此定位方式可以解决很多频繁变动的页面元素

表达式2:表示同时使用了img页面元素的alt和href属性进行页面元素的定位。在某些复杂的定位场景,可使用多个属性来确保定位元素的唯一性。

⑥使用属性值的一部分内容定位元素

目的

在被测试网页中,查找“搜狗搜索”链接

CSS定位表达式:

 a[href^="http://www.so"]
a[href$="gou.com"]
a[href*="sogou"]

Python定位语句:

 element = driver.find_element_by_css_selector('a[href^="http://www.so"]')
element = driver.find_element_by_css_selector('a[href$="gou.com"]')
element = driver.find_element_by_css_selector('a[href*="sogou"]')

代码解释

1.表示匹配链接地址开始为http://www.so关键字串的链接元素,以字符^指明从字符串的开始匹配

2.表示匹配链接地址结尾包含gou.com关键字串的链接元素,以字符$指明在字符串的结尾匹配

3.表示匹配链接地址包含sogou关键字串的链接元素,以字符*指明在需要进行模糊查询

使用此模糊定位方式,可匹配动态变化的属性值的页面元素,只要找到属性值固定不变的关键部分,就可以进行模糊匹配定位。此方法可以解决大部分复杂定位的问题,当然无论是方式都需要灵活使用才能确保能够准确的定位都想要定位的元素

⑦使用页面元素进行子页面元素的查找

目的

在被测网页中,查找第一个div下的第一个input元素

CSS定位表达式:

 div#div1>input#div1input
div input

Python定位语句:

 element=driver.find_element_by_css_selector("div#div1>input#div1input")
element=driver.find_elements_by_css_selector("div input")

代码解释

1.表达式1中的div#div1,表示在被测试网页上定位到ID属性值为div1的div页面元素,> 表示在以查找到的div元素的子页面元素中进行查找,input#div1input表示查找ID属性值为div1input的input页面元素,此方法可实现查找div下子页面元素的办法

2.表达式2表示匹配所有属于div元素后代的input元素,表达式中父元素div和子元素input中间需用空格分割,注意此表达式是定位一组input元素,并不是单个input元素

⑧使用伪类定位元素

目的

在被测试网页中查找第一个div下的指定子页面元素

CSS定位表达式:

 div#div1 :first-child
div#div1 :nth-child(2)
div#div1 :last-child
input:focus
input:enabled
input:checked
input:not([id])

Python定位语句:

1 element=driver.find_element_by_css_selector("div#div1 :first-child") 
2 element=driver.find_element_by_css_selector("div#div1 :nth-child(2)")
3 element=driver.find_element_by_css_selector("div#div1 :last-child")
4 element=driver.find_element_by_css_selector("input:focus")
5 element=driver.find_elements_by_css_selector("input:enabled")
6 element=driver.find_elements_by_css_selector("input:checked")
7 element=driver.find_elements_by_css_selector("input:not([id])")

代码解释

伪类表达式是CSS语法支持的定位方式,前3个表达式特别注意的是在冒号前一定要有一个空格,否则定位不到想要定位的元素

1.表达式1表示查找ID属性值为div1的div页面元素下的第一个子元素,根据被测试网页定位的是div下的input元素,first-child表示查找某个页面元素下的第一个子页面元素

2.表达式2表示查找ID属性值为div1的div页面元素下的第二个子元素,参照被测网页,定位到的页面元素是一个链接元素

3.表达式3表示查找ID属性值为div1的div页面元素下的最后一个子元素,根据被测试网页定位的是一个按钮元素;last-child表示的是查找某个页面元素下的最后一个子页面元素

4.表达式4 表示查找当前获取焦点的input页面元素

5.表达式5表示查找可操作的input元素

6.表示查找处于勾选状态的checkbox页面元素

7.表示查找所有无id属性的input页面元素

⑨查找同级兄弟页面元素

目的

在被测试网页中,查找第一个div下第一个input子页面元素同级兄弟页面元素

CSS定位表达式:

 div1#div1 > input + a
div1#div1 > input + a + img
div1#div1 > input + * + img
ul#recordlist > p~li

Python定位语句:

 element=driver.find_element_by_css_selector("div1#div1 > input + a")
element=driver.find_element_by_css_selector("div1#div1 > input + a + img")
element=driver.find_element_by_css_selector("div1#div1 > input + * + img")
element=driver.find_elements_by_css_selector("ul#recordlist > p~li")

代码解释

1.表达式1表示在ID属性值为div1的页面元素下,查找input页面元素后的同级的且相邻的链接元素a

2.表达式2表示在ID属性值为div1的页面元素下,查找input元素和链接元素a后面相邻的图片元素img

3.表达式3表示在ID属性值为div1的页面元素下,创造找input页面元素和任意一种页面元素后面的同级且相邻的图片元素img,* 表示任意类型的一个页面元素,只能表示一个元素,如果想用此方法查找第一个div下的最后一个input元素,表达式写法为div#div1 > input + * + * + input或div#div1 > input + a + * + input或div#div1 > input + a + img + input

4.表达式4表示ID属性值为recordlist的ul页面元素下,查找p页面元素以后所有的li元素

⑩多元素选择器

CSS定位表达式支持多元素选择器,也就是一次可以同时选择多个相同的标签,也可以同时选择多个不同的标签,不同标签间用英文的逗号隔开

目的

在被测网页中,同时选择多个不同的页面元素

CSS定位表达式:

div#div1,input,a

Python定位语句:

element=find_elements_by_css_selector("div#div1,input,a')

代码解释

上面的css表达式表示同时查找所有ID属性值为div1的div元素,所有的input元素,所有的a元素

总结

目前为止,已经整理了自动化测试Python+Selenium中对于web测试定位页面元素的两种主流,也是最好的定位方式XPATH和CSS定位方式,在我个人看来两个方式都很不错,效率都很高,也很容易解决日常工作中的问题,也能够减少页面的变动对于脚本的维护成本,当然不同问题还需要不同的方式解决,能解决问题的方法都是好方法,希望以后的日子对于定位元素不再是难题。下面我们对这两种定位方式大概做个对比;

XPATH定位和CSS定位很相似,XPATH功能更强大一些吧,但CSS定位方式执行速度更快,鉴于某些浏览器不支持CSS定位方式,并且一般在自动化测试实施过程中使用xpath定位方式要比css更普遍,所以建议大家先掌握xpath,再来看下二者在语法上有什么区别

定位元素目标 XPATH CSS
所有元素   //* *
所有div元素 //div div
所有div元素子元素 //div/* div>*
根据ID属性获取元素 //*[@id=''] div#id
根据class属性获取元素 //*[@class=''] div.class
拥有某个属性的元素 //*[@href=''] *[href='']
所有div元素的第一个子元素 //div/*[1] div>* :first-child
所有拥有子元素a的div元素 //div[a] 无法实现
input的下一个兄弟元素 //input/following-sibling::[1] input+*

selenium之元素定位-css的更多相关文章

  1. 《手把手教你》系列技巧篇(十七)-java+ selenium自动化测试-元素定位大法之By css上卷(详细教程)

    1.简介 CSS定位方式和xpath定位方式基本相同,只是CSS定位表达式有其自己的格式.CSS定位方式拥有比xpath定位速度快,且比CSS稳定的特性.下面详细介绍CSS定位方式的使用方法.xpat ...

  2. 《手把手教你》系列技巧篇(十八)-java+ selenium自动化测试-元素定位大法之By css中卷(详细教程)

    1.简介 按计划今天宏哥继续讲解倚天剑-css的定位元素的方法:ID属性值定位.其他属性值定位和使用属性值的一部分定位(这个类似xpath的模糊定位). 2.常用定位方法(8种) (1)id(2)na ...

  3. 《手把手教你》系列技巧篇(十九)-java+ selenium自动化测试-元素定位大法之By css下卷(详细教程)

    1.简介 按计划今天宏哥继续讲解css的定位元素的方法.但是今天最后一种宏哥介绍给大家,了解就可以了,因为实际中很少用. 2.常用定位方法(8种) (1)id(2)name(3)class name( ...

  4. 【基础】selenium中元素定位的常用方法(三)

    一.Selenium中元素定位共有八种 id name className tagName linkText partialLinkText xpath cssSelector 其中前六种都比较简单, ...

  5. selenium界面元素定位

    一.        Selenium界面元素定位 本文元素定位以das2为例 #导入包 from selenium import  webdriver #打开火狐驱动 driver=webdriver ...

  6. Selenium Web元素定位方法

    Selenium是用于Web应用测试的自动化测试框架,可以实现跨浏览器和跨平台的Web自动化测试.Selenium通过使用WebDriver API来控制web浏览器,每个浏览器都都有一个特定的Web ...

  7. 《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath上卷(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. ...

  8. 《手把手教你》系列技巧篇(十五)-java+ selenium自动化测试-元素定位大法之By xpath中卷(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. ...

  9. 《手把手教你》系列技巧篇(十六)-java+ selenium自动化测试-元素定位大法之By xpath下卷(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. ...

随机推荐

  1. Process 'command 'D:\jdk8\jdk\bin\java.exe'' finished with non-zero exit value 2

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10539006.html 捣鼓了好久,现在已经不想说话,为何会出现这个问题,Process 'comman ...

  2. 教程二 网页和lua交互修改openwrt

    硬件 http://zhan.renren.com/h5/entry/3602888498044209332 GL-iNet 1 首先安装 webserver之lighttpd  ,openwrt自带 ...

  3. Dubbo的@Reference和@Service说明

    前言 @Reference 用在消费端,表明使用的是服务端的什么服务 @RestController public class RemoteUserController { @Reference(ve ...

  4. Pytorch系列教程-使用字符级RNN生成姓名

    前言 本系列教程为pytorch官网文档翻译.本文对应官网地址:https://pytorch.org/tutorials/intermediate/char_rnn_generation_tutor ...

  5. 模式识别笔记4-集成学习之AdaBoost

    目前集成学习(Ensemble Learning) 分为两类: 个体学习器间存在强依赖关系.必须串行化生成的序列化方法:Boosting 个体学习器间不存在强依赖关系,可同时生成的并行化方法:Bagg ...

  6. springboot实现数据库中数据导出Excel功能

    [转载]原文地址:https://blog.csdn.net/wilson_m/article/details/79021458 功能介绍 网上查找了一堆的数据导出代码,可能是自己基础比较薄弱的原因还 ...

  7. 卷积神经网络(Convolutional Neural Network,CNN)

    全连接神经网络(Fully connected neural network)处理图像最大的问题在于全连接层的参数太多.参数增多除了导致计算速度减慢,还很容易导致过拟合问题.所以需要一个更合理的神经网 ...

  8. C# 《编写高质量代码改善建议》整理&笔记 --(五)成员设计

    1.可以字段应该重构为属性 2.谨慎将数组或集合作为属性 数组和集合作为属性存在会引起这样的一个分歧:如果属性是只读的,我们通常会认为他是不可改变的.但是如果将只读属性应用于数组和集合,而元素的内容和 ...

  9. OpenCV+TensorFlow实现自定义手写图像识别

    完整版请点击链接:https://mp.weixin.qq.com/s/5gHXGmLbtO7m3dOFrDUiHQ    或微信关注“大数据技术宅” 继用TensorFlow教你做手写字识别(准确率 ...

  10. [Vue] vuex进行组件间通讯

    vue 组件之间数据传输(vuex) 初始化 store src/main.js import Vuex from "vuex"; Vue.use(Vuex); new Vue({ ...