selenium使用Xpath+CSS+JavaScript+jQuery的定位方法(治療selenium各種定位不到,點擊不了的併發症)

來源:互聯網
上載者:User

標籤:--   ntb   元素對象   smart   注意   好處   聯合   size   child   

跟你說,你總是靠那個firebug,chrome的F12啥的右擊複製xpath絕對總有一天踩著地雷炸的你死活定位不到,這個時候就需要自己學會動手寫xpath,人腦總比電腦聰明,開始把xpath文法給我學起來!

 

第1種方法:通過絕對路徑做定位(相信大家不會使用這種方式)

By.xpath("html/body/div/form/input")

By.xpath("//input")

 

第2種方法:通過元素索引定位

By.xpath("//input[4]")

 

第3種方法:使用xpath屬性定位

By.xpath("//input[@id=‘kw1‘]")

By.xpath("//input[@type=‘name‘ and @name=‘kw1‘]")

 

第4種方法:使用部分屬性值匹配(最強大的方法)

By.xpath("//input[starts-with(@id,‘nice‘)
By.xpath("//input[ends-with(@id,‘很漂亮‘)
By.xpath("//input[contains(@id,‘那麼美‘)]")

 

【說明】

 

starts-with 顧名思義,匹配一個屬性開始位置的關鍵字。

contains 匹配一個屬性值中包含的字串。

text() 匹配的是顯示文本資訊,此處也可以用來做定位用。

 

【舉例】

//input[starts-with(@name,‘name1‘)]     尋找name屬性中開始位置包含‘name1‘關鍵字的頁面元素

//input[contains(@name,‘na‘)]         尋找name屬性中包含na關鍵字的頁面元素

<a href="http://www.baidu.com">百度搜尋</a>,那麼xpath寫法為 //a[text()=‘百度搜尋‘]     或者    //a[contains(text(),"百度搜尋")]

 

 

【第二部分】我一位同事在使用selenium定位的時候踩到的坑

上次我有一個同事,定位元素的時候,用Firefox瀏覽器firebug工具,定位到這個HTML代碼:

<span onlick="88_da_33_699999_x64_3.01.3730.spkg" name="delete" />  大約是這樣,死活定位不到,然後用到了xpath屬性的並列關係,and關鍵字,才定位的到。

 

//*[contains(@onclick, ‘x64_3.01.3730.spkg‘) and @name=‘delete‘]

 

【第三部分】切換iframe時遇到的幾個鬼

 

(1)在切換ifame的時候,有時iframe是含有id的,就可以直接定位使用,但是當iframe沒有id資訊的時候,如,

 

當然實際情況中會遇到沒有id屬性和name屬性為空白的情況,這時候就需要先定位iframe元素對象,這裡可以通過tag先定位到,也能達到同樣效果。

如下代碼:

iframe = driver.find_element_by_tag_name("iframe")

driver.switch_to_frame(iframe)

切換完了之後,就可以去正常定位iframe裡面的元素,driver.find_element_by_tagname(table) 之類的,同時也可以用xpath的方式:例如 Xpath=//*[contains(@src, ‘sysmanage/systemupgrade.action‘)] 之類的。

 

(2)如果有多個(層級)iframe標籤,那你就要看看總共有iframe標籤了,看看你所定位的iframe是數組中的第幾個iframe元素(從0開始數起,基於JavaScript的),可以用chrome瀏覽器的F12的控制台(Console)就可以輸入document.getElementsByTagName(‘iframe‘).length這句代碼,即可列印出iframe的長度(也就是個數),然後按照從0開始數起。

 

【下面這張圖片可能有點大,看不到最右邊的Console,右擊圖片->新視窗開啟】

 

 

(3)當iframe上的操作完後,想重新回到首頁面上操作元素,這時候,就可以用switch_to_default_content()方法返回到首頁面。

如下代碼:

 

iframe = driver.find_element_by_tag_name("iframe")

driver.switch_to_frame(iframe)

switch_to_default_content()

 

(4)如何判斷元素是否在iframe上?
1.定位到元素後,切換到firepath介面。
2.看firebug工具左上方,如果顯示Top Window說明沒有iframe。
3.如果顯示iframe#xxx這樣的,說明在iframe上,#後面就是它的id。

 

【第四部分】selenium用javascript定位

 

因為selenium的核心引擎就是用JavaScript來驅動的,所以只要selenium內建的那些原始辣雞方法出現定位不了的、點擊不了的併發症一旦發作,就可以使用JavaScript大絕招,除了JavaScript,還有jQuery大絕招,一個個來,你陣亡了,他來替補,滔滔江水永不休。

 

一、以下總結了5種js定位的方法
除了id是定位到的是單個element元素對象,其它的都是elements返回的是list對象
1.通過id擷取
document.getElementById(“id”)
2.通過name擷取

 document.getElementsByName(“Name”)
返回的是list
3.通過標籤名選取元素
document.getElementsByTagName(“tag”)
4.通過CLASS類選取元素
document.getElementsByClassName(“class”)
相容性:IE8及其以下版本的瀏覽器未實現getElementsByClassName方法
5.通過CSS選取器選取元素
document.querySelectorAll(“css selector")
相容性:IE8及其以下版本的瀏覽器只支援CSS2標準的選取器文法

 

【舉例代碼】

js = ‘document.getElementById("helloId").click();‘

driver.execute_script(js)

 

js1 = ‘document.getElementsByClassName("helloName")[0].value = "王大明";‘   //整個HTML文檔裡第一個使用CSS樣式類的class="helloName"屬性,它的value屬性的值設定為“王大明”

driver.execute_script(js1)

 

【第五部分】selenium用jquery定位【簡直逆天,老天爺都驚呆了,眼睛瞪的滾圓】

 

JQuery是2006年1月誕生的一個基於封裝JavaScript的架構,你經常看到的貨幣符號帶上一個圓括弧$(‘XXX‘),其實就是document.getElementBy什麼什麼的這個js方法,至於XXX前面帶.的話,就是document.getElementByClass,帶#的話,就是document.getElementById。

 

 

 【看不清圖,右鍵新視窗開啟圖片】

1.Id

inputTest="$(‘#smart_input‘).val(‘帥氣的我還能再削‘)"

driver.execute_script(inputTest)

2.Class

inputTest="$(‘.usersearch‘).val(‘帥氣的我還能再削‘)"

3. Type

inputTest="$(‘:text‘).val(‘帥氣的我還能再削‘)"

 

 

4. 層級

inputTest="$(‘#searchForm>#smart_input‘).val(‘帥氣的我還能再削‘)"

inputTest="$(‘#searchForm #smart_input ‘).val(‘帥氣的我還能再削‘)"   【注意兩個id選取器“#searchForm #smart_input”中間是一個空格】

inputTest="$(‘#searchForm>input:first‘).val(‘帥氣的我還能再削‘)"

選擇最後一個input元素:

clickbutton="$(‘#searchForm>input:last‘).click()"

選擇第幾個input元素

inputTest="$(‘#searchForm>input:eq(0)‘).val(‘帥氣的我還能再削‘)"    從0開始算第一個

inputTest="$(‘#searchForm>input:nth-child(1)‘).val(‘帥氣的我還能再削‘)"   當然也可以這樣,nth-child從1開始算第一個

知識連結:

 

1、nth-child(N):下標從1開始;eq(N):下標從0開始;

2、nth-child(N):選擇多個元素;eq(N):選擇一個元素。

 

 

5. 其他

#inputTest="$(‘input[name=query]‘).val(‘帥氣的我還能再削‘)"

inputTest="$(‘input[id=smart_input]‘).val(‘帥氣的我還能再削‘)"

 

-------------------------------------------------------------------------------------------------------------------------------

 

 

【附錄1】xpath的文法使用基礎

 

Xpath的使用方法:

 例子 1:html/body/div[1]/div[2] (如果不熟悉html的朋友們,需要自行百度html。)

   該xpath 表示 : 在 html標籤下 -> body標籤下 -> 第一個div標籤下 -> 第二個div標籤

  很好理解,繼續

 

 例子 2:.//*[@id=‘content‘]/div[2]/ul

   這樣會有人不理解了 .//*[@id=‘content‘] 到底是什麼意思呢?

    . 代表當前路徑

    a//b 表示:在a標籤下的子孫輩b標籤

    * 可以是任何標籤

    [@id=‘content‘] 表示是 id 為 content

  所以:這個例子的意思是: id 為 content 的任何子標籤下面 -> 第二個 div標籤下 -> ul 標籤

  

Xpath基礎學習完畢,接下來開始進階學習

  //p[text()=‘a‘]  :文本為 a 的p標籤

  //p[text()=‘a‘]  : 文本包含 a 的p標籤

  //a[@class=‘abc‘]   :class 為 a的 p標籤 (當然咯。既然可以為 @class 就一定能用 @id ,為什麼不聯想下 @src 和@href呢?)

  //p[not(@class=‘a‘)]   :class 不為 a的 p標籤

 

好了,進階完畢,如果要使用更高階的Xpath要先屬性以上內容,然後聯合 Selenium使用

 

Xpath和其他定位方式的比較:(主要是和CSS定位的對比)

  Xpath的最大好處是能向上尋找,不過缺點是速度過慢。

 

【附錄2】CSS定位文法基礎

 

 CSS定位速度快,功能多,但是 不能向上尋找,比xpath好用,執行效率比xpath來的快,曾經做過兩種定位比較的測速,是本人認為最好用的定位方式。 大致用法總結: 下面都是精華哦
1、*:checked  選中*的checked元素
2、 li.refined.list.group.item (如果class中間有空格,可以.+.+.全寫也可以唯寫任意一個)
    .checkbox[type^=‘check‘][onclick*=‘Bebe‘][checked$=‘ed‘] +a
    (開頭^=   包含*=   結尾$= )+a 是選中同級的後面的a3、 li a        :選中 li 標籤的後代 a5、 li>a       :選中 li 標籤的子項目 a4、 li,a        :選中 li 和 a5、 li +a      :選中 li 同級的 下一個 a6、 li ~a       :選中 li 同級的 下面所有的 a7、 li>a:last-child  /  li>a:last-of-type  : 選中 li 下最後面一個 a8、 li:not([class*=‘_‘])    : li 中的 calss 不含 ‘_‘       li:not(:nth-of-type(1))    : 不含第一個 li 的所有 li9、 li>a:nth-child(n)   /  li>a:nth-of-type(n) :選中 li 下第 n 個 a      li>a:nth-last-child(n)   /  li>a:nth-last-of-type(n):選中 li 下,倒數第 n 個 a    如果 n = odd 表示奇數    如果 n = even 表示偶數
div h2:nth-child(n) : 當div的第n個子項目是h2的時候div h2:nth-of-type(n):   div下第n個h2子項目10、 div[style]     : div中包含 屬性style 11、 li>a:only-child      :li 下只有1個a的 a 標籤

selenium使用Xpath+CSS+JavaScript+jQuery的定位方法(治療selenium各種定位不到,點擊不了的併發症)

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.