一、By類單一屬性定位
元素名稱 | 描述 | Webdriver API |
id | id屬性 | driver.find_element(By.ID, "id屬性值") |
name | name屬性 | driver.find_element(By.NAME, "name屬性值") |
class_name | class屬性 | driver.find_element(By.CLASS_NAME, "class_name屬性值") |
tag_name | 標簽名 | driver.find_element(By.TAG_NAME, "標簽名") |
link_text | a元素的文本內容-精準匹配 | driver.find_element(By.LINK_TEXT, "超鏈接全部文本值") |
partial_link_text | a元素的文本內容-模糊匹配 | driver.find_element(By.PARTIAL_LINK_TEXT, "超鏈接部分文本值") |
- id定位
- 特點:id定位 是通過元素的id屬性來定位元素的;在整個HTML文檔中 id 屬性必須是唯一的。(APP中id屬性不唯一)
- 前提:元素有id屬性
- 說明:當目標元素存在 id屬性值時,優先使用 id 方法定位元素,前提id不是動態變化的。
- name定位
- 特點:name定位是根據元素name屬性來定位的;在HTML文檔中 name 的屬性值是可以重復的
注意:當頁面內有多個元素的特征值是相同的時候,定位元素的方法執行時,默認只會獲取第一個符合要求的特征對應的元素。
因此,定位元素時需要盡量保證使用的特征值能夠代表目標元素在當前頁面的唯一性。
- class name 定位
- 特點:class_name定位是根據元素class屬性值來定位元素;HTML通過使用class來定義元素的樣式,class屬性值可以有多個。
- 前提:元素有class屬性
- 注意:在使用 class name 方法時,如果**class**有多個屬性值,只能使用其中的一個。
比如:class="panel-body has-table scrollbar-hover",只能使用其中一個值panel-body或者has-table或者scrollbar-hover,中間的空格代表間隔符,表示class有多個屬性。
- tag name 定位
- 特點:tag_name定位 是通過**標簽名**來定位的;HTML本質就是由不同的tag組成,每一種標簽一般在頁面中存在多個,所以不方便進行精確定位,一般很少使用。
- 說明:如果存在多個相同的標簽,則返回符合條件的 第一個標簽 。
- 由于標簽名的重復性過高,一般做精確定位時,都不會選擇tag_name
- link test 定位
- 特點:link_text定位是只針對超鏈接元素(< a>標簽</a >,精確匹配),通過超鏈接的文本內容來定位元素的(超鏈接文本必須是唯一,不能有空格),并且需要輸入超鏈接的全部文本信息。
- 案例:element = driver.find_elementt("link test", '訪問新浪網站')
- partial link text定位
- 特點:只針對超鏈接元素,需要輸入超鏈接的部分文本信息。
- 案例:element = driver.find_element("partial link text", '訪問新浪')
- 說明:partial link text:a標簽通過【模糊匹配】超鏈接文本,定位元素超鏈接文本必須是唯一。
二、xpath定位表達式匯總
2.1 xpath術語
2.1.1 節點
- XPath中的節點主要有以下幾種類型: 元素節點 - 表示XML或HTML中的一個元素(也就是標簽),如<book>。 屬性節點 - 表示元素的一個屬性,如<book category="computer">中的category屬性。 文本節點 - 表示元素或屬性中的文本內容,如<book>Java</book>中的Java。 文檔節點 - 表示整個文檔,作為文檔樹的根節點。 命名空間節點 - 表示XML命名空間,通常是文檔的子節點。
- 定位節點的方式: 通過路徑表達式,如book節點://book 通過節點關系,如parent、child等 通過順序關系,如following-sibling等
2.1.2 基本值
基本值(Atomic Value)指的是不能再分解的單個值,XML中的一些基本值包括:
- 字符串(String)
- 整數(Integer)
- 小數(Decimal)
- 布爾值(Boolean)
- 日期時間(Date/Time)
基本值就是XML文檔中的終端節點,不再包含子元素。
例如:
<person><name>John</name><age>30</age>
</person>
上述XML中:
- name和age元素中的"John"和"30"就是基本值
- 而person不是基本值,因為它還包含子元素
基本值有以下特點:
- 不可再分解為更小單元
- 沒有屬性或子元素
- 包含實際數據
2.2 節點關系
2.2.1父(Parent)
每個元素以及屬性都有一個父。
在下面的例子中,book 元素是 title、author、year 以及 price 元素的父:
<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>
2.2.2子(Children)
元素節點可有零個、一個或多個子。
在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:
<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>
2.2.3同胞(Sibling)
擁有相同的父的節點
在下面的例子中,title、author、year 以及 price 元素都是同胞:
<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>
2.2.4先輩(Ancestor)
某節點的父、父的父,等等。
在下面的例子中,title 元素的先輩是 book 元素和 bookstore 元素:
<bookstore><book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book></bookstore>
2.2.5后代(Descendant)
某個節點的子,子的子,等等。
在下面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:
<bookstore><book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book></bookstore>
2.3 xpath定位表達式匯總
?
三、CSS選擇器策略匯總
基本介紹:
- CSS(Cascading Style Sheets)是一種語言,它用來描述HTML元素的顯示樣式;
- 在CSS中,選擇器是一種模式,用于選擇需要添加樣式的元素;
- 在Selenium中也可以使用這種選擇器來定位元素。
- 在Selenium中推薦使用CSS定位(前提得會😂),因為它比XPath定位速度要快。
?
四、元素定位策略總結
- 如果元素有明確id,name,class屬性時,使用對應的基本定位方法。
- 如果沒有id,name,class屬性時,或id,name,class屬性是動態/不唯一的時候,使用XPath和css_selector定位。
- 定位頁面超鏈接使用link_text和partial_link_text定位
- 可使用XPath和css_selector定位的時候,優先使用css_selector。css_selector定位的速度和效率比Xpath高。
- 沒有最好的,只有最精簡的,怎么簡單怎么來。
五、selenium相關總結腦圖大全
附帶捎上一份selenium相關總結腦圖
?