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開始
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
8.3 通過屬性定位
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,則可以直接用。