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