1.0.0 :常見的十種元素定位方式
1.driver.find_element_by_id() #id定位 2.driver.find_element_by_name() #name定位(已經涼了,不支持) 3.driver.find_element_by_xpath() #xpath定位 4.find_element_by_class_name #class_name定位 5.driver.find_element_by_css_selector() #css定位 6.driver.find_element_by_link_text() #link定位 7.driver.find_element_by_tag_name() #tag定位 8.driver.find_element_by_partial_link_text() #partial定位 9.driver.find_element_by_accessibility_id() #accessibility_id定位 10.driver.find_element_by_android_uiautomator() #原生定位
其中1、2、3、4、9、10這五種是用的最多的!本章介紹1.2.3.4,下章介紹9.10
下面來實例操作一邊各種方式的定位技巧,啟動app的腳本仍然是之前的腳本,我們接着操作(目前的內容沒有使用unittest行為框架,后續會逐步加入框架,萬丈高樓平地起,基礎很重要!)
准備工作:
a. 之前的環境仍然是ok的
b. 手機鏈接電腦,adb devices,保證設備正常鏈接
c. 打開 uiautomatorviewer
d. 手機以及安裝好了我們需要測試的app
e. 建議先注冊一個賬號,我們這里使用手機號碼+密碼登陸
(如果想使用手機號碼+手機驗證碼完成登陸,后續會講到)
1. id定位:driver.find_element_by_id()
腳本寫了之后報錯:An element could not be located on the page using the given search parameters ,通過給定參數沒有找到元素—大概這個意思------這里是新同學最容易犯的一個錯誤,就是頁面跳轉是需要時間的,但是代碼執行是很快的,這里沒有找到元素是因為,在獲取【收入手機號碼】id時,手機頁面還沒有進入到登陸頁面,所以在頁面上找不到元素
所以記下筆記:幾乎在所有頁面跳轉的時候,我們都需要判斷頁面是否正常跳轉,否則會報錯
所以在啟動app的時候加一個隱性等待:driver.implicitly_wait(10)
這個東西是什么意思呢: 比如老王和小張吃完飯約好去按摩,小張說要去尿個尿,老王對小張說,就等你十秒,如果這十秒你還沒有來,我就先去了,以后咱兩絕交,如果這十秒內你來了,咱兩就一起去,還是好朋友
放在這個頁面上說,就是 如果app啟動后,等待十秒,如果十秒后下一個頁面沒有加載出來,那就報錯, 如果十秒內加載出來了就仍然可以正常執行!
但是呢這種隱性等待仍然有弊端,比如一個頁面存在多個接口請求,部分元素使用的請求不一樣,導致頁面只加載一半,還是可能報錯--(這里純屬個人理解,看看就好)一般我不太愛用這個,我個人比較喜歡顯性等待!
那么我腳本叫上隱性等待,結果執行發現還是報錯,
原因:app啟動之后會出現一個中間加載頁,他還是找不到元素!…所以報錯! 如果我們在這里加上一個 強制等待:time.sleep(3) 等待三秒試一下或者用WebDriverWait獲取登錄界面元素進行顯示等待!
結果發現通過id定位手機已經輸入了 手機號碼和密碼!
2.name定位:driver.find_element_by_name() ——不支持
3.xpath 定位:driver.find_element_by_xpath()
a.絕對路徑定位點擊登錄
driver.find_element_by_xpath('//android.widget.RelativeLayout/android.widget.RelativeLayout[2]/android.widget.Button').click() #‘注意看上圖三種顏色標示,記住xpath 索引是從1 開始!為什么第二個要取[2]android.widget.RelativeLayout[2],因為圖中有兩個android.widget.RelativeLayout ,
我們需要取第二個,所以就這樣!
b.相對路徑,這種的定位方式就比較多了!
#Xpath-text:實際上就是class+text的組合 #完整的text定位元素 ‘登錄‘ driver.find_element_by_xpath('//android.widget.Button[@text="登錄"]').click() #或者: driver.find_element_by_xpath('//*[@text="登錄"]').click() #備注:整個頁面 登錄這個text是唯一 ,如果存在 【賬號登錄】 登錄這個詞匯仍然是唯一的!【*】在這里代表所有的class #關鍵詞定位‘登‘或者’錄‘ driver.find_element_by_xpath('//android.widget.Button[contains(@text,"登")]').click() #或者 driver.find_element_by_xpath('//*[contains(@text,"錄")]').click() #發現點擊的不是我們想要的,所以關鍵字和全局搜索定位 不能不推薦同時使用,因為整個頁面中是存在很多個【錄】這個字的,所以全局加關鍵字可能定位不到 #xpath-id: driver.find_element_by_xpath('//android.widget.Button[@resource-id="com.yce.deerstewardphone:id/btn_submit"]').click() #備注:同樣的道理,這樣定位元素需要保證class(android.widget.Button)中,這個id是唯一的,不然他會取第一個id點擊! #同理另一種寫法全局定位: driver.find_element_by_xpath('//*[@resource-id="com.yce.deerstewardphone:id/btn_submit"]').click() #xpath-index: driver.find_element_by_xpath('//android.widget.Button[@index="2"]').click() #或者 driver.find_element_by_xpath('//*[@class="android.widget.Button" and @index="2"]').click() ##等等xpath定位方式,花里胡哨很多種,寫多了自己就可以隨手就來,到最后你會發現下面講的這些你可能整個項目下來用的定位方式就那么幾個! #class_name定位:find_element_by_class_name class唯一直接用就可以了,簡單 driver.find_element_by_class_name('android.widget.Button').click()
py文件網盤地址:
鏈接:https://pan.baidu.com/s/1rSIJHmv2pwq2VSPChV5EIw 密碼:9u4v
推薦搭建跟着教程敲,然后自己做筆記!