selenium-⼋⼤定位
在使⽤selenium webdriver进⾏元素定位时,通常使⽤findElement或findElements⽅法结合By类返回的元素句柄来定位元素。其中By 类的常⽤定位⽅式共⼋种,现分别介绍如下。
1. By.name()
假设我们要测试的页⾯源码如下:
<button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><span id="gbqfsa">Google Search</span></button>
当我们要⽤name属性来引⽤这个button并点击它时,代码如下:
View Code
2. By.id()
页⾯源码如下:
1 <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><span id="gbqfsa">Go
ogle Search</span></button>
要引⽤该button并点击它时,代码如下:
1 public class SearchButtonById {
2
3 public static void main(String[] args){
4
5 WebDriver driver = new FirefoxDriver();
6
7 ("www.forexample");
8
9 WebElement searchBox = driver.findElement(By.id("gbqfba"));
10
11 searchBox.click();
12
13 }
14
15 }
3. By.tagName()
该⽅法可以通过元素的标签名称来查元素。该⽅法跟之前两个⽅法的区别是,这个⽅法搜索到的元素通常不⽌⼀个,所以⼀般建议结合使⽤findElements⽅法来使⽤。⽐如我们现在要查页⾯上有多少个button,就可以⽤button这个tagName来进⾏查,代码如下:
public class SearchPageByTagName{
public static void main(String[] args){
WebDriver driver = new FirefoxDriver();
<("www.forexample");
List<WebElement> buttons = driver.findElements(By.tagName("button"));
System.out.println(buttons.size()); //打印出button的个数
}
}
另外,在使⽤tagName⽅法进⾏定位时,还有⼀个地⽅需要注意的是,通常有些HTML元素的tagName是相同的,如下图(1)所⽰。
图(1)
从图中我们可以看到,单选框、复选框、⽂本框和密码框的元素标签都是input,此时单靠tagName⽆法准确地得到我们想要的元素,需要结合type属性才能过滤出我们要的元素。⽰例代码如下:
5 WebDriver driver = new FirefoxDriver();
6
7 ("www.forexample");
8
9 List<WebElement> allInputs = driver.findElements(By.tagName("input"));
10
11 //只打印所有⽂本框的值
12
13 for(WebElement e: allInputs){
14
15 if (e.getAttribute(“type”).equals(“text”)){
16
17 System.out.Text().toString()); //打印出每个⽂本框⾥的值
18
19 }
20
21 }
22
23 }
24
25 }
4. By.className()
className属性是利⽤元素的css样式表所引⽤的伪类名称来进⾏元素查的⽅法。对于任何HTML页⾯的元素来说,⼀般程序员或页⾯设计师会给元素直接赋予⼀个样式属性或者利⽤css⽂件⾥的伪类来定义元素样式,使元素在页⾯上显⽰时能够更加美观。⼀般css样式表可能会长成下⾯这个样⼦:
1 .buttonStyle{
2
3 width: 50px;
4
5 height: 50px;
6
7 border-radius: 50%;
8
9 margin: 0% 2%;
10
11 }
定义好后,就可以在页⾯元素中引⽤上述定义好的样式,如下:
1 <button name="sampleBtnName" id="sampleBtnId" class="buttonStyle">I'm Button</button>
如果此时我们要通过className属性来查该button并操作它的话,就可以使⽤className属性了,代码如下:
5 WebDriver driver = new FirefoxDriver();
6
7 ("www.forexample");
8
9 WebElement searchBox = driver.findElement(By.className("buttonStyle"));
10
11 searchBox.sendKeys("Hello, world");
12
13 }
14
15 }
注意:使⽤className来进⾏元素定位时,有时会碰到⼀个元素指定了若⼲个class属性值的“复合样式
”的情况,如下⾯这个button:<button id="J_sidebar_login" class="btn btn_big btn_submit" type="submit">登录</button>。这个button元素指定了三个不同的css伪类名作为它的样式属性值,此时就必须结合后⾯要介绍的cssSelector⽅法来定位了,稍后会有详细例⼦。
5. By.linkText()
这个⽅法⽐较直接,即通过超⽂本链接上的⽂字信息来定位元素,这种⽅式⼀般专门⽤于定位页⾯上的超⽂本链接。通常⼀个超⽂本链接会长成这个样⼦:
1 <a href="/intl/en/about.html">About Google</a>
我们定位这个元素时,可以使⽤下⾯的代码进⾏操作:
1 public class SearchElementsByLinkText{
2
3 public static void main(String[] args){
4
5 WebDriver driver = new FirefoxDriver();
6
7 ("www.forexample");
8
9 WebElement aboutLink = driver.findElement(By.linkText("About Google"));
10
11 aboutLink.click();
12
13 }
14
15 }
6. By.partialLinkText()
这个⽅法是上⼀个⽅法的扩展。当你不能准确知道超链接上的⽂本信息或者只想通过⼀些关键字进⾏匹配时,可以使⽤这个⽅法来通过部分链接⽂字进⾏匹配。代码如下:
1 public class SearchElementsByPartialLinkText{
2
3 public static void main(String[] args){
4
5 WebDriver driver = new FirefoxDriver();
6
7 ("www.forexample");
8
9 WebElement aboutLink = driver.findElement(By.partialLinkText("About"));
10
11 aboutLink.click();
12
13 }
14
15 }
注意:使⽤这种⽅法进⾏定位时,可能会引起的问题是,当你的页⾯中不⽌⼀个超链接包含About时,
findElement⽅法只会返回第⼀个查到的元素,⽽不会返回所有符合条件的元素。如果你要想获得所有符合条件的元素,还是只能使⽤findElements⽅法。
7. By.xpath()
这个⽅法是⾮常强⼤的元素查⽅式,使⽤这种⽅法⼏乎可以定位到页⾯上的任意元素。在正式开始使⽤XPath进⾏定位前,我们先了解下什么是XPath。XPath是XML Path的简称,由于HTML⽂档本⾝就是⼀个标准的XML页⾯,所以我们可以使⽤XPath的语法来定位页⾯元素。
假设我们现在以图(2)所⽰HTML代码为例,要引⽤对应的对象,XPath语法如下:
图(2)
绝对路径写法(只有⼀种),写法如下:
引⽤页⾯上的form元素(即源码中的第3⾏):/html/body/form[1]
注意:1. 元素的xpath绝对路径可通过firebug直接查询。2. ⼀般不推荐使⽤绝对路径的写法,因为⼀旦页⾯结构发⽣变化,该路径也随之失效,必须重新写。3. 绝对路径以单/号表⽰,⽽下⾯要讲的相对路径则以//表⽰,这个区别⾮常重要。另外需要多说⼀句的是,当xpath 的路径以/开头时,表⽰让Xpath解析引擎从⽂档的根节点开始解析。当xpath路径以//开头时,则表⽰让xpath引擎从⽂档的任意符合的元素节点开始进⾏解析。⽽当/出现在xpath路径中时,则表⽰寻⽗节点的直接⼦节点,当//出现在xpath路径中时,表⽰寻⽗节点下任意符合条件的⼦节点,不管嵌套了多少层级(这些下⾯都有例⼦,⼤家可以参照来试验)。弄清这个原则,就可以理解其实xpath的路径可以绝对路径和相对路径混合在⼀起来进⾏表⽰,想怎么玩就怎么玩。
下⾯是相对路径的引⽤写法:
查页⾯根元素://
selenium怎么使用查页⾯上所有的input元素://input
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论