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.findElements(by.tagName(“**”))或driver.findElements(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正在路上........