所有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定位