原文地址:
https://www.softwaretestinghelp.com/xpath-writing-cheat-sheet-tutorial-examples/
作者:桃子
Web應(yīng)用程序由不同類型的Web元素組成,例如用于單擊按鈕Web元素,輸入以鍵入文本的Web元素,下拉列表专肪,單選按鈕等拇厢。
這些Web元素也稱為標(biāo)記或節(jié)點椭岩。
在自動化Web應(yīng)用程序時竟趾,首先要編寫一個自動化腳本冯事,該腳本將找到Web元素宿接,對其執(zhí)行操作赘淮,例如,單擊按鈕睦霎,在輸入框中輸入文本梢卸,選擇復(fù)選框,選擇單選按鈕副女,向上或向下滾動蛤高,最后驗證操作的預(yù)期行為
找到一個元素就像在地圖上找到某人的房子一樣。我們在沒有任何外部幫助的情況下找到朋友家的唯一方法就是我們應(yīng)該有一張地圖并知道要找什么(房子)碑幅。
在我們的案例中戴陡,地圖就好像DOM(HTML標(biāo)簽,JavaScript等)沟涨,其中存在所有Web元素恤批,以及我們想要查找的特定Web元素都在地圖里
找到元素的唯一地址或路徑后,自動化腳本將根據(jù)測試場景對其執(zhí)行某些操作裹赴。例如喜庞,您要驗證單擊按鈕后打開的頁面的URL地址是否正確
但是,找到Web元素的唯一地址/路徑并不能成功驗證棋返,因為可能存在類似的標(biāo)記延都,相同的屬性值,相同的路徑睛竣,因為很難為稱為“XPATH”的Web元素創(chuàng)建精確的唯一地址晰房。
在這里,我們將深入探討一些非常有效的技術(shù)射沟,為任何類型的Web元素生成有效且獨特的XPATH
有時您可以使用瀏覽器擴(kuò)展輕松創(chuàng)建XPath嫉你,但在我的自動化測試職業(yè)生涯中,我遇到了無數(shù)傳統(tǒng)瀏覽器擴(kuò)展無法工作的情況躏惋,您必須使用自己的創(chuàng)造力來提出自己的自定義XPath。我確信你已經(jīng)或?qū)⒚媾R類似的情況嚷辅。
在本教程中簿姨,我們將介紹如何為Web元素創(chuàng)建最終XPath的20種最佳方法,即使代碼更改后,XPath將始終保持有效(除非開發(fā)人員重寫整個特征/模塊)扁位。
通過了解所有這些技術(shù)准潭,您將成為編寫自己的XPath的大師,并且能夠編寫殺手級XPath域仇,幾乎沒有機(jī)會變得無效刑然。
首先,讓我們首先理解XPath語法并定義其每個部分
XPath的外觀以及每個部分的描述
//:選擇當(dāng)前節(jié)點暇务,例如input泼掠,div等。
標(biāo)記名:Web元素/節(jié)點的標(biāo)記名
@:選擇屬性
屬性:節(jié)點/特定Web元素的屬性名稱
值:屬性的值
在這里分享一些技巧垦细,80%的時間我的自動化測試腳本因XPath而失敗择镇。這是由于提供的XPath或XPath有多個Web元素?zé)o效或頁面尚未加載。
因此括改,只要您的測試用例失斈逋恪:
復(fù)制你的XPath。
在DOM中的瀏覽器(F12或開發(fā)人員工具窗口)中搜索它以驗證它是否有效(參見下圖)嘱能。
專業(yè)提示1:確保路徑是唯一的吝梅,在DOM中搜索兩次時,不會出現(xiàn)其他網(wǎng)絡(luò)元素惹骂。
專業(yè)提示2:有時會出現(xiàn)計時問題苏携,這意味著在腳本查找時您的網(wǎng)頁元素/頁面尚未加載,因此會增加一些等待時間并重新測試析苫。
專業(yè)提示3:可以在搜索Web元素之前打印整個DOM兜叨,這樣,可以通過查看控制臺來判斷您的Web元素是否存在于DOM中衩侥。
在我們深入研究XPath之前国旷,,如果您可以直接訪問開發(fā)團(tuán)隊茫死,或者您的團(tuán)隊位于您所在的位置跪但,那么請您的開發(fā)團(tuán)隊為您提供唯一的ID每個web元素或至少是您要用于Automation的元素,這將節(jié)省您的大量時間峦萎。
如果這種可能性無法實現(xiàn)屡久,那么您可能需要使用您的創(chuàng)造力并提出自己的定制XPath,這就是我們現(xiàn)在要學(xué)習(xí)的內(nèi)容爱榔。
#1)反向查找
假設(shè)你想點擊一個按鈕被环,就會有一個類似的按鈕。兩個按鈕都具有id屬性详幽,但它們是動態(tài)的筛欢,并且兩個按鈕元素中的屬性都不是唯一的浸锨。
在下面的場景中,我們要點擊“Test Interactive”的“Setting”按鈕版姑。
如果查看“設(shè)置”按鈕柱搜,則兩個代碼都相似。通過使用傳統(tǒng)方式剥险,例如id聪蘸,name,value表制,contains等健爬,它們都不會起作用。
// * [contains(text()夫凸,'Setting')]浑劳,這將產(chǎn)生兩個web元素。因此它并不是唯一的夭拌。
所以這是最終戰(zhàn)略魔熏,
>>首先,找到最接近的唯一標(biāo)簽鸽扁,在這種情況下蒜绽,它是<widget id ='rcTest'.........>
>>其次,找到最接近預(yù)期的Web元素的Web元素桶现,在本例中包含(text()躲雅,'TEST Interactive')。現(xiàn)在我們在<DIV>中存在'Setting'按鈕但是要點擊它骡和,我們首先需要使用雙點轉(zhuǎn)到主<DIV>相赁,如下所示。
>>如您所見慰于,我們處于<DIV>級別钮科,其中第二個Web元素為“設(shè)置”按鈕。這個<DIV>有兩個按鈕婆赠,我們想要轉(zhuǎn)到第二個按鈕绵脯,即“設(shè)置”按鈕。通過在末尾添加'/ button [2]'休里,我們可以為“設(shè)置”按鈕獲取我們獨特的XPATH蛆挫,如下所示
最終XPATH:
如果您認(rèn)為他們可能會將Web元素類型從“按鈕”更改為其他內(nèi)容,那么這是另一種生成方式妙黍。
“// * [@ id ='rcTEST'] // * [contains(text()悴侵,'TEST Interactive')] /..//* [contains(text(),'Setting')]”
或使用“跟隨兄弟”
#2)使用變量和自定義值
假設(shè)有一個Web應(yīng)用程序具有上傳/下載文件的FTP(“文件傳輸協(xié)議”)功能拭嫁,您可以通過單擊下載鏈接下載特定文件的測試用例可免。
首先筒繁,我們可以將我們要查找的文件名定義為變量。
String expectedfileName =“Test1”;
現(xiàn)在使用XPATH我們可以找到實際的文件名
在上面的XPath中巴元,...'/ tr / td [1] .getAttribute(“title”)'將轉(zhuǎn)到特定的行和第一列,并獲取title屬性的值驮宴。我們可以將實際文件名存儲到另一個變量中逮刨。
一旦我們同時擁有預(yù)期文件名和實際文件名,我們就可以比較兩者堵泽,如果兩者都匹配,我們只需單擊其下載鏈接即可
我們還可以在每行中創(chuàng)建一個循環(huán)并繼續(xù)驗證文件名,直到找到它為止彪笼。
#3)使用“XML”標(biāo)簽句伶,“AND”等
我們可以使用自定義標(biāo)簽生成唯一的XPATH并添加其他條件。
例如纹安,假設(shè)我們的主要Web元素存在于主<address>標(biāo)記中尤辱,并且有多個地址標(biāo)記,但您只想查找特定的地址標(biāo)記厢岂。所有地址標(biāo)簽都有一個類屬性光督,因此我們可以從中開始。
#4)使用屬性和表XPATH
假設(shè)我們想要鍵入放置在表中的Web元素塔粒,并將表放在表單元素中结借。
我們可以在DOM中找到名為“myForm”的所有表單。
#5)使用屬性卒茬,表和文本
假設(shè)您的Web元素位于Panel Table中船老,并且有一些常用文本。
首先從具有唯一屬性的面板開始圃酵,在這種情況下是'TITLE'柳畔。
#6)使用嵌套屬性生成XPATH
也可以使用嵌套屬性生成目標(biāo)Web元素的XPath。例如辜昵,在這種情況下荸镊,它將在DOM中查找特定屬性,然后在其中查找另一個屬性堪置。
#7)通過組合屬性躬存,分區(qū)和按鈕生成XPath
例如,在下面的XPath中舀锨,我能夠通過使用id(相對XPath)岭洲,一些div標(biāo)簽和一個按鈕來找到目標(biāo)web元素。
#8)XPATH使用CONTAINS坎匿,REVERSE LOOKUP等生成
一旦我有一個沒有直接識別的下拉菜單盾剩。我不得不使用CONTAINS雷激,REVERSE,DIVs屬性來提出最終的XPATH告私,如下所示屎暇。
#9)使用Relative,CONTAINS驻粟,REVERSE根悼,F(xiàn)OLLOWING SIBLING等生成XPath。
我遇到了應(yīng)用程序顯示圖形的情況蜀撑,每個圖形值都必須經(jīng)過驗證挤巡。但是,遺憾的是酷麦,每個值都沒有任何唯一標(biāo)識矿卑,因此我提出了最終的XPATH,如下圖所示沃饶,其中包含一個圖形值母廷,它結(jié)合了相對,包含绍坝,反向徘意,跟隨兄弟和div標(biāo)記
#10)使用Attributes,Contains轩褐,Reverse椎咧,Preceding-Sibling,Divs和Span生成XPath
#11)使用屬性把介,XML標(biāo)簽等勤讽。
在下面的XPATH,屬性和XML標(biāo)記中拗踢,序列用于提供Web元素的最終唯一地址脚牍。
#12)通過不查看整個頁面而是查看所有鏈接并包含而生成XPath
下面的XPath將僅查找整個頁面中包含“參數(shù)數(shù)據(jù)手動輸入”文本的鏈接。
#13)使用包含和屬性
#14)使用屬性巢墅,遵循兄弟姐妹和后代
#15)使用屬性诸狭,遵循兄弟,后代和文本
#16)使用標(biāo)題和文本
如果web元素是包含某些特定文本的標(biāo)題君纫,則XPath可能如下所示:
結(jié)論
在編寫殺手級XPATH時驯遇,它實際上取決于您對代碼的理解和分析。您對代碼的理解越多蓄髓,您在編寫有效XPATH時可以找到的方式就越多叉庐。
編寫XPath的第一步是找到與您的目標(biāo)Web元素最接近的唯一Web元素,并使用上面討論的不同技術(shù)(如屬性会喝,DIV陡叠,跟隨玩郊,包含等)保持接近。
最后枉阵,我們再次這樣說译红,如果您要求開發(fā)團(tuán)隊在您感興趣的所有Web元素中添加唯一ID,那么它將真正讓您的生活更輕松兴溜。
每當(dāng)sprint周期或新需求開始工作并且團(tuán)隊與新模型共享時临庇,我總是會經(jīng)歷所有模擬并考慮潛在的自動化測試案例,準(zhǔn)備一份將使用的所有潛在Web元素的列表在自動化測試和準(zhǔn)備我自己的ID昵慌。
一旦完成了所有Web元素的列表以及我建議的ID,我將事先將其分享給開發(fā)人員以用于開發(fā)代碼淮蜈。通過這種方式斋攀,我可以通過簡化XPATH編寫戰(zhàn)斗來獲得唯一的ID。
下面是編寫XPATH的不同方法的組合列表: