Selenium之元素定位詳解與進階(二)

八種元素定位詳解

# 創建瀏覽器驅動對象, 使用谷歌瀏覽器
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模式進行封裝使用(請關注後續文章)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章