【Selenium】第一章 Web Driver 元素定位

上一篇 / 下一篇  2015-04-01 16:31:17 / 个人分类:自动化测试

1、元素定位器:

  1. 可选元素定位器:
  2. dom定位,xPath定位。其中dom包括id,name,css,class
  3. 定位多个元素:Driver.findElements()方法。
  4. 定位指定位置的元素是否存在:verifyElemPresent()
  5. 校验查询结果完整性、一致性
2、元素定位的方法:findElement()findElements()

findElement()该方法返回基于指定查询条件的webElement对象,或抛出不符合条件的异常 egdriver.findElement(By.id("userID"));

findElements()该方法返回指定查询条件的WebElement的对象集合,或返回null

3WebElement对象提供的各种定位元素策略

IDdriver.findElement(By.id(<elementID>))

Namedriver.findElement(By.name(<elementName>))

classNamedriver.findElement(By.className(<elementClassName>))

tagNamedriver.findElement(By.tagName(<htmlTagName>))

linkTextdriver.findElement(By.linkText(<linkText>))

partialLinkTextdriver.findElement(By.partialLinkText(<partialLinkText>))

cssdriver.findElement(By.cssSelector(<cssSelector>))

xpathdriver.findElement(By.xpath(<xpathQuery>))

4webelement类提供了诸多方法,在我们开发脚本过程中如何选择最可靠,效率最高的方法,使用idname是首选,因为他们在html标签中是唯一的,所以是最可靠的

ID定位:driver.findElement(By.id("username"))

name定位:driver.findElement(By.name("username"))

class定位:driver.findElement(By.className("username"))

多学一招:WebElement类支持查询子类元素,如果页面中存在重复元素,但在不同div中,我们可以先定位到其父元素,然后定位其子元素,方法如下:

WebElement hello = driver.findElement(By.id("div1")).findElement(By.lindText("hello"));

一、WebDriverBy类中提供了cssSelector()方法,该方法使用有以下几种形式:

1、使用相对路径定位元素

如,我们要定为DOM中的input元素,我们可以这样操作,不考虑其在DOM中的位置,但这样做存在一定弊端,当DOM中存在多个input元素时,该方法总返回DOM中的第一个元素,这并不是我们所期待的

egWebElement username = driver.findElement(By.cssSelector("input"));

另外,为了使用这种方法更准确的定位元素,我们可以结合该元素的其他属性来实现精确定位的目的

a、结合id来定位,driver.findElement(By.cssSelector("input#username"));在标签与id之间使用#连接,如果对css了解的朋友一看就知道为什么会这样写了,不了解也没关系,只要记住这种写法就OK

另外该方法也可简写为driver.findElement(By.cssSelector("#username"));有点儿类似于id选择器

b、使用元素的任何属性来定位元素

driver.findElement(By.cssSelector("标签名[属性名='属性值']"));

c、匹配部分属性值

^=        driver.findElement(By.cssSelector("标签名[属性名^='xxx']"));  匹配属性值以xxx开头的元素

$=        driver.findElement(By.cssSelector("标签名[属性名$='xxx']"));  匹配属性值以xxx结尾的元素

*=         driver.findElement(By.cssSelector("标签名[属性名^='xxx']"));  匹配属性值包含xxx的元素

2、使用相对+绝对路径方法,这里是我自己定义的方法,方便记忆,的确也是这样来实现的

driver.findElement(By.cssSelector("div#login>input"))  该方法中“div#login>input”首先通过相对路径定位到idlogindiv元素,然后查找其子元素input(绝对路径)

二、使用xpath定位元素,相比cssSelectorxpath是我比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能

1、使用绝对路径定位元素

driver.findElement(By.xpath("/html/body/div/form/input"))

2、使用相对路径定位元素

driver.findElement(By.xpath("//input"))  返回查找到的第一个符合条件的元素

3、使用索引定位元素,索引的初始值为1,注意与数组等区分开

driver.findElement(By.xpath("//input[2]"))  返回查找到的第二个符合条件的元素

4、结合属性值来定位元素

driver.findElement(By.xpath("//input[@id='username']"));

driver.findElement(By.xpath("//img[@alt='flowr']"));

5、使用逻辑运算符,结合属性值定位元素,andor

driver.findElement(By.xpath("//input[@id='username' and @name='userID']"));

6、使用属性名来定位元素

driver.findElement(By.xpath("//input[@button]"))

7、类似于cssSlector,使用部分属性值匹配元素

starts-with()    driver.findElement(By.xpath("//input[stars-with(@id,'user')]"))

ends-with        driver.findElement(By.xpath("//input[ends-with(@id,'name')]"))

contains()        driver.findElement(By.xpath("//input[contains(@id,"ernam")]"))

8、使用任意属性值匹配元素

driver.findElement(By.xpath("//input[@*='username']"))

9、使用xpath轴来定位元素

这里略了,详见w3school.com

三、使用innerText定位元素

1、使用cssSelector查找innerText定位元素

driver.findElement(By.cssSelector("span[textContent='新闻']"));

2、使用xpathtext函数

driver.findElement(By.xpath("//span[contains(text(),'hello')]"))  包含匹配

driver.findElement(By.xpath("//span[text()='新闻']"))    绝对匹配


TAG: Selenium

 

评分:0

我来说两句

Open Toolbar