經常看到有人問元素屬性都相同,怎么定位,這里總結一下。
下面以Xpath為例講解,CSS其實也是一樣的,只是語法不一樣罷了。網上說CSS會比Xpath快一些,但在Katalon主用Xpath,感覺也還行。另外Katalon做為一個產品,他們選擇主打Xpath,相信也是有原因的。當然了,也有極小可能他們的骨干對Xpath比較熟。Katalon也支持CSS,但不會像Xpath那樣智能提示你多種自動定位語法。
想要定位的得心應手,首先要對Xpath語法了如指掌,可以看我之前的一篇文章:https://www.cnblogs.com/songzhenhua/p/10260945.html
這里單獨列一些比較技巧性的定位語法加深印象:
//span[text()=""] 完全匹配文本
//span[contains(text(),"")] 包含文本
//div[contains(@class,'xxx')] 屬性包含
//input[not(@id='123')] 找id不為123的input
//input[starts-with(@class,'xxx')] 開頭匹配
//span[substring(@name,3,5)='xxxxx'] name屬性第3個字符開始的5個字符是xxxxx的
//span[sbustring-before(@class,"-")="spanclass1"] class屬性中-字符前面的字符是spanclass1
//span[sbustring-after(@class,"-")="spanclass1"] class屬性中-字符后面的字符是spanclass1
//div[@class='xxx' and @type='xxx'] 多個屬性定位,也能or
//span[position()<3] 索引位置小於3的所有span
//span[last()-1] 倒數第二個span
//div[div[@id='xxx']] 依靠子節點定位
//li[.//a[contains(., 'Mandarin')]]//a[contains(., 'Outstanding')] 包含文本
在編寫Xpath定位語句時,可以先在Chrome里調試:按F12打開開發者工具,在下面的Console中輸入如$x('//a[@class="mnav"]'),注意定位的時候內外層單/雙引號均可,但不能重復。如果Console沒打開可以按ESC鍵打開。Chrome里定位好后,再去Katalon編寫。
一、但凡元素有1個屬性有區別,我們就可以拿這個屬性來定位,如id、name、class、type、href、text()、自定義的屬性等等。
二、元素所有屬性完全一樣。
(1)元素集中在一起,如一個div下有10個a,可以用下標定位
如同樣定位百度首頁的新聞鏈接,Chrome和Katalon分別如下:
實例:
(//a[@class="mnav"])[1] 定位第1個
(//a[@class="mnav"])[last()] 定位最后1個
(//a[@class="mnav"])[last()-1] 定位倒數第2個
(2)元素散落在各處,可以用下標,也可以用相對路徑或Xpath軸定位
我編寫了一個特殊的HTML以方便講解:
相對路徑,如定位最后一個div:
//div[img[@src='b.gif']] 依靠子節點定位
//img[@src='b.gif']/.. 依靠子節點取父節點
(//li[@class='node1']/div)[3] 依靠父節點取子節點
Xpath軸定位,這里只說幾個最有用的:
following,選取文檔中當前節點結束標簽后的所有節點(不分層級),如定位倒數第3個img:
//li[@class='node1']/following::img[1] 先定位第2個li,再往后數第1個img
preceding,選取文檔中當前節點開始標簽前的所有節點(不分層級),如定位倒數第2個img:
//img[@src='b.gif']/preceding::img[1] 先定位最后1個img,再往前數第1個img
following-sibing,選取當前節點之后的兄弟節點,如定位第4個div:
//div[@id='div1']/following-sibing::div[1] 先定位第3個div,再往后數第1個兄弟div
preceding-sibling,選取當前節點之前的兄弟節點,如定位第2個div:
//div[@id='div1']/preceding-sibling::div[1] 先定位第3個div,再往前數第1個兄弟div
我們注意到上面講下標的時候,有時候下標在()內,有時候下標在()外:
在()內時表示找路徑中的第X個,下標從1開始;如下圖,//li/div[1]表示找li下的第1個div,只不過在我們這個例子中有2個符合條件的。
在()外時,表示按()內的條件找到的元素的列表中的第X個,在Chrome中下標從0開始,在Katalon中下標從1開始;如下圖,(//li/div)[1]表示找li下的div的列表中的第1個,在這個例子中//li/div一共找到7個div,會返回一個列表,里面有7個元素,()[1]表示取第1個,和Python的列表一樣。
以上都是講的元素相同時定位某一個元素,如果要相同元素全都操作一遍,可以看katalon系列十六:https://www.cnblogs.com/songzhenhua/p/10202327.html
三、無法定位的元素靠其他元素的偏移量點擊
有時候Xpath寫的沒錯,但就是定位不到;有時候要點svg或flash內的某點,但這些元素都不支持定位。這時候我們可以先定位它們旁邊的一個基准元素,然后通過點擊這個基准元素的一個偏移點來實現目標的點擊。
Katalon中提供了Click Offset關鍵字,可實現偏移點擊。在Object中放入基准元素,在Input里輸入偏移量坐標。
注意偏移的基點是基准元素的左上角。比如輸入10,100:表示點擊基准元素左上角往右10元素,再往下100元素的那個位置;-50,-50:表示點擊基准元素左上角往左50元素,再往上50元素的那個位置。
在selenium中可以用ActionChains實現。
---------------------------------------------------------------------------------
關注微信公眾號即可在手機上查閱,並可接收更多測試分享~