對(duì)于有點(diǎn)開(kāi)發(fā)經(jīng)驗(yàn)的人來(lái)說(shuō)學(xué)習(xí)這個(gè)定位其實(shí)相對(duì)容易很多,只要你寫(xiě)過(guò)前端js方面的代碼,基本上selenium webdriver的元素定位方式一看就懂,當(dāng)然也有幾個(gè)需要特別注意(如By.xpath/),需要深入的去了解一些,畢竟在實(shí)際使用中還是挺頻繁的,下面依照常用->不常用的順序介紹selenium webdriver定位元素的幾種方式: 下圖是通過(guò)firebug調(diào)試定位到的百度搜索框: ![]() 1.By.id ![]() 2.By.name 同樣,將控件所對(duì)應(yīng)的name屬性找到即可![]() 這個(gè)方法非常重要,會(huì)經(jīng)常使用到,使用這種方式幾乎可以定位到任意頁(yè)面上的元素。如圖所示,將用xpath(頁(yè)面中元素的路徑)來(lái)定位我們需要用到的元素 ![]() 該圖所對(duì)應(yīng)的頁(yè)面上的標(biāo)簽: ![]() 通過(guò)路徑來(lái)定位控件,分為:絕對(duì)路徑、相對(duì)路徑(這個(gè)概念對(duì)應(yīng)做過(guò)開(kāi)發(fā)的人來(lái)說(shuō)非常熟悉,不錯(cuò)與我們開(kāi)發(fā)中的絕對(duì)路徑相對(duì)路徑非常相似),那么通過(guò)selenium webdriver的xpath方式定位元素需要注意: a.絕對(duì)路徑以 "/" 表示,相對(duì)路徑以 "//" 表示-- 當(dāng)xpath路徑以 "/" 開(kāi)頭時(shí),表示從頁(yè)面的根節(jié)點(diǎn)開(kāi)始解析;當(dāng)"/"出現(xiàn)在xpath路徑中時(shí),表示 尋找父節(jié)點(diǎn)的直接子節(jié)點(diǎn)。 -- 當(dāng)xpath路徑以 "//" 開(kāi)頭時(shí),表示從頁(yè)面上任意符合的元素節(jié)點(diǎn)開(kāi)始解析;當(dāng)"//"出現(xiàn)在xpath路徑中時(shí),表示尋找父節(jié)點(diǎn)下任意符合條件的子節(jié)點(diǎn)。 弄清楚它們各表示什么意思以后,就可以在實(shí)際應(yīng)用中絕對(duì)路徑相對(duì)路徑混合使用。下面是相對(duì)路徑引用寫(xiě)法: 查找頁(yè)面根元素:// 查找頁(yè)面上所有的input元素://input查找頁(yè)面上第一個(gè)form元素://form[1] 查找頁(yè)面上第一個(gè)form元素內(nèi)的直接input(即第一個(gè)input控件)元素://form[1]/input 查找頁(yè)面上第一個(gè)form元素內(nèi)所有的input元素(只要在form元素內(nèi)的input都算,不管嵌套了多少個(gè)其它標(biāo)簽,此時(shí)可使用相對(duì)路徑"//")://form[1]//input查找頁(yè)面上id為loginForm的form元素://form[@id='loginForm'] 查找頁(yè)面上id為loginForm的form元素下第一個(gè)input元素://form[@id='loginForm']/input查找頁(yè)面上name屬性為username的input元素://input[@name='username'] 查找頁(yè)面上name屬性為contiune且type屬性為button的input元素://input[@name='contiune'][@type='button'] 4.By.tagName 通過(guò)元素的標(biāo)簽名稱來(lái)查找元素.該方法與By.id、By.name不同,通常By.tagName查詢出來(lái)的元素不止一個(gè),可能會(huì)有多個(gè),所以,使用該方法時(shí)會(huì)結(jié)合findElements來(lái)用,如下: List<WebElement> inputElements = driver.findElements(By.tagName("input")); for (WebElement input : inputElements) { if(input.getAttribute("type").equals("text")){ System.out.println(input.getText()); } } 在頁(yè)面中,使用input標(biāo)簽的有:文本框/單選框/復(fù)選框/下拉框/密碼框...,只有type屬性不同 5.By.className 利用元素的css樣式來(lái)查找元素.如下頁(yè)面代碼,通過(guò)className來(lái)查找對(duì)應(yīng)的<p>標(biāo)簽 WebElement element = driver.findElement(By.className("bmi_info")); ![]() 在我學(xué)習(xí)的過(guò)程中,結(jié)合tagName,className來(lái)獲取BMI的值,如下: 先獲得className為"bmi_info"的<p>元素,該元素內(nèi)僅有一個(gè)span,這時(shí)就可以通過(guò)tagName獲得該span,代碼如下:WebElement bmiElement = driver.findElement(By.className("bmi_info")).findElement(By.tagName("span")); String actualBMI = bmiElement.getText();6.By.cssSelector cssSelector這種元素定位方式跟xpath比較類似,但執(zhí)行速度較快,而且各種瀏覽器對(duì)它的支持都相當(dāng)?shù)轿?,所以功能也是蠻強(qiáng)大的。 下面是一些常見(jiàn)的cssSelector的定位方式: 定位id為flrs的div元素,可以寫(xiě)成:#flrs 注:相當(dāng)于xpath語(yǔ)法的//div[@id=’flrs’] 定位id為flrs下的a元素,可以寫(xiě)成 #flrs > a 注:相當(dāng)于xpath語(yǔ)法的//div[@id=’flrs’]/a 定位id為flrs下的href屬性值為/forexample/about.html的元素,可以寫(xiě)成: #flrs > a[href=”/forexample/about.html”] 如果需要指定多個(gè)屬性值時(shí),可以逐一加在后面,如#flrs > input[name=”username”][type=”text”]。 7. By.linkText() 通過(guò)超文本鏈接上的文字信息來(lái)定位元素,這種方式一般專門(mén)用于定位頁(yè)面上的超文本鏈接 WebElement linkElement = driver.findElement(By.linkText("新聞")); 8.By.partialLinkText() 該方法時(shí)By.linkText的擴(kuò)展,當(dāng)你不能準(zhǔn)確知道超鏈接上的文本信息或者只想通過(guò)一些關(guān)鍵字進(jìn)行匹配時(shí),可以使用這個(gè)方法來(lái)通過(guò)部分鏈接文字進(jìn)行匹配WebElement linkElement = driver.findElement(By.partialLinkText("新")); 1. 當(dāng)頁(yè)面元素有id屬性時(shí),最好盡量用id來(lái)定位。但由于現(xiàn)實(shí)項(xiàng)目中很多程序員其實(shí)寫(xiě)的代碼并不規(guī)范,會(huì)缺少很多標(biāo)準(zhǔn)屬性,這時(shí)就只有選擇其他定位方法。 2. xpath很強(qiáng)悍,但定位性能不是很好,所以還是盡量少用。如果確實(shí)少數(shù)元素不好定位,可以選擇xpath或cssSelector。 3. 當(dāng)要定位一組元素相同元素時(shí),可以考慮用tagName或name。 4. 當(dāng)有鏈接需要定位時(shí),可以考慮linkText或partialLinkText方式。 |
|