菜鳥(niǎo)學(xué)自動(dòng)化測(cè)試(五)-----selenium命令之定位頁(yè)面元素
定位頁(yè)面元素
對(duì)于很多selenium命令,target域是必須的。Target在web頁(yè)面范圍內(nèi)識(shí)別UI元素,它使用locatorType=location的格式。在很多情況下,locatorType可以省略,下面舉例方式來(lái)描述各種類型的locatorType.
假如,有如下一段HTML代碼:
復(fù)制代碼
html>
<body>
<form id= "loginForm" >
<input name= "username" type= "text" />
<input name= "password" type= "password" />
<input name= "continue" type= "submit" value= "Login" />
<input name= "continue" type= "button" value= "Clear" />
<a href= "continue.html" >Continue</a>
</form>
</body>
</html>
復(fù)制代碼
我們看看selenium提供了那些定位方式:
1. identifier定位
這是普遍的一種定位方式,當(dāng)不能識(shí)別為其它定位方式后,默認(rèn)為dientifier定位,在這種策略下,第一個(gè)使用id的頁(yè)面元素將被識(shí)別出來(lái),如果沒(méi)有使用指定id的元素,那么將識(shí)別第一個(gè)名字與指定條件相符的元素。
identifier識(shí)別html各項(xiàng)元素的定位策略如下:
identifier=loginForm //定位頁(yè)面元素為from
identifier=username //定位頁(yè)面元素為username
identifier=Continue //定位頁(yè)面元素為Continue
因?yàn)閕dentifier定位是默認(rèn)方式,因此“identifier=” 可以不寫(xiě)。
Continue //同樣表示定位頁(yè)面元素為Continue
2. id定位
這種定位方式比identifier定位范圍更窄,當(dāng)然也更具體,如果你知道元素id特征,使用這種方式:
id=loginFrom //定位頁(yè)面元素from
3. name定位
名稱定位方式將會(huì)識(shí)別第一個(gè)匹配名稱屬性的UI元素。如果多個(gè)元素?fù)碛邢嗤拿Q屬性,可以使用過(guò)濾器來(lái)進(jìn)一步優(yōu)化你的定位策略。默認(rèn)的過(guò)濾器是Value (匹配value特征):
name=username //定位頁(yè)面元素為username
name=Continue value=Clear //定位頁(yè)面元素為Continue ,值為Clear
name=Continue type=button //定位頁(yè)面元素為Continue ,類型為button
提示:
上述三種定位器使得selenium可以不依賴于UI元素在頁(yè)面上的位置而進(jìn)行測(cè)試。所以,當(dāng)頁(yè)面結(jié)構(gòu)發(fā)生變化時(shí),測(cè)試依然可以通過(guò)。有時(shí)候,設(shè)計(jì)人員頻繁改動(dòng)頁(yè)面的情況,通過(guò)id和name特征定位元素變的非常重要。
4. XPath定位
XPath是一種在XML文檔中定位元素的語(yǔ)言。因?yàn)镠TML可以看做XML的一種實(shí)現(xiàn),所以selenium用戶可是使用這種強(qiáng)大語(yǔ)言在web應(yīng)用中定位元素。
XPath擴(kuò)展了上面id和name定位方式,提供了很多種可能性,比如定位頁(yè)面上的第三個(gè)多選框。
xpath=/html/body/form[1] //路徑(html的任何輕微改變都會(huì)導(dǎo)致失敗)
//form[1] //HTML中的第三個(gè)form元素
xpath=//form[@id='loginForm'] //id為loginFrom的元素
//input[@name='username'] //input元素且其name為‘username’
//form[@id='loginForm']/input[1] //針對(duì)id為‘loginForm’的form,定位它的第一個(gè)input元素
//input[@name='continue'][@type='button'] //name為‘continue’且type為‘button’的input
//form[@id='loginForm']/input[4] //id為‘loingForm’的form,定位它的第四個(gè)input元素。
擴(kuò)展閱讀:
W3C XPath Recommendation: http://www.w3.org/TR/xpath/
XPath Tutorial: http://www.zvon.org/xxl/XPathTutorial/General/examples.html
http://www.w3.org/TR/xpath/
Firefox插件,可以幫助你獲取頁(yè)面元素的XPath:
XPath Checker Firebug
5. 通過(guò)超鏈接定位
可以通過(guò)連接文字來(lái)定位超鏈,如果兩個(gè)鏈接文字相同,那么第一個(gè)匹配的將被識(shí)別出來(lái)。
link=continue //定位頁(yè)面元素連接文字為continue
6. DOM定位
Document Object Model 被用于描述HTML文檔,可以使用javaScript來(lái)訪問(wèn)。
這一定位策略通過(guò)javaScript評(píng)估頁(yè)面上的元素,可以使用分級(jí)符號(hào)來(lái)簡(jiǎn)化元素定位。
因?yàn)镈OM定位以“document”開(kāi)始,所以“dom=”標(biāo)簽并不是必須的。
dom=document.getElementById('loginForm') // 定位頁(yè)面元素form
dom=document.forms['loginForm'] // 定位頁(yè)面元素form
dom=document.forms[0] // 定位頁(yè)面元素form
document.forms[0] .usernam //定位頁(yè)面元素username
document.forms[0] .elements[3] //定位頁(yè)面元素continue,它是form的第四個(gè)元素
7。 CSS定位
CSS(Cascading Style Sheets)是一種語(yǔ)言,它被用來(lái)描述HTML和XML文檔的表現(xiàn)。CSS使用選擇器來(lái)為頁(yè)面元素綁定屬性。這些選擇器可以被selenium用作另外的定位策略。
css=form#loginForm //定位頁(yè)面元素form
css=input[name="username"] //定位頁(yè)面元素username
css=input.required[type="text"] //定位頁(yè)面元素,其類型為text
css=input.passfield //定位頁(yè)面元素,其類型為password
css=#loginForm input[type="button"] //定位頁(yè)面元素,其類型為button
css=#loginForm input:nth-child(2) //定位頁(yè)面元素passfield,且它為from的第二個(gè)input子元素
擴(kuò)展閱讀:
http://www.w3.org/TR/css3-selectors/
提示:很多有經(jīng)驗(yàn)的selenium用戶推薦CSS定位方式,因?yàn)樗萖Path更快。而且可以在HTML文件中找到更復(fù)雜的對(duì)象。
------------------------------------------------------------------------------
菜鳥(niǎo)提示:
講了這么多頁(yè)面定位的方式,還是不明白干啥用的?
自動(dòng)化測(cè)試,我們通過(guò)工具來(lái)完成手工操作,如果我們要點(diǎn)擊一個(gè)按鈕,我們認(rèn)得那是一個(gè)按鈕,如何讓自動(dòng)化工具也認(rèn)得那是一個(gè)按鈕呢?如何讓工具認(rèn)得是“確定”按鈕,而不是“取消”按鈕呢。那每個(gè)按鈕都有不同的屬性,也許屬性完全相同但位置不同。我們要通過(guò)他們的特征描述它們,然后自動(dòng)化工具才能根據(jù)我們的描述去找到它們。
那么,轉(zhuǎn)換到我們的自動(dòng)化測(cè)試代碼是什么樣子呢?
//下面是在java代碼的實(shí)現(xiàn)
selenium.click("元素屬性的描述");
selenium.click("id=loginForm");
selemiun.click("name=Continue value=Clear");
......