八種元素定位詳解
# 創建瀏覽器驅動對象, 使用谷歌瀏覽器
driver = webdriver.Chrome()
1.id定位:
- 特色: HTML元素id在HTML頁面內是唯一的
- 說明: 根據HTML元素id屬性來定位
- 前提: HTML元素必須有id屬性
- 方法: driver.find_element_by_id()
2.name定位:
- 特色: HTML元素name屬性值可以重複
- 說明: 根據元素name屬性來定位
- 前提: 元素必須有name屬性
- 方法: driver.find_element_by_name()
3.class定位
- 特色: HTML元素class屬性可以多個命名
- 說明: 根據元素的class屬性來定位
- 前提: 元素必須有class屬性
- 方法: driver.find_element_class_name()
4.tag_name定位
-
特色: 適合定位頁面中唯一標籤名(eg: title)
-
說明: 根據元素的標籤名稱來定位
-
方法: driver.find_element_by_tag_name()
如果頁面中有多個相同標籤名, 默認返回符合條件的第一個元素
5.link_text
-
特色: 精準定位a標籤
-
方法: driver.find_element_by_link_text()
只能傳入全部匹配文本(精準定位)
6.partial_link_text:
-
特色: 模糊和全部定位a標籤
-
方法: driver.find_element_by_partial_link_text():
使用模糊匹配時, 最好選擇代表唯一性的詞
7.xpath定位
爲什麼使用xpath定位?
因爲之前學習的定位方法, 使用場景非常單一, 稍微特殊場景, 無法使用;
什麼是xpath:
xml path: 簡稱
xml: 一種標記語言, 用於數據存儲和傳遞;
xpath常用策略:
1. 路徑定位
1). 相對路徑: 以雙斜槓開頭, 層級之間使用單斜槓分隔, 層級各級都可以結合屬性使用
2). 絕對路徑: 以單斜槓開始, 從根元素開始逐級往下寫(不可跳躍元素),層級之間用單斜槓(/)分隔;
2. 相對路徑 + 屬性 eg: //*[@id='id_value']
3. 相對路徑 + 邏輯屬性 eg: //*[@id="id_value" and @name="name_value"]
4. 相對路徑 + 層級 eg: //p[@id='id_value']/input[@id='id_value']
提示:
1). 能指定標籤名,就指定,否則使用*號代替;
2). //或/後只能跟標籤名或*
3). 在xpath中所有元素屬性必須使用@修飾
xpath語法擴展:
1. //*[text()='xxx'] # 查找文本值等於xxx的元素,注意: 此處text()非屬性,所以不使用@
2. //*[contains(@id,'A')] # 查找id屬性包含A的元素 注意: contains爲關鍵字, 不可改變, 傳值的時候不能越字母; 如: userA 寫成 uA
3. //*[starts-with(@id,'u')] # 查找id屬性以u字母開的元素 注意: 只能順着寫, 不能倒着寫;
8.css定位
說明:
css, 主要控制元素的樣式; (css語言中有非常強大的選擇器, 利用選擇器查找元素, 速度快)
爲什麼使用css選擇器?
xpath運行速度慢, css運行速度快, 語法更加強大, 更加簡單
css選擇器:
1. id選擇器
前提: 元素必須有id屬性
語法: #id_value
2. class選擇器
前提: 元素必須有calss屬性
語法: .class_value
3. 元素選擇器
語法: element 如: input
4. 屬性選擇器
語法:
1. [id='id_value'] # 查找id值爲id_value的元素
2. [id] # 查找元素中有id屬性所有元素
5.層級選擇器
語法:
1. p input # p標籤的後代所有input元素(後代選擇器)
2. p>input # p標籤下的直屬input元素(子類選擇器)
css選擇器擴展
css延伸
[id^='u'] # 查找id屬性並且以字母u開頭的元素
[id$='r'] # 查找id屬性並且以字母A結尾的元素
[id*='user'] # 查找id屬性並且包含字母user的元素
擴展:
li:first-child # 查找相同父類下的第一個li元素
li:nth-child(2) # 查找相同父類下的第二個li元素
li:last-child # 查找相同父類下的第最後1個li元素
八種元素使用優先級總結
1. 如果是鏈接文本, 推薦: link_text
2. 其他元素首選: css
3. css無法解決: xpath
實際工作很少手寫元素定位
主要元素定位方式:
火狐: 老版本(FirePath, FireBug), 新版本(Chropath, Try XPath, xPath Finder) | 審查元素>選中元素>右鍵菜單
谷歌: Chropath, XPathHelper(應用商店插件) | 審查元素>選中元素>右鍵菜單
三種元素定位方法
1. find_element_by_xxx()
說明: 定位單個元素,返回值爲元素, 如果未找到元素, 會報錯
2. find_elements_by_xxx()
說明: 定位一組元素,返回的格式爲列表;如果沒找到,返回空列表;
應用:
1. 通過下標訪問,下標從0開始
2. 遍歷訪問
3. find_element()
1. 導包
from selenium.webdriver.common.by import By
2. 調用方法[driver.find_element(類型,值)]
類型:By.XXX(By.CSS_SELECTOR/By.XPATH/...)
值:根據不同的類型編寫不同的語法
提示:本方法是工作中最常使用的方法, 可以通過PO模式進行封裝使用(請關注後續文章)