31 Xpath復雜元素定位 find_element


(67,68,69)

目錄

一、python八大元素定位

 

正文

一、python八大元素定位方式

id、name、class_name、tag_name、link_text、partial_link_text、xpath、css_selector

1.元素定位

 得到的返回值是一個webelement的python對象.------》定位的元素,下面以百度頁面的輸入框為例:

 

 

① find_element_by_id("kw")

input_elem=driver.find_elemrnt_by_id("kw")
print(input_elem)  #webelement對象

得到的結果就是一個webelement

那么如何獲取元素的屬性?------就是獲取webelement的屬性,get_attribute()

attr = input_elem.get_attribute("name")
print(attr)

 注意:Python中,當前還不能直接修改元素,selenium沒有封裝對應的方法。

②find_element_by_id  VS find_elements_by_id

find_element_by_id :

 1)查找一個,得到的是一個webelement對象;

 2)找不到元素的話,報錯:NoSuchElementException

find_elements_by_id :

1).查找多個,得到一個列表

2.查找不到元素的話,得到的是一個空列表

在實際定位的時候,不知道該元素存不存在,可以用下面的判斷方法:

if not driver.find_elements_by_id("kk")
    print("該元素不存在")
else:
    print("該元素存在")

 

③name屬性定位---->find_element_by_name

driver.find_element_by_name("wd")
driver.find_elements_by_name("wd")

 

④class屬性---->class_name

driver.find_element_by_class_name("s_ipt")
driver.find_elements_by_class_name("s_ipt")

 

⑤link_text :通過超鏈接的文本,進行元素定位(只能定位超鏈接,其他的元素是不能定位的,所以只能定位a標簽)

e = driver.find_element_by_link_text("新聞")
e.click() #  如果定位成功,會點擊進入新聞這個鏈接的頁面

⑥partial_link_text:通過超鏈接的文本的一部分進行元素定位

e = driver.find_element_by_partial_link_text("")
e.click()

注意:若果有多個新開頭的超鏈接,永遠定位到的都是第一個。

 ⑦tagname  ---->定位的元素比較多,測試的時候很少用

 driver.find_element_by_tagname("input")

 

總結:以上6種定位方法,用的最多的是id、name、class_name用的最多

id:是唯一的

name:用戶輸入經常會帶name屬性(提前在瀏覽器中,F12,在源代碼中,按ctrl+F,查找元素出現的次數)

class_name:出現次數多

 

元素定位的坑

1.不要用可能會發生動態變化的屬性進行元素定位。------->屬性是靜態的才能定位

比如說:1)不規則的字符串(比較長可能是加密),就不能用這個屬性進行元素定位

    2)有些屬性有數字,純數字的,不能用來定位

    3)帶數字的,也要警惕

2.class_name定位的時候,class_name值中間不能有空格-------》class是分組的

下面定位百度,class_name的值中間有空格,是定位不到的

 

class = "bg s_btn"表示2個class,用空格分開。

所以通過class_name進行定位,只能寫其中一個。

driver.find_element_by_class_name("bg") 或者 driver.find_element_by_class_name("s_btn") 

 

 

 3.如何確定我的元素表達式只能找到一個元素

1).復制表達式到瀏覽器,在F12的源碼中ctrl+F

2).find_element只有一個元素

 

以上6種 元素定位的方式:通過單屬性定位只能定位特征明顯的元素。

下面介紹xpath,css_selector--------面試題

優勢:組合多個特征、組合多個屬性,能夠更加精准的定位元素;定位元素的時候,因為可以組合,有更大的靈活性。

面試題:八大元素定位有哪些?

先說八種元素定位方式;再說,其實沒有8種元素定位方式:find_element_by_id / by_name / by_tag_name / by class_name等都是在find_element()方法的基礎上,進行二次封裝的。其本質都是使用的find_element()方法,進行元素定位的。

如下:find_element()方法的源碼:

 

driver.find_element("id","kw")    ==  driver.find_element_by_id("kw")

即上面的語句是等價的。

 

 69節

⑦xpath

 1)定義:Xpath即XML路徑語言(XML Path language),用來確定XML文檔中某部分位置的語言。XML跟HTML很相像,所以也可以進行HTML

 2)使用xpath進行元素定位

     獲取xpath的表達式:

    ------1.通過瀏覽器,F12定位,在源碼上右擊,copy--》copy xpath 、copy selector、copy full xpath (第三順位)

    ------2.使用插件   (第二順位)

    ------3.自己編寫。(第一順位,最重要)

學習的時候:不要使用工具獲取xpath,有時候是不正確的,一般最好是自己寫。

實際項目中,節省時間可以使用插件。

3).絕對定位 相對定位

 

 絕對路徑 VS 相對路徑

在自動化測試中,使用相對路徑,不使用絕對路徑。

面試題:↓↓

絕對路徑:

   1)從最開始的位置,一層一層進入對應的元素。

   2)冗余,容錯性更差

相對路徑:

   1)在某個位置,不需要從最開始的位置

 2) 更加簡潔、靈活,容錯性更好

例如:前端工程師,喜歡加層級(多個div),使用絕對路徑就很可能找不到元素。相對路徑則比較靈活。容錯性更好。

 

3)xpath表達式 解釋

單個屬性定位

//*[@id = "kw"]  :查找任意的元素,這個元素的屬性id=kw

// :表示相對路徑

* :表示通配符,所有的標簽名稱 (上面的式子定位百度輸入框,就等價於 //input[@id = "kw"])

[@id="kw" ]:謂語條件   屬性=值,@表示這個屬性。@+屬性。

 

組合多個條件:如果一個屬性定位不到,就考慮組合多個條件

例如://input[@id= "kw" and name="wd" and class="s_ipt"]

 

text()文本定位:文本不是屬性,不能加@

//a[text()="新聞”]

 

xpath函數---contains包含    模糊匹配

常用的語法:// *[contains(text() , " XXX")]

                     //*[contains(@id,"XX")]

 

下面的情況就可以用contains進行過濾

 ---class可能有多個,有空格 《------(class屬性定位,一定不能有空格)

 ----text()定位一部分

 ----有空格的情況

 

舉例:通過xpath定位 新聞 這個文本 

e = driver.find_element("xpath",”//a[text() = "新聞“]“) #a標簽
e.click()

上面的例子,通過contains進行元素定位(如果新聞兩個字前后有空格,定位的時候不注意,只定位新聞二字,就定位不到,用contains進行過濾)

e = driver.find_element("xpath",”//a[conatins(text() , "新聞“)]“)
e.click()
e = driver.find_element("xpath",”//a[conatins(text() , "新“)]“)
e.click()

定位的是屬性

e = driver.find_element("xpath",”//a[conatins(@id , "kw“)]“)
e.click()

 

祖級(//)、父級(/)查找子元素

組合查找,還是定位不到元素,該怎么辦?-----父級元素進行查找

舉例://span[@class="bg s_btn_wr" ]/*[@id="su"]

 

 

層級之間加 / :表示父、子級關系

層級之間加 // :表示祖孫關系(可以是兒子,孫子,曾孫、、、、、、后代)

 

子元素查找父級元素---缺點,不能跨級定位,只能一級一級定位

/../..定位上一級元素(不能跨級)

//input[@id="kw"]/../..定位到爺爺級

 

 

特殊手段定位元素

手段1.通過索引查找,索引從1開始。並且索引前面加括號

(//input[1])

如果不加括號,會查找出3個索引為1的元素。

 

 

70節

手段2.軸定位 軸運算

 --1.靈活設計:子孫元素找祖先

 --2.可以找同胞(關系查找)

 

軸定位表達式

 

 

 

 

 sibling: 當前節點的同胞(姐姐或者哥哥     弟弟或者妹妹)

※ preceding-sibling :當前節點的同胞,只是哥哥或者姐姐 (當前節點的前面)

※following-sibling:當前節點的同胞,只是弟弟或者妹妹 (當前節點的后面)

※ancestor: 祖先

這三個軸運算,是xpath很難實現的,使用軸運算就很方便。

 

舉例:百度輸入框input

1.查找input元素的同胞節點(哥哥/姐姐)------->     //input[@id="kw"]//preceding-sibling::span

如果直接寫成    //input[@id="kw"]//sibling::span   是查找不到的,因為有同胞有input 前面的跟后面的

 

 

2.查找input元素的同胞節點(弟弟/妹妹)------->  //input[@id="kw"]//following-sibling::span

 

 

3.祖先 ,當前節點所有的外層元素(從父親級開始查找,父親級找不到再找爺爺級,只要是祖先級別,都可以找到)

舉例:input輸入框的祖先----> //input[@id="kw"]//ancestor::span

 

 

4.組合查找:父親的同胞-------->  //input[@id="kw"]//ancestor::span//preceding-sibling::input

 

 

 ⑧ css_selector   css選擇器

css表達式

 

 

1)css選擇器的一般寫法:input[id=kw] ------》對應的xpath的寫法是//input[@id="kw"]

css選擇器的表達式,更加簡潔(//,@,""都可以省略)

 

 

2)一個點 . 表示class

查找class_name = s_ipt,用css選擇器來查找,就是.s_ipt

 

3)#號:表示id

查找id="kw" ,用css選擇器來查找,就是 #kw,也可以直接寫為input#kw

 

 

 

 

 

 

css查找的單向性---只能通過父元素找子元素

 

總結:

xpath比之前的6種元素定位方式的優勢:

xpath可以進行組合:可以組合元素的標簽、屬性、text文本、上下級關系。

//input[@id = "kd" and  text() = "新聞”]

//div/input[@id = "kd" and  text() = "新聞”]     父級必須是div,父元素定位子元素

//*[] 任意標簽名

//input[@*="kw"] *表示的是任意屬性

//input[@id] 有id屬性,具體id值不知道也可以。爬蟲(測試中條件要精確,這個表示方法基本不用)

//input[contains(text(),"新聞“)]          //input[contains(@class,"value")]

//input[@id= "kw"]/../..子元素找父元素

 

xpath VS CSS----面試題

 css的優勢: 

1.表達方式更加簡潔

2.主流瀏覽器,查詢速度快(毫秒級別的差別)

xpath 的優勢:

1.功能更強,支持更多的函數,可以查找父元素、軸元素、(css只能用父元素找子元素)

2.支持用text()文本定位查找的(css不支持)

3.對於復雜的元素,xpath的寫法反而比css簡潔(支持跟多的函數、組合定位)

 

在find_element()函數中,使用的是css選擇器,而不是xpath的原因:查詢速度快一點點。

平時查找使用xpath,封裝函數建議使用css_seletor.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM