第1章 aiuoupoup
字數:15138 加入書籤
在使用seleniu webdriver進行元素定位時,通常使用fdelent或fdelents方法結合by類返回的元素句柄來定位元素。其中by類的常用定位方式共八種,現分別介紹如下。
1 byna
假設我們要測試的頁麵源碼如下:
當我們要用na屬性來引用這個button並點擊它時,代碼如下:
view de
2 byid
頁麵源碼如下:
1
要引用該button並點擊它時,代碼如下:
複製代碼
1 public css searchbuttonbyid {
2
3 public static void a(strg[] args){
4
5 webdriver driver = new firefoxdriver;
6
7 driverget(““);
8
9 webelent searchbox = driverfdelent(byid(“gbqfba“));
10
11 searchboxclick;
12
13 }
14
15 }
複製代碼
3 bytagna
該方法可以通過元素的標簽名稱來查找元素。該方法跟之前兩個方法的區別是,這個方法搜索到的元素通常不止一個,所以一般建議結合使用fdelents方法來使用。比如我們現在要查找頁麵上有多少個button,就可以用button這個tagna來進行查找,代碼如下:
複製代碼
public css searchpagebytagna{
public static void a(strg[] args){
webdriver driver = new firefoxdriver;
driverget(““);
list
systeoutprtln(buttonssize);//打印出button的個數
}
}
複製代碼
另外,在使用tagna方法進行定位時,還有一個地方需要注意的是,通常有些htl元素的tagna是相同的,如下圖(1)所示。
圖(1)
從圖中我們可以看到,單選框、複選框、文本框和密碼框的元素標簽都是put,此時單靠tagna無法準確地得到我們想要的元素,需要結合type屬性才能過濾出我們要的元素。示例代碼如下:
複製代碼
1 public css searchelentsbytagna{
2
3 public static void a(strg[] args){
4
5 webdriver driver = new firefoxdriver;
6
7 driverget(““);
8
9 list
10
11 //隻打印所有文本框的值
12
13 for(webelent e: allputs){
14
15 if (egetattribute(“type”)equals(“text”)){
16
17 systeoutprtln(egettexttostrg);//打印出每個文本框裏的值
18
19 }
20
21 }
22
23 }
24
25 }
複製代碼
4 bycssna
cssna屬性是利用元素的css樣式表所引用的偽類名稱來進行元素查找的方法。對於任何htl頁麵的元素來說,一般程序員或頁麵設計師會給元素直接賦予一個樣式屬性或者利用css文件裏的偽類來定義元素樣式,使元素在頁麵上顯示時能夠更加美觀。一般css樣式表可能會長成下麵這個樣子:
複製代碼
1 buttonstyle{
2
3 width: 50px;
4
5 height: 50px;
6
7 border-radi: 50;
8
9 arg: 0 2;
10
11 }
複製代碼
定義好後,就可以在頁麵元素中引用上述定義好的樣式,如下:
1
如果此時我們要通過cssna屬性來查找該button並操作它的話,就可以使用cssna屬性了,代碼如下:
複製代碼
1 public css searchelentsbycssna{
2
3 public static void a(strg[] args){
4
5 webdriver driver = new firefoxdriver;
6
7 driverget(““);
8
9 webelent searchbox = driverfdelent(bycssna(“buttonstyle“));
10
11 searchboendkeys(“hello, world“);
12
13 }
14
15 }
複製代碼
注意:使用cssna來進行元素定位時,有時會碰到一個元素指定了若幹個css屬性值的“複合樣式”的情況,如下麵這個button:。這個button元素指定了三個不同的css偽類名作為它的樣式屬性值,此時就必須結合後麵要介紹的cssselector方法來定位了,稍後會有詳細例子。
5 bylktext
這個方法比較直接,即通過超文本鏈接上的文字信息來定位元素,這種方式一般專門用於定位頁麵上的超文本鏈接。通常一個超文本鏈接會長成這個樣子:
1
我們定位這個元素時,可以使用下麵的代碼進行操作:
複製代碼
1 public css searchelentsbylktext{
2
3 public static void a(strg[] args){
4
5 webdriver driver = new firefoxdriver;
6
7 driverget(““);
8
9 webelent aboutlk = driverfdelent(bylktext(“about google“));
10
11 aboutlkclick;
12
13 }
14
15 }
複製代碼
6 bypartiallktext
這個方法是上一個方法的擴展。當你不能準確知道超鏈接上的文本信息或者隻想通過一些關鍵字進行匹配時,可以使用這個方法來通過部分鏈接文字進行匹配。代碼如下:
複製代碼
1 public css searchelentsbypartiallktext{
2
3 public static void a(strg[] args){
4
5 webdriver driver = new firefoxdriver;
6
7 driverget(““);
8
9 webelent aboutlk = driverfdelent(bypartiallktext(“about“));
10
11 aboutlkclick;
12
13 }
14
15 }
複製代碼
注意:使用這種方法進行定位時,可能會引起的問題是,當你的頁麵中不止一個超鏈接包含about時,fdelent方法隻會返回第一個查找到的元素,而不會返回所有符合條件的元素。如果你要想獲得所有符合條件的元素,還是隻能使用fdelents方法。
7 byxpath
這個方法是非常強大的元素查找方式,使用這種方法幾乎可以定位到頁麵上的任意元素。在正式開始使用xpath進行定位前,我們先了解下什麽是xpath。xpath是xl path的簡稱,由於htl文檔本身就是一個標準的xl頁麵,所以我們可以使用xpath的語法來定位頁麵元素。
假設我們現在以圖(2)所示htl代碼為例,要引用對應的對象,xpath語法如下:
圖(2)
絕對路徑寫法(隻有一種),寫法如下:
引用頁麵上的for元素(即源碼中的第3行):/htl/body/for[1]
注意:1元素的xpath絕對路徑可通過firebug直接查詢。2一般不推薦使用絕對路徑的寫法,因為一旦頁麵結構發生變化,該路徑也隨之失效,必須重新寫。3絕對路徑以單/號表示,而下麵要講的相對路徑則以//表示,這個區別非常重要。另外需要多說一句的是,當xpath的路徑以/開頭時,表示讓xpath解析引擎從文檔的根節點開始解析。當xpath路徑以//開頭時,則表示讓xpath引擎從文檔的任意符合的元素節點開始進行解析。而當/出現在xpath路徑中時,則表示尋找父節點的直接子節點,當//出現在xpath路徑中時,表示尋找父節點下任意符合條件的子節點,不管嵌套了多少層級(這些下麵都有例子,大家可以參照來試驗)。弄清這個原則,就可以理解其實xpath的路徑可以絕對路徑和相對路徑混合在一起來進行表示,想怎麽玩就怎麽玩。
下麵是相對路徑的引用寫法:
查找頁麵根元素://
查找頁麵上所有的put元素://put
查找頁麵上第一個for元素內的直接子put元素(即隻包括for元素的下一級put元素,使用絕對路徑表示,單/號)://for[1]/put
查找頁麵上第一個for元素內的所有子put元素(隻要在for元素內的put都算,不管還嵌套了多少個其他標簽,使用相對路徑表示,雙//號)://for[1]//put
查找頁麵上第一個for元素://for[1]
查找頁麵上id為logr的for元素://for[id=&039;logr&039;]
查找頁麵上具有na屬性為erna的put元素://put[na=&039;erna&039;]
查找頁麵上id為logr的for元素下的第一個put元素://for[id=&039;logr&039;]/put[1]
查找頁麵具有na屬性為ntiune並且type屬性為button的put元素://put[na=&039;ntue&039;][type=&039;button&039;]
查找頁麵上id為logr的for元素下第4個put元素://for[id=&039;logr&039;]/put[4]
xpath功能很強大,所以也可以寫得更加複雜一些,如下麵圖(3)的htl源碼。
圖(3)
如果我們現在要引用id為“j_password”的put元素,該怎麽寫呢?我們可以像下麵這樣寫:
webelent password = driverfdelent(byxpath(“//[id=&039;j_log_for&039;]/dl/dt/put[id=&039;j_password&039;]“));
也可以寫成:
webelent password = driverfdelent(byxpath(“//[id=&039;j_log_for&039;]///put[id=&039;j_password&039;]“));
這裏解釋一下,其中//[id=’ j_log_for’]這一段是指在根元素下查找任意id為j_log_for的元素,此時相當於引用到了for元素。後麵的路徑必須按照源碼的層級依次往下寫。按照圖(3)所示代碼中,我們要找的put元素包含在一個dt標簽內,而dt又包含在dl標簽內,所以中間必須寫上dl和dt兩層,才到put這層。當然我們也可以用號省略具體的標簽名稱,但元素的層級關係必須體現出來,比如我們不能寫成//[id=&039;j_log_for&039;]/put[id=&039;j_password&039;],這樣肯定會報錯的。
前麵講的都是xpath中基於準確元素屬性的定位,其實xpath作為定位神器也可以用於模糊匹配。比如下麵圖(4)所示代碼:
圖(4)
這段代碼中的“退出”這個超鏈接,沒有標準id元素,隻有一個rel和href,不是很好定位。不妨我們就用xpath的幾種模糊匹配模式來定位它吧,主要有三種方式,舉例如下。
a用ntas關鍵字,定位代碼如下:
1 driverfdelent(byxpath(“//a[ntas(href,‘logout’)]”));
這句話的意思是尋找頁麵中href屬性值包含有logout這個單詞的所有a元素,由於這個退出按鈕的href屬性裏肯定會包含logout,所以這種方式是可行的,也會經常用到。其中後麵可以跟該元素任意的屬性名。
b用start-with,定位代碼如下:
1 driverfdelent(byxpath(“//a[starts-with(rel,‘nofo’)]));
這句的意思是尋找rel屬性以nofo開頭的a元素。其中後麵的rel可以替換成元素的任意其他屬性。
c用text關鍵字,定位代碼如下:
1 driverfdelent(byxpath(“//[text=’退出’]));
這個方法可謂相當霸氣啊。直接查找頁麵當中所有的退出二字,根本就不用知道它是個a元素了。這種方法也經常用於純文字的查找。
另外,如果知道超鏈接元素的文本內容,也可以用
1 driverfdelent(byxpath(“//a[ntas(text,’退出’)]));
這種方式一般用於知道超鏈接上顯示的部分或全部文本信息時,可以使用。
最後,關於xpath這種定位方式,webdriver會將整個頁麵的所有元素進行掃描以定位我們所需要的元素,所以這是一個非常費時的操作,如果你的腳本中大量使用xpath做元素定位的話,將導致你的腳本執行速度大大降低,所以請慎用。
8 bycssselector
cssselector這種元素定位方式跟xpath比較類似,但執行速度較快,而且各種瀏覽器對它的支持都相當到位,所以功能也是蠻強大的。
下麵是一些常見的cssselector的定位方式:
定位id為flrs的div元素,可以寫成:flrs 注:相當於xpath語法的//div[id=’flrs’]
定位id為flrs下的a元素,可以寫成flrs > a 注:相當於xpath語法的//div[id=’flrs’]/a
定位id為flrs下的href屬性值為/forexaple/abouthtl的元素,可以寫成:flrs > a[href=”/forexaple/abouthtl”]
如果需要指定多個屬性值時,可以逐一加在後麵,如flrs > put[na=”erna”][type=”text”]。
明白基本語法後,我們來嚐試用cssselector方式來引用圖(3)中選中的那個put對象,代碼如下:
webelent password = driverfdelent(bycssselector(“j_log_for>dl>dt>put[id=’ j_password’]“));
同樣必須注意層級關係,這個不能省略。
cssselector還有一個用處是定位使用了複合樣式表的元素,之前在第4種方式cssna裏麵提到過。現在我們就來看看如何通過cssselector來引用到第4種方式中提到的那個button。button代碼如下:
cssselector引用元素代碼如下:
driverfdelent(bycssselector(“buttonbtnbtn_bigbtn_subit“))
。這樣就可以順利引用到使用了複合樣式的元素了。
此外,cssselector還有一些高級用法,如果熟練後可以更加方便地幫助我們定位元素,如我們可以利用用於匹配一個前綴,用於匹配一個後綴,用於匹配任意字符。例如:
匹配一個有id屬性,並且id屬性是以”id_prefix_”開頭的超鏈接元素:a[id=&039;id_prefix_&039;]
匹配一個有id屬性,並且id屬性是以”_id_sufix”結尾的超鏈接元素:a[id=&039;_id_sufix&039;]
匹配一個有id屬性,並且id屬性中包含”id_pattern”字符的超鏈接元素:a[id=&039;id_pattern&039;]
最後再總結一下,各種方式在選擇的時候應該怎麽選擇:
1當頁麵元素有id屬性時,最好盡量用id來定位。但由於現實項目中很多程序員其實寫的代碼並不規範,會缺少很多標準屬性,這時就隻有選擇其他定位方法。
2 xpath很強悍,但定位性能不是很好,所以還是盡量少用。如果確實少數元素不好定位,可以選擇xpath或cssselector。
3當要定位一組元素相同元素時,可以考慮用tagna或na。
4當有鏈接需要定位時,可以考慮lktext或partiallktext方式。
(本章完)