【秦菲】selenium2.0之CSS选择器定位元素

在我们使用selenium定位元素的时候,会遇到一个这个问题,如果界面中的元素自身是变化的,我们怎样定位元素了?比如extjs界面技术
这个时候,我们的英雄出现了,那就是CSS选择器,我们所遇到的问题可以通过它很好的解决了,开心啊!!哈哈

1.1 使用绝对路径来定位元素
CSS绝对路径指的是在DOM结构中具体的位置,下面一个例子,使用绝对路径来定位用户名输入字段,在使用绝对路径的时候,每个元素之间要有一个空格。

WebElement userName=driver.findElement(By.cssSelector(“html body div div form input”));

你也可以以父子关系的方式来描述这个选择器

WebElement userName=driver.findElement(By.cssSelector(“html>body>div>div>form>input”));

但是,这种策略有一定的局限性,如果界面的布局改变了,那么可能就定位不到我们想要的元素了

1.2 使用相对路径来定位元素
当使用CSS选择器来查找元素的时候,我们可以使用class属性来定位元素,我们可以先指定一个HTML的标签,然后加上一个”.”符合,跟上class属性的值,方法如下:

WebElement loginButton=driver.findElement(By.cssSelector(“input.login”));

这样同样可以找到按钮的

<input type="text" />

标签class为login的元素
如果代码更改为:

WebElement loginButton=driver.findElement(By.cssSelector(“.login”));

那么就是找界面所有className为login的元素,最终可能不是我们想要的效果
1.3 使用相对ID选择器来定位元素
我们可以使用元素的ID来定位元素,先指定一个HTML标签,然后加上一个”#”符号,跟上id的属性值,如下所示:

WebElement userName=driver.findElement(By.cssSelector(“input#username”));

也可以这样

WebElement userName=driver.findElement(By.cssSelector(“#username”));

不过这种方法也是会找界面所有id=username的元素,不一定能定位到我们要的元素上,所以还是建议使用上面那种
1). 定位img
我们可以使用alt属性来定位元素,具体代码如下:

WebElement imgButton=
driver.findElement(By.cssSelector( “img[alt=’XXXX’]”));

2). 如果遇到一个属性不足以定位一个元素的时候,那么可以联合多个属性来定位元素,比如:

WebElement imgButton=driver.findElement
(By.cssSelector( “img[alt=’XXXX’][value=’XXX’]”));

1.4 使用属性名称选择器来定位元素

这个方法和之前的有些不同,我们只通过指定元素中属性的名称而不是属性的值来定位元素
例如:标签中含有alt属性的元素

List imges=driver.findElements(By.cssSelector(“img[alt]”));

其中not()伪类可以使用匹配不满足规则的元素,例如:

List imges=driver.findElements(By.cssSelector(“img:not([alt])”));

1.5 部分属性值得匹配
CSS选择器提供了一个部分属性值匹配定位元素的方法,这为了测试那些页面上具有动态变化的属性的元素是非常有用的,例如界面技术EXTJS的id,className是动态变化的。下面我们就来看看有哪些方法可以做部分匹配

语法 例子 描述
^= Input[id=’ctrl’] 以XXX开始的元素
例如,如果一个元素的ID是ctrl_12,就可以定位到此元素,匹配到id的头部ctrl
$= Input[id$=’_abc’] 以XXX结尾的元素
例如,如果一个元素的ID是111_abc,就可以定位到此元素,匹配到id的尾部_abc
*= Input[id*=’abcd’] 以XXX在中间的元素
例如,如果一个元素的ID是111_abc_222,就可以定位到此元素,匹配到id的_abc然后再定位到该元素

5 thoughts on “【秦菲】selenium2.0之CSS选择器定位元素

  1. CSS选择器还有很多高级用法,查询子元素,查询兄弟元素,使用用户操作伪类,UI状态伪类等等

    1. 我一直想搞定的事情就是,怎么批量处理selenium脚本,不知道kiven能告诉我吗?

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据