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正在路上........