前言

  CSS(Cascading Style Sheets)是一种语言,它用来描述HTML和XML的元素显示样式。在CSS语言中有CSS选择器,Selenium中也可以使用CSS选择器来定位元素,然后进行一系列自动化的操作指令。CSS定位比Xpath速度快,相对不耗资源,而且稳定。在自动化中是推荐使用的一种定位方式。

元素八大定位简介

  • By.id
    根据元素的id属性来定位元素
  • By.name
    根据元素的name属性来定位元素
  • By.tagName
    根据元素的标签名来定位元素
  • By.className
    根据元素的class属性来定位元素
  • By.linkText
    根据超链接的完整文本值来定位元素
  • By.partialLinkText
    根据超链接的部分文本值来定位元素
  • By.cssSelector
    根据css选择器方式来定位元素
  • By.xpath
    根据xpath方式来定位元素

CSS定位方法

1、根据tagName

driver.findElement(By.cssSelector("input"));


2、根据Id

driver.findElement(By.cssSelector("#kw"));
driver.findElement(By.cssSelector("input#kw")); // 标签拼接#Id


3、根据className, .class的样式

driver.findElement(By.cssSelector(".soutu-btn"));
driver.findElement(By.cssSelector("span.soutu-btn")); // 标签拼接className


4、根据元素属性,属性名=属性值,id,class,等都可写成这种形式

单属性:

driver.findElement(By.cssSelector("[id='kw']"));
driver.findElement(By.cssSelector("input[id='kw']")); 
// 标签拼接属性名和属性值,By.cssSelector("标签名[属性名='属性值']");


多属性:

driver.findElement(By.cssSelector("[id='kw'][name='wd']"));
driver.findElement(By.cssSelector("input[id='kw'][name='wd']"));
// 标签拼接属性名和属性值,By.cssSelector("标签名[属性名1='属性值1'][属性名2='属性值2']");


模糊匹配:

// ^表示以xxx开头,此处表示匹配id为s开头的input标签
driver.findElement(By.cssSelector("input[id^='s']"));

// $表示以xxx结尾,此处表示匹配id为u结尾的input标签
driver.findElement(By.cssSelector("input[id$='u']"));

// *表示包含xxx字符,此处表示匹配id包含k的input标签
driver.findElement(By.cssSelector("input[id*='k']"));

// ~表示匹配其中xxx值,此处表示匹配class中有s_btn值的input标签
driver.findElement(By.cssSelector("input[class ~= 's_btn']"));


5、层级定位

1)parent > child模式

概述:在给定的父元素下匹配所有的子元素


form标签的子标签为span标签,span标签的子标签为input标签,写法:

driver.findElement(By.cssSelector("form > span  > input[id='kw']"));

driver.findElement(By.cssSelector("form > * > input[id='kw']")); // 中间可以用*匹配


2)ancestor descendant模式

概述:在给定的祖先元素下匹配所有的后代元素


以上模式可以写成如下格式,把>换成空格,写法:

driver.findElement(By.cssSelector("form span input[id='kw']"));

也可以跳过span标签,直接用form和input标签属性组合,中间的元素也可用*进行匹配,写法:

driver.findElement(By.cssSelector("form input[id='kw']"));
driver.findElement(By.cssSelector("form * input[id='kw']")); // 中间可以用*匹配


3)prev + next模式

概述:匹配所有紧接在 prev 元素后的 next 元素


定位span后面同级的input元素,写法:

driver.findElement(By.cssSelector("span + input[id='kw']"));


4)prev ~ siblings模式

概述:匹配 prev 元素之后的所有 siblings 元素(同辈分的)


定位span后面的所有同级的input元素,写法:

driver.findElement(By.cssSelector("span  ~ input"));

定位span后面指定同级的input元素,写法:

driver.findElement(By.cssSelector("span  ~ input[id='kw']"));


6、多元素选择器 selector1,selector2,selectorN模式

概述:将每一个选择器匹配到的元素合并后一起返回。你可以指定任意多个选择器,并将匹配到的元素合并到一个结果内


定位className为layui-tab-title,列表为li,className为layui-tab-content元素,中间用,分割,写法:

driver.findElements(By.cssSelector(".layui-tab-title,li,.layui-tab-content"));


7、子元素定位

被测元素:

<ul class="layui-tab-title">
    <li class="layui-this">演示说明</li>
    <li>日期</li>
    <li>分页</li>
    <li>上传</li>
    <li>滑块</li>
</ul>
<span class="bg s_btn_wr">
  	<input type="submit" id="su" value="百度一下" class="bg s_btn">
</span>


1):first-child

概述:匹配第一个子元素,':first' 只匹配一个元素,而此选择符将为每个父元素匹配一个子元素


定位li文本为“演示说明”的li标签元素,写法:

driver.findElement(By.cssSelector("ul li:first-child"));


2):nth-child

概述:匹配其父元素下的第N个子或奇偶元素


定位li文本为“分页”的li标签元素,在ul下为第三个li标签,index为3,写法:

driver.findElement(By.cssSelector("ul li:nth-child(3)"));


3):last-child

概述:匹配最后一个子元素,':last'只匹配一个元素,而此选择符将为每个父元素匹配一个子元素


定位li文本为“滑块”的li标签元素,即为最后一个元素,写法:

driver.findElement(By.cssSelector("ul li:last-child"));


4):only-child

概述:如果某个元素是父元素中唯一的子元素,那将会被匹配


定位span中的input标签元素,也是span标签下的唯一子元素,写法:

driver.findElement(By.cssSelector("span input:only-child"));


8、表单对象属性定位

1):enabled

概述:匹配所有可用元素


定位所有可用的input标签元素,写法:

driver.findElement(By.cssSelector("input:enabled"));


2):disabled

概述:匹配所有不可用元素


定位所有不可用的input标签元素,写法:

driver.findElement(By.cssSelector("input:disabled"));


3):checked

概述:匹配所有选中的被选中元素(复选框、单选框等,不包括select中的option)


查找所有选中的复选框元素,写法:

driver.findElement(By.cssSelector("input:checked"));


4):selected

概述:匹配所有选中的option元素


查找所有选中的选项元素,写法:

driver.findElement(By.cssSelector("input:selected"));


9、基本的筛选选择器

1):not(selector)

概述:去除所有与给定选择器匹配的元素


查找所有未选中的 input 元素,写法:

driver.findElement(By.cssSelector("input:not(:checked)"));

查找所有无name属性的input元素,写法:

driver.findElement(By.cssSelector("input:not([name])")); // 此处为中括号[]