版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Selenium W ebdriver 元素定位的八種常用方式ted on 2015-01-07 13:00 測試控 閱讀(159832) 評論(11) 編輯 收藏樓主,歡迎學(xué)習(xí)和交流,碼字不容易,請注明出處,。在使用selenium webdriver進(jìn)行元素定位時,通常使用findElement或findElements方法結(jié)合By類返回的元素句柄來定位元素。其中By類的常用定位方式共八種,現(xiàn)分別介紹如下。1. B()假設(shè)要測試的頁面源碼如下:當(dāng)要用name屬性來這個button并點(diǎn)擊它時,代碼如下:2. By.id()頁面源碼如下:要該button并點(diǎn)擊它時,代碼如下:3. By.tag
2、Name()該方法可以通過元素的名稱來查找元素。該方法跟之前兩個方法的區(qū)別是,這個方法搜索到的元素通常不止一個,所以一般建議結(jié)合使用findElements方法來使用。比如現(xiàn)在要查找頁面上有多少個button,就可以用button這個tagName來進(jìn)行查找,代碼如下:public class SearchPageByTagNamepublic sic void main(String args)1 public class SearchButtonById 23public sic void main(String args) 45WebDriver driver = new Firefox
3、Driver(); 67 HYPERLINK http:/w/ driver.get(http:/w); 89WebElement searchBox = driver.findElement(By.id(gbqfba); 1011searchBox.click(); 12131415 1 SearchView Code Search另外,在使用tagName方法進(jìn)行定位時,還有一個地方需要注意的是,通常有些HTML元素的tagName是相同的,如下圖(1)所示。圖(1)從圖中可以看到,單選框、復(fù)選框、文本框和框的元素都是input,此時單靠tagName無法準(zhǔn)確地得到想要的元素,需要結(jié)合ty
4、pe屬性才能過濾出要的元素。示例代碼如下:1 public class SearchElementsByTagName 23public sic void main(String args) 45WebDriver driver = new FirefoxDriver(); 67 HYPERLINK http:/w/ driver.get(http:/w); 89List allInputs = driver.findElements(By.tagName(input); 10WebDriver driver = new FirefoxDriver(); driver.get( HYPERLI
5、NK http:/w/ http:/w);List buttons = driver.findElements(By.tagName(button);System.out.prln(buttons.size(); /打印出button的個數(shù)4. By.claame()claame屬性是利用元素的css樣式表所的偽類名稱來進(jìn)行元素查找的方法。對于任何HTML頁面的元素來說,一般程序員或頁面設(shè)計(jì)師會給元素直接賦予一個樣式屬性或者利用css文件里的偽類來定義元素樣式,使元素在頁面上顯示時能夠更加美觀。一般css樣式表可能會長成下面這個樣子:定義好后,就可以在頁面元素中上述定義好的樣式,如下:如果此時
6、要通過claame屬性來查找該button并操作它的話,就可以使用claame屬性了,代碼如下:1 public class SearchElementsByClaame 23public sic void main(String args) 45WebDriver driver = new FirefoxDriver(); 67 HYPERLINK http:/w/ driver.get(http:/w); 89WebElement searchBox = driver.findElement(By.claame(buttonStyle); 1011searchBox.sendKeys(o,
7、 world); 12131 Im Button1 .buttonStyle 23width: 50px; 45height: 50px; 67border-radius: 50%; 89margin: 0% 2%;1011 11/只打印所有文本框的值1213for(WebElement e: allInputs) 1415if (e.getribute(“type”).equals(“text”) 1617System.out.prln(e.getText().toString(); /打印出每個文本框里的值1819202122232425 注意:使用claame來進(jìn)行元素定位時,有時會碰到
8、一個元素指定了若干個class屬性值的“復(fù)合樣式”的情況,如下面這個button:登錄。這個button元素指定了三個不同的css偽類名作為它的樣式屬性值,此時就必須結(jié)合后面要介紹的csector方法來定位了,稍后會有詳細(xì)例子。5. By.linkT ext()這個方法比較直接,即通過超文本長成這個樣子:上的文字信息來定位元素,這種方式一般專門用于定位頁面上的超文本。通常一個超文本會定位這個元素時,可以使用下面的代碼進(jìn)行操作:6. By.partialLinkT ext()這個方法是上一個方法的擴(kuò)展。當(dāng)你不能準(zhǔn)確知道超文字進(jìn)行匹配。代碼如下:上的文本信息或者只想通過一些關(guān)鍵字進(jìn)行匹配時,可以使
9、用這個方法來通過部分1 public class SearchElementsByPartialLinkText 23public sic void main(String args) 45WebDriver driver = new FirefoxDriver(); 67 HYPERLINK http:/w/ driver.get(http:/w); 89WebElement aboutLink = driver.findElement(By.partialLinkText(About); 1011aboutLink.click(); 12131415 1 public class Sear
10、chElementsByLinkText 23public sic void main(String args) 45WebDriver driver = new FirefoxDriver(); 67 HYPERLINK http:/w/ driver.get(http:/w); 89WebElement aboutLink = driver.findElement(By.linkText(About); 1011aboutLink.click(); 12131415 1 About1415 注意:使用這種方法進(jìn)行定位時,可能會引起是,當(dāng)你的頁面中不止一個超包含About時,findElem
11、ent方法只會返回第一個查找到的元素,而不會返回所有符合條件的元素。如果你要想獲得所有符合條件的元素,還是只能使用findElements方法。7. By.xpath()這個方法是非常強(qiáng)大的元素查找方式,使用這種方法幾乎可以定位到頁面上的任意元素。在正式開始使用XPath進(jìn)行定位前,先了解下什么是XPath。XPath是XML Path的簡稱,由于HTML文檔本身就是一個標(biāo)準(zhǔn)的XML頁面,所以可以使用XPath的語法來定位頁面元素。假設(shè)現(xiàn)在以圖(2)所示HTML代碼為例,要對應(yīng)的對象,XPath語法如下:圖(2)絕對路徑寫法(只有一種),寫法如下:頁面上的form元素(即源碼中的第3行):/h
12、tml/body/form1注意:1. 元素的xpath絕對路徑可通過firebug直接查詢。2. 一般不使用絕對路徑的寫法,因?yàn)橐坏╉撁娼Y(jié)構(gòu)發(fā)生變化,該路徑也隨之失效,必須重新寫。3. 絕對路徑以單/號表示,而下面要講的相對路徑則以/表示,這個區(qū)別非常重要。另外需要多說一句的是,當(dāng)xpath 的路徑以/開頭時,表示讓Xpath引擎從文檔的根節(jié)點(diǎn)開始。當(dāng)xpath 路徑以/開頭時,則表示讓xpath 引擎從文檔的任意符合的元素節(jié)點(diǎn)開始進(jìn)行。而當(dāng)/出現(xiàn)在xpath 路徑中時,則表示尋找父節(jié)點(diǎn)的直接子節(jié)點(diǎn),當(dāng)/出現(xiàn)在xpath 路徑中時,表示尋找父節(jié)點(diǎn)下任意符合條件的子節(jié)點(diǎn),不管嵌套了多少層級(這
13、些下面都有例子,大家可以參照來試驗(yàn))。弄清這個原則,就可以理解其實(shí)xpath 的路徑可以絕對路徑和相對路徑混合在一起來進(jìn)行表示,想怎么玩就怎么玩。下面是相對路徑的寫法:查找頁面根元素:/查找頁面上所有的input元素:/input查找頁面上第一個form元素內(nèi)的直接子input元素(即只包括form元素的下一級input元素,使用絕對路徑表示,單/號):/form1/input查找頁面上第一個form元素內(nèi)的所有子input元素(只要在form元素內(nèi)的input都算,不管還嵌套了多少個其他號):/form1/input查找頁面上第一個form元素:/form1查找頁面上id為loginForm
14、的form元素:/formid=loginForm查找頁面上具有name屬性為username的input元素:/inputname=username查找頁面上id為loginForm的form元素下的第一個input元素:/formid=loginForm/input1,使用相對路徑表示,雙/查找頁面具有name屬性為contiune并且type屬性為button的input元素:/inputname=continuetype=button查找頁面上id為loginForm的form元素下第4個input元素:/formid=loginForm/input4 Xpath功能很強(qiáng)大,所以也可以
15、寫得更加復(fù)雜一些,如下面圖(3)的HTML源碼。圖(3)可以像下面這樣寫:如果現(xiàn)在要id為“J_password”的input元素,該怎么寫呢?也可以寫成:這里解釋一下,其中/*id= J_login_form這一段是指在根元素下查找任意id為J_login_form的元素,此時相當(dāng)于到了form元素。后面的路徑必須按照源碼的層級依次往下寫。按照圖(3)所示代碼中,要找的input元素包含在一個dt內(nèi),而dt又包含在dl內(nèi),所以中不能寫成/*間必須寫上dl和dt兩層,才到input這層。當(dāng)然也可以用*號省略具體的名稱,但元素的層級關(guān)系必須體現(xiàn)出來,比如id=J_login_form/input
16、id=J_password,這樣肯定會報錯的。前面講的都是xpath中基于準(zhǔn)確元素屬性的定位,其實(shí)xpath作為定位也可以用于模糊匹配。比如下面圖(4)所示代碼:圖(4)這段代碼中的“退出”這個超,沒有標(biāo)準(zhǔn)id元素,只有一個rel和href,不是很好定位。不妨主要有三種方式,舉例如下。a. 用contains關(guān)鍵字,定位代碼如下:就用xpath的幾種模糊匹配模式來定位它吧,這句話的意思是尋找頁面中href屬性值包含有l(wèi)ogout這個單詞的所有a元素,由于這個退出按鈕的href屬性里肯定會包含logout,所以這種方式是可行的,也會經(jīng)常用到。其中后面可以跟該元素任意的屬性名。b. 用start-
17、with,定位代碼如下:這句的意思是尋找rel屬性以nofo開頭的a元素。其中后面的rel可以替換成元素的任意其他屬性。c. 用Text關(guān)鍵字,定位代碼如下:這個方法可謂相當(dāng)霸氣啊。直接查找頁面當(dāng)中所有的退出二字,根本就不用知道它是個a元素了。這種方法也經(jīng)常用于純文字的查找。1 driver.findElement(By.xpath(“/*text()=退出);1 driver.findElement(By.xpath(“/astarts-with(rel, nofo);1 driver.findElement(By.xpath(“/acontains(href, logout)”);WebE
18、lement password = driver.findElement(By.xpath(/* id=J_login_form/*/*/inputid=J_password);WebElement password = driver.findElement(By.xpath(/* id=J_login_form/dl/dt/inputid=J_password);另外,如果知道超元素的文本內(nèi)容,也可以用這種方式一般用于知道超上顯示的部分或全部文本信息時,可以使用。最后,關(guān)于xpath這種定位方式,webdriver會將整個頁面的所有元素進(jìn)行掃描以定位所需要的元素,所以這是一個非常費(fèi)時的操作,
19、如果你的中大量使用xpath做元素定位的話,將導(dǎo)致你的執(zhí)行速度大大降低,所以請慎用。8. By.csector()csector這種元素定位方式跟xpath比較類似,但執(zhí)行速度較快,而且各種瀏覽器對它的支持都相當(dāng)?shù)轿?,所以功能也是蠻強(qiáng)大的。下面是一些常見的csector的定位方式:定位id為flrs的div元素,可以寫成:#flrs注:相當(dāng)于xpath語法的/divid=flrs定位id為flrs下的a元素,可以寫成 #flrs a 注:相當(dāng)于xpath語法的/divid=flrs/a定位id為flrs下的href屬性值為/forexle/about.html的元素,可以寫成: #flrs a
20、href=”/forexle/about.html”如果需要指定多個屬性值時,可以逐一加在后面,如#flrs inputname=”username”type=”text”。明白基本語法后,來嘗試用csector方式來圖(3)中選中的那個input對象,代碼如下:同樣必須注意層級關(guān)系,這個不能省略。ector還有一個用處是定位使用了復(fù)合樣式表的元前在第4種方式claame里面提到過?,F(xiàn)在就來看看如何通過cscsector來到第4種方式中提到的那個button。button代碼如下:ector元素代碼如下:cs。這樣就可以順利到使用了復(fù)合樣式的元素了。此外,csector還有一些高級用法,如果熟練后可以更加方便地幫助定位元素,如可以利用用于匹配一個前綴,$用于匹配一個后綴,*用于匹配任意字符。例如:匹配一個有id屬性,并且id屬性是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣告公司自由職業(yè)者合同模版
- 合同補(bǔ)充協(xié)議簽訂匯報
- 高中歷史第三章第二次世界大戰(zhàn)3.5二戰(zhàn)傷亡人數(shù)統(tǒng)計(jì)文本素材北師大版選修3
- 2025屆高考地理一輪復(fù)習(xí)第十五章區(qū)域發(fā)展與區(qū)域聯(lián)系36產(chǎn)業(yè)轉(zhuǎn)移-以東亞為例學(xué)案新人教版
- 2025屆高考?xì)v史一輪復(fù)習(xí)模塊一政治文明歷程專題一古代中國的政治制度第2講走向“大一統(tǒng)”的秦漢政治學(xué)案人民版
- 2024外墻涂料施工合同范本
- 2024餐飲店鋪轉(zhuǎn)讓合同文檔模板
- 2024新版銷售代理合同范本
- 2024全屋定制合同
- 2024戶外廣告經(jīng)營權(quán)的轉(zhuǎn)讓合同
- 三級數(shù)學(xué)下冊 面積1 滬教
- 圓面積公式的推導(dǎo)優(yōu)秀課件
- 科學(xué)實(shí)驗(yàn):磁懸浮課件
- 六病區(qū)護(hù)理創(chuàng)新 改良冰敷袋課件
- ??低?視頻監(jiān)控原理培訓(xùn)教材課件
- 沖電樁-物業(yè)同意安裝證明-范本
- 船舶電子電氣英語考試題庫(含答案)
- 2021年中國鹽業(yè)集團(tuán)有限公司校園招聘筆試試題及答案解析
- 輸煤系統(tǒng)配煤優(yōu)化qc成果報告運(yùn)行四值
- 投標(biāo)貨物項(xiàng)目實(shí)施方案
- 幼兒園中班科學(xué)《中國茶》課件
評論
0/150
提交評論