web頁面元素定位


所有web網頁中有8種元素定位方式

靠單一的特征找元素:6種(id,class_name,tag_name,name,link_text(2))
組合各種特征和關系來找元素:2種(xpath,css)

 

以下4種方法對所有元素可用

1.id:唯一,id不變時首選它。

# 一個元素有很多屬性時,元素定位優先級首先是id,但id有時是變的,如果id是不變的,可用它來定位。
# 如果id是變化/動態的,那么要舍棄id定位方式,換別的。
# 以百度首頁為例:
# 這里定位策略是id,定位表達式是id="kw"。
ele = driver.find_element_by_id("kw")  
# 元素有屬性+操作-----返回的是webElement對象(所以selenume中對元素是做了一層封裝的)
# driver所有的查找方法都是find_element開頭,所有的查找結果都是webElement。
# id在web網頁中只會找到一個元素,所以只有一個對象可以返回.
# 如果找到的是多個,須糾正開發.
print(ele)

 

2.標簽名稱 tag_name:可以找到一個或多個,不唯一,所以查找方法都一樣。

ele = driver.find_element_by_tag_name("input")   # 在DOM/html中匹配到的第一個元素
print(ele)

eles = driver.find_elements_by_tag_name("input")   # 多個,返回的是列表,元素為webElement對象,頁面中全部匹配的元素.
# 按整個html頁面從上到下一層層找
print(eles)

 

3.class_name(不唯一):同上。

ele1 = driver.find_element_by_class_name("")
print(ele1)

ele2 = driver.find_elements_by_class_name("")
print(ele2)
 
 

4.name(不唯一):同上。

# 雖name很多時候重名,但盡可能不重名,每個人都有自己的一個名字,名義上不絕對唯一,但很多時候唯一性很高
ele3 = driver.find_element_by_name
print(ele1)

ele4 = driver.find_elements_by_name
print(ele1)

  

a元素:兩種方法

5.完整匹配文本值

driver.find_element_by_link_text("更多產品")  
# a鏈接的文本必須是"更多產品"4個字   
# 全量匹配,完全匹配 
# 不是絕對唯一:一個頁面中允許多個鏈接文本值是一樣的     
# 當前頁面中,任何一個元素只要它的文本值是‘更多產品’,那就完全匹配.

 

6.部分匹配/包含

driver.find_elements_by_partial_link_text("產品")  
# 只要a元素的文本內容中有"產品"兩字,就符合要求.

 

以上6種方法在使用時,可能有時候會找不到元素,或者找到了后面又變了。所以用xpath或css組合定位。

7.xpath定位


# 絕對定位:路徑絕對(兼容差,過度依賴位置和繼承關系)  從祖先開始到本身  以/開頭  /父/子
# 相對定位: 
# 在整個html頁面,逐個條件,找到唯一的元素。
# 擺脫位置和繼承關系,web自動化首選。
# 按ctrl+f打開下面的輸入框使用相對路徑進行查找
# 多個屬性:通過邏輯運算and/or

 1>.以//開頭,//標簽名[@屬性名=值]     如果標簽名是*,匹配所有標簽。

//input[@id="kw"]  # 找屬性id,值為kw的元素

2>.多個屬性:通過邏輯運算and/or

//*[@id="kw" and @name="wd" and @class="s_ipt"]  # 同時滿足
//*[@id="kw" or @name="wd" or @class="s_ipt"] # 滿足其中一個

3>.通過元素的文本內容來定位---文本內容固定才可用----函數  //標簽名[text()=對應的文本值]

//p[text()="平均出勤率"]

4>.包含:屬性/文本內容包含一部分即可-----//標簽名[contains(@屬性/text(),被包含的內容)]

# 屬性包含方式:
//span[contains(@class,"quickdelete-wrap")]
# 文本包含方式: //h1[contains(text(),"第2期")]
# 包含與邏輯and/or相結合 //h1[contains(text(),"第2期") and @id="ccc"]

5>.層級定位: 

# 通過父輩/祖先輩
# 以百度首頁為例:
# 定位登錄元素
# 它是一個a鏈接,有鏈接地址,有name/class/onclick屬性,文本內容。 # 首選name屬性定位  
//a[@name="tj_login"]
# 會出現兩個元素,不知道是哪個,可以將鼠標分別放在兩個黃色部分,會顯示定位路徑/元素特征的就是要找的元素。

兩個元素一模一樣,靠它自己本身根本找不到。

用find elements找到所有匹配的元素,然后通過下標取值。

 

兩個一模一樣分不清,可能爹/祖先不一樣。

通過父輩/祖先輩,先找到不一樣的先輩,在先輩下面再找。------層級定位

# 通過父輩找元素: 
# /只能跟直系后代(會限制前后關系:父/子)
# //只要是后代就行
//div[@id="u1"]/a[@name="tj_login"] 

6>.軸定位:多用於表格

已知元素/軸名稱::標簽名稱[@屬性=值]

軸運算:

ancestor:祖先結點,包括父。

parent:父結點

preceding:當前元素節點標簽之前的所有結點。(html頁面先后順序)

preceding-sibling:當前元素節點標簽之前的所有兄弟結點。

following:當前元素節點標簽之后的所有結點。(html頁面先后順序)

following-sibling:當前元素節點標簽之后的所有兄弟結點。

 

8.css定位



免責聲明!

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



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