1. 程式人生 > >【python+selenium的web自動化】- 8種元素定位方式詳解

【python+selenium的web自動化】- 8種元素定位方式詳解

如果想從頭學起selenium,可以去看看這個系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html
# 前言 ​ 我們在做WEB自動化時,最根本的就是操作頁面上的各種元素,而操作的基礎便是元素的定位,只有準確地定位到唯一元素才能進行後續的自動化控制,下面將對各種元素定位方式進行總結歸納。 ​ 說明:以下操作統一使用百度首頁進行示例,滑鼠右鍵然後點選檢查(或按f12)可以檢視具體的前端程式碼。 # 單一屬性定位 ​ 6種單一屬性定位 : id,name,class name,tag name,link,partial_link ​ **2種多樣式定位**:css、xpath(強烈推薦) ## 通過元素的id ```python # 通過id(id唯一) ele = driver.find_element_by_id("kw") # 類 WebElement - 屬性、方法 print(ele.get_attribute('class')) # 獲取該id的class屬性值 ele.send_keys("selenium") # 傳送內容 ``` ​ 在前端頁面中,id是指頁面勻速的的屬性名id值,元素的id值在當前整個HTML頁面中是唯一
的,因此可以通過id屬性來唯一定位一個元素,是首選的元素定位方式,但不是每個元素都有id屬性。此外,也有動態變化的id值,即每次進入頁面該元素的id值都不一樣,一般是由一串英文+數字組成的字串,這種情況下就不要使用id去定位元素了(因為下一次很有可能就找不到它了)。 ## 通過元素的name ```python # 通過name driver.find_element_by_name("wd") # 不一定唯一 # elements ``` ​ 元素的name屬性,但name不一定是唯一的,就像大家的身份證號是唯一的,但是名字會有重複。`driver.find_element_by_name`只返回第一個匹配到的元素,如果想返回所有匹配到該name的元素,則使用`driver.find_elements_by_name`,區別就是`element`帶不帶`s`。這裡特別說明一下,`find_elements`不管找到多少個,都會返回 一個list(找不到則返回空列表),列表當中的每一個元素就是一個 WebElement。 ## 通過元素的class
```python # 通過class_name driver.find_element_by_class_name('mnav c-font-normal c-color-t') # 不一定唯一,只返回匹配到的第一個元素 driver.find_elements_by_class_name('mnav c-font-normal c-color-t') # 返回元素列表,按照dom樹從上往下 ``` ​ 元素的class屬性,在前端,class一般是用來元素進行分組的,並對這一級元素設定相同的樣式,因此會存在多個元素會共用一個**class**,不一定是唯一值。與name一樣,`element`帶`s`時返回匹配到的元素列表。 ## 通過元素的標籤名
```python # 通過tag_name driver.find_element_by_tag_name('span') # 不唯一 # elements ``` ​ tag就是元素的標籤標識,不一定是唯一值,`element`帶`s`時返回匹配到的元素列表。 ## 通過元素的超連結文字 ```python # 通過link_text driver.find_element_by_link_text('hao123') # 不是唯一 # elements ``` ​ 精確匹配連結的文字值,不一定是唯一值,`element`帶`s`時返回匹配到的元素列表。 ## 通過元素的部分超連結文字 ```python # 通過partial_link_text driver.find_element_by_partial_link_text('hao') # 不是唯一 # elements ``` ​ 模糊匹配連結的文字值,`element`帶`s`時返回匹配到的元素列表。 # XPTH定位 ​ 以上介紹的6中定位方式,都是針對元素的單一特徵來定位元素,但在實際應用中,一般都需要組合以上各種情況來定位一個元素。那麼xpath和css定位就可以實現各種組合,基本可以覆蓋所有的元素定位。 ​ xpath是一門在xml文件中查詢資訊的語言,因為html與xml比較相似,用得比較廣泛,所以xpath也可以用於在html對元素進行定位。它是將整個html看成一個樹形結構,html為根節點,頁面當中節點與其他節點可以有祖先、父輩、兄弟、這樣的關係,類似一個族譜。 ​ selenium提供的xpath定位的方法名:`find_element_by_xpath(xpath表示式)`,表示式語法如下: | 表示式 | 說明 | | ------ | ------------------------------------------------------------ | | / | 絕對定位,從根節點選取 | | // | 相對定位,選擇匹配的節點 | | . | 選擇當前節點 | | .. | 選擇當前節點的父節點 | | @ | 選擇屬性,如:@class="class值",@id="id值",屬性放在中括號[]中 | | * | 萬用字元,匹配所有 | | @* | 萬用字元,匹配所有屬性,如:@*="test" | + **絕對定位**(不建議) : /單斜槓開頭,嚴格按照層級、同級元素的位置,只要位置改變就無法定位,如:/html/body/div[2]/[form]/div[1]/input + **相對定位**://雙斜槓開頭 ,在參照物之下只要符合條件的元素存在即可,表示式:`//標籤名[@屬性名=值] `,用\*表示要匹配所有標籤 ,如://*[@id="kw"] 匹配所有標籤 + **下標定位**(不建議):路徑下相同標籤的下標,如://*[@id="th"]/a[2],意思是該路徑下第二個a標籤 + **邏輯運算**:表示式中可以使用and 、or 描述元素的多個屬性,表示式:`//標籤名[@屬性名=值 and @屬性名=值]` + **層級定位**:靠本身特性無法唯一定位的時候,使用層級去定位,如:`//div[@id="u1"]//a[@name="tj_login"]`。/(單斜槓)表示在前一個元素的直系下, //(雙斜槓)表示在前個元素之下的所有範圍內 + **文字定位**: 通過標籤內的文字內容,表示式:` //標籤名[text()="文字"]` + **包含(部分屬性)**:標籤的部分屬性,表示式:`//標籤名[contains(@屬性名 , "部分屬性值")] `,如: //a[contains(@href,"Cource/homework")],部分文字也可以,//a[contains(text(), "部分文字")] + **軸定位**:一般用於表格樣式的資料列,需要通過組合來進行定位,**軸運算名稱**為以下6種,使用語法:`/軸名稱::節點名稱[@屬性=值]`,例: //div//table//td**/**preceding::td,只要後面接的是軸定位要用**/**(單斜槓)。 +