selenium 之定位方法


1 id 定位 driver.find_element_by_id()

HTML 規定id 屬性在HTML 文檔中必須是唯一的。這類似於公民的身份證號,具有很強的唯一性

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://ui.imdsx.cn/uitester/')
driver.maximize_window() #最大化當前窗口
driver.execute_script('window.scrollTo(0,0);')
#執行JavaScript語句,通過js 來操作滾動條
driver.find_element_by_id('i1').send_keys(111)

2 name 定位 driver.find_element_by_name()

HTML 規定name 來指定元素的名稱,因此它的作用更像是人的姓名

driver.find_element_by_name('name').send_keys(111)

3 class 定位 driver.find_element_by_class()

HTML 規定class 來指定元素的類名

driver.find_element_by_class_name('classname').send_keys(111)

4 tag 定位(標簽名定位) driver.find_element_by_tag_name()

HTML 的本質就是通過tag來定義實現不同的功能,每一個元素本質上也是一個tag 

因為一個tag 往往用來定義一類功能,所以通過tag識別某個元素的概率很低

一個頁面都會有大量的<div> ,<input> <a> 等tag ,所以很難通過標tag name 去區分不同的元素

driver.find_element_by_tag_name('input').send_keys('tag-name')
#默認寫入第一個input 標簽內

5 link text 定位(文本定位) driver.find_element_by_link_text()

代碼  <a href="http://www.imdsx.cn">跳轉大師兄博客地址</a> 

driver.find_element_by_link_text('跳轉大師兄博客地址').click()

通過上面的代碼發現, find_element_by_link_text()方法通過元素標簽對之間的文本信息來定位元素

6 partial link 定位 driver.find_element_by_partial_link_text()

 partial link 定位是對link 定位的一種補充,有些文本鏈接會比較長,這個時候可以取文本鏈接的一部分定位,只要這一部分信息可以唯一地標識這個鏈接

driver.find_element_by_partial_link_text('師兄博客地址').click()

通過上面的代碼發現, find_element_by_partial_link_text()方法也是通過元素標簽對之間的文本信息來定位元素

7 Xpath 定位 driver.find_element_by_xpath()

XPath是XML的路徑語言,通俗一點講就是通過元素的路徑來查找到這個標簽元素

XPath 使用方法

7.1  //* 定位頁面下所有元素

7.2  絕對路徑定位

7.3 利用元素屬性定位

driver.find_element_by_xpath('//input[@placeholder="請通過XPATH定位元素"]')
driver.find_element_by_xpath('//*[@placeholder="請通過XPATH定位元素"]')

//表示當前頁面某個目錄下

input 表示定位元素的標簽名,如果不想指定標簽名,用* 代替

[ ] 固定格式

@ 表示引用某樣屬性

placeholder="請通過XPATH定位元素" 元素的屬性值

知識擴展:

使用絕對路徑定位的缺點:前端修改層級后,之前的case報廢

通過屬性定位的方式可以提高容錯率

7.4 層級與屬性結合(層級過濾)

當標簽頁重復時,Xpath提供了層級過濾

例如:找不到兒子,那么就先找他的爸爸,實在不行可以再找他的爺爺

//form/div/input[@placeholder="用戶名"]

支持通過 / 進行層級遞進,找到符合層級關系的標簽

一個元素它的兄弟元素跟它的標簽一樣,這時候無法通過層級定位到。因為都是一個父親生的,多胞胎兄弟。Xpath提供了索引過濾

通過索引,在List中定位屬性,與python的索引有些差別,Xpath從1開始

//select[@name='city'][1]/option[1]
7.5 使用邏輯運算符
如果一個屬性不能唯一的區分一個元素,可以使用邏輯運算符連接多個屬性來查找元素
//select[@name='city' and @size='4' and @multiple="multiple"]

8 CSS 定位 driver.find_element_by_css_selector()

Css Selector定位實際就是HTML的Css選擇器的標簽定位

CSS 選擇器常用語法如下圖:(參考鏈接 http://www.w3school.com.cn/cssref/css_selectors.asp)

8.1 通過class 屬性定位

. 代表通過class屬性來定位元素   .c1

Class定位還提供了多個Class定位 通過連續 . 來縮小范圍   .c1.c2.c3
 8.2 通過id 屬性定位
# 代表通過id 屬性來定位元素 #id1
8.3 通過屬性定位 
可以使用元素的任意屬性,只要這些屬性可以唯一標識這個元素 [ name='n1']  
8.4 標簽屬性組合定位
input[name='n1']
input.c1
input#i1
8.5 多屬性組合過濾
Css Selector 的多屬性組合選擇過濾 沒有and 只需要多個[] 連接 就可以
select[name='city'][size='4'][multiple="multiple"]
8.6 層級關系定位
Css Selector通過 > 來區分層級的界定
select>option[value='3'
知識拓展:
CSS Selector 不支持indexof(角標)定位
定位時先用CSS Selector ,如果需要用角標定位的時候就要XPath

9 用By 定位元素 driver.find_element()

通過查看Webdriver 的底層實現代碼發現:

以上八種定位方式,最后都是調用find_element() 方法

它需要兩個參數,第一個參數是定位的類型,由BY 提供,第二個參數是定位的具體方式

滿足W3C 最后都是通過BY.CSS_SELECTOR 方法定位

 

底層代碼如下:

 

def find_element(self, by=By.ID, value=None):
"""
'Private' method used by the find_element_by_* methods.

:Usage:
Use the corresponding find_element_by_* instead of this.

:rtype: WebElement
"""
if self.w3c:
if by == By.ID:
by = By.CSS_SELECTOR
value = '[id="%s"]' % value
elif by == By.TAG_NAME:
by = By.CSS_SELECTOR
elif by == By.CLASS_NAME:
by = By.CSS_SELECTOR
value = ".%s" % value
elif by == By.NAME:
by = By.CSS_SELECTOR
value = '[name="%s"]' % value
return self.execute(Command.FIND_ELEMENT, {
'using': by,
'value': value})['value']

 

10 以上九種定位方式的復數形式
elements返回list  用角標取值
需要循環的時候用復數形式
driver.find_elements_by_class_name('classname')[0].send_keys('111')

二、定位控件

appium 通過 uiautomatorviewer.bat 工具來查看控件的屬性。該工具位於 Android SDK 的 /tools/bin/ 目錄下。

1、id 定位

driver.find_element_by_id('resource-id')

# ID定位於selenium不同,可能存在重復的問題。

# appium-desktop抓取元素時如果出現有id,則可以直接用。

# resource-id可能出現重復,需要具體看下有多少個。
2、class name 定位
driver.find_element_by_class_name('class')
# 對應class字段,有可能存在多個相同class。
# 多個相同class,每次獲取只取第一個遇到的元素。
3、xpath 定位
driver.find_element_by_xpath('//android.widget.EditText[@text="手機號"]')
# Xpath路徑定位,與Web的Xpath定位在有一點點區別
# Native App的定位以class為基准,主要用到參數有text、resource-id、index
4、Accessibility ID定位 --這個方法屬於Appium擴展的定位方法
driver.find_element_by_accessibility_id('content-desc')
# Android對應content-desc IOS對應accessibility identifier
# content-desc是給殘障人士定義的特殊字段
5、android uiautomator定位 --這個方法屬於Appium擴展的定位方法
Android的源生測試框架的定位方式,定位速度快
driver.find_element_by_android_uiautomator('new UiSelector().text("手機號")')
# 匹配全部text文字
driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.TextView")')
 
# className
6、iOSPredicateString 
僅支持iOS10以上,可以多個屬性同時定位,推薦。(替代XPATH)
driver.find_elements_by_ios_predicate("label == '登錄'")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM