UI自动化工具千变万化、架构千变万化,但都逃离不开的关键一步就是元素定位。下面以Selenium为例介绍常见的几个元素定位方法
ID - 元素id属性
WebElement El = driver.findElement(by.id(“id”))
name- 元素name属性
WebElement El=driver.findElement(by.name(“name”))
className -元素class属性
WebElement El = driver.findElement(by.className(“className”));
tagName- 元素标签名
WebElement El = driver.findElement(by.tagName(“button”))
linkText- 链接元素a的显示文字
WebElement El = driver.findElement(By.linkText("Inbox"));
partialLinkText
WebElement El = driver.findElement(By.partialLinkText("Inbox"));
补充:以上知识遍地都有,不多赘述。但真实环境中遇到的DOM往往很复杂的多,下面我们来分析一下可能会遇到的几种情况
1. 分级定位: 复杂环境可以先定位父级元素,然后再定位子元素,例如parentElement.findElement(By.***)
2.ID定位是最快速最准确的,但实际上需要开发人员的友好配合才能有唯一且确定的id可用,真实环境中往往会出现没有id,id重复或者动态id(extjs和query都是动态id);若动态id有规律我们还能考虑使用正则表达式,否则只能老老实实另谋出路了。
3. 定位数组元素 :实际使用中className和tagName经常被用来定位数组元素,例如driver.findElement s (by.tagName(“**”))或driver.findElement s (by.className(“**”))
例如,打开www.baidu.com,运行List<WebElement> Els= driver.findElements(by.tagName(“a”));看看是不是得到了一个元素数组
4. className不允许使用复合类名做参数
真实环境中元素往往使用复合类名(即多个class用空格分隔),使用className定位时要注意了,className的参数只能是一个class。
例如,打开http://hao.360.cn/,我们要使用className定位这个元素
< a class ="tab-item news" data-page ="http://sh.qihoo.com/daohang/index1.html" hidefocus ="false" href ="./brother.html#!news" > 新闻头条 </ a >
1)执行driver.findElements(by.className("news")),成功定位到元素
2)执行driver.findElements(by.className("tab-item news")),定位失败,报错信息: Compound class names not permitted,意思是 不允许使用 复合类名称
分析:className的参数仅允许是一个class,此处 class="tab-item news" 是复合类名,直接使用会报错
5. linkText与 partialLinkText
遇到文字链接元素,首先考虑使用linkText定位,那它与partialLinkText有什么区别与特性呐?
1) linkText=链接文字,表示精准匹配链接文字;partialLinkText=部分链接文字,表示模糊匹配链接文字。例如定位一下元素
< a target ="_blank" title ="" href ="http://www.nuomi.com/?cid=bdsywzl" > 劳动节不劳动,吃喝玩乐5.1元起! </ a >
| driver.findElement(By.linkText("劳动节不劳动,吃喝玩乐5.1元起!"));
| driver.findElement(By.partialLinkText("吃喝玩乐"));
2.都对大小写敏感
这篇文章对两者进行了详细的介绍并附有案例 http://blog.csdn.net/aerchi/article/details/8931023
复杂定位:cssselector、xpath、javascript正在路上........