實驗簡介css
作過UI自動化(web自動化, 移動自動化)的同窗都會知道, 除去框架的選型和搭建之外, 落到實處的對元素進行定位就成了最重要的技能. java
作過UI自動化的同窗會知道, 對頁面元素的定位方式有8種: id, name, xpath, class, link text, partial link text, tag name, css selector, 使用手法, 優先級的選擇以及效率稍有不一樣, 可是異曲同工, 目標就是要找到元素自己. python
一樣, 要作Native APP的自動化, 在元素定位上也大同小異, web 元素通用的方式, Appuim也適用, 甚至它還有一些個性化的方式. 可是對於Web View容器下的元素識別, 和web driver並沒有太多差別android
實驗目的web
1. 練習使用工具uiautomatorviewer對元素進行定位app
2. 熟悉元素定位的方法框架
3. 編寫自動化測試用例 - 添加聯繫人工具
實驗流程測試
1. 首先來看一下測試對象, 一個添加聯繫人的app, 功能頁面以下圖排序.ui
2. 在apk/tools下, 找到uiautomatorviewer.bat
點擊以下圖標, 同步App頁面元素詳細信息
3. 從目前的頁面上, 咱們能夠獲得一些屬性, 其對應關係以下圖:
4. 瞭解了這些基本屬性, 其實就能夠完成代碼的編寫了, 以下
#coding=utf-8 from appium import webdriver import time from selenium.webdriver.common.by import By desired_caps = {} desired_caps['platformName'] = 'Android' desired_caps['platformVersion'] = '23' desired_caps['deviceName'] = 'Android Emulator' desired_caps['appPackage'] = 'com.example.android.contactmanager' desired_caps['appActivity'] = '.ContactManager' driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 點擊Add Contact driver.find_element_by_name('Add Contact').click() #text # 輸入 Contact Name name = 'test03' driver.find_element_by_id('com.example.android.contactmanager:id/contactNameEditText').send_keys(name) #resource-id # 輸入 Contact Phone driver.find_element_by_id('com.example.android.contactmanager:id/contactPhoneEditText').send_keys('13111111111') # 輸入 Contact Email driver.find_element_by_id('com.example.android.contactmanager:id/contactEmailEditText').send_keys('test@test.com') # 點擊 Save Button driver.find_element_by_name('Save').click() # 點擊 "Show Invisible Contacts(Only)" driver.find_element_by_accessibility_id('Show Invisible Contacts (Only)').click() nameAdded = driver.find_element_by_name(name).text print(nameAdded) if nameAdded == name: print('成功添加聯繫人.') else: print('添加聯繫人失敗') driver.quit()
Accessibility ID在Android上面就等同於contentDescription,這個屬性是方便一些生理功能有缺陷的人使用應用程序的。好比咱們有一個ImageView裏面放置一張顏色複雜的圖片,可能一些色弱色盲的人,分不清這張圖片中畫的是什麼東西。若是用戶安裝了輔助瀏覽工具好比TalkBack,TalkBack就會大聲朗讀出用戶目前正在瀏覽的內容。TextView控件TalkBack能夠直接讀出裏面的內容,可是ImageView TalkBack就只能去讀contentDescription的值,告訴用戶這個圖片究竟是什麼。
5. 上面用到了最經常使用的幾種定位方式, 心心念唸的強大的xpath還沒的提到, 咱們來看看它的幾種基本用法
1).使用絕對路徑定位,如截圖所顯示的 xpath 路徑 find_element_by_xpath("className/className/className/className")
2).使用相對路徑定位 find_element_by_xpath("//className")
3).經過元素的索引定位 find_element_by_xpath("//className[index]")
4).經過元素的屬性定位
一種屬性:find_element_by_xpath("//className[@label='更多信息']")
兩種屬性:find_element_by_xpath("//className[@label='更多信息'][@isVisible='1']")
部分屬性(最強大):find_element_by_xpath("//className[contains(@label,'更多')]")
# 輸入 Contact Name name = 'test03' driver.find_element_by_xpath('//android.widget.EditText["3"]').send_keys(name)
6. 使用android uiautomator定位
這個方法也屬於 Appium(Android)擴展的定位方法。一樣使用 UIAutomatorViewer.bat 工具直接查看。
也就是說一個元素的任意屬性均可以經過android uiautomator方法來進行定位,但要保證這種定位方式的惟一性。
# 點擊 "Show Invisible Contacts(Only)" driver.find_element_by_android_uiautomator("new UiSelector().text(\"Show Invisible Contacts (Only)\")").click() # description對應的屬性是content-desc # driver.find_element_by_android_uiautomator("new UiSelector().description(\"Show Invisible Contacts (Only)\")").click()
順便貼一下UiSelector的其它方法, 依然很好用.
文本方面的方法:
1.text(String text) 文本
2.textContains(String text) 文本包含
3.textMatches(String regex) 文本正則
4.textStartsWith(String text) 文本開始字符
描述方面的方法:
1.description(String desc) 描述
2.descriptionContains(String desc) 描述包含
3.descriptionMatches(String regex) 描述正則
4.descriptionStartsWith(String desc) 描述開始字符
driver.find_element_by_android_uiautomator("new UiSelector().descriptionContains(\"Show Invisible Contacts\")").click()
曾哥有話說:
方法find_element_by_android_uiautomator裏的語句是用java處理, 它的字符串是放在雙引號中的. 若是把字符串放在單引號中的話, 在python裏看起來沒有問題, 可是java卻並不認爲這是一個字符串. 錯誤信息在appuim server上能夠清楚地看到:
這個坑挺隱形的, 我趴了很久, 差點覺得 該方法在此處不適用, 很難過.