Appium移動端自動化:Appium-Desktp的使用以及定位元素方式總結
一、appium-desktop功能介紹
1、打開appium-desktop,點擊start session
2、打開后,點擊屏幕右上角的搜索按鈕
3、然后會打開配置頁面,在本地服務配置信息同上面寫的代碼鏈接配置。填入正確的信息后,建議先點擊保存,再點擊start Session。
4、成功啟動模擬器中的qq程序。如下圖。此時如果模擬器和appium-desktop中界面不同,可點擊刷新按鈕同步下,按鈕的功能如下:
二、定位方式
點擊定位元素按鈕,點擊左側app界面中的登錄定位元素后,就會出現selected element界面。
1、ClassName
Android:Android的class屬性對應ClassName定位方式,ClassName一般都是會重復的,可以通過index來獲取需要的元素。(從0開始查找dom樹中的同名class屬性)
iOS:iOS的type屬性對應CLassName定位方式,ClassName一般都是會重復的,可以通過index來獲取需要的元素。(從0開始查找dom樹中的同名class屬性)
# class定位方式(重復屬性,如果重復可以通過復數取角標的形式) elements = driver.find_element_by_class_name("android.widget.ImageView") elements = driver.find_elements_by_class_name("android.widget.Button")[1] # 需要用復數形式,因為有多個元素,返回的是列表 elements.click()
2、id定位
使用定位元素按鈕定位到元素后,右側欄中可以看到,有個id,下拉滾動條會發現還有個resource-id。會發現他們兩個是一樣的。這就是說明,這個id是唯一的,登錄按鈕被唯一定位到,代碼中就可以通過id直接定位。
如果右側欄中只有resource-id,沒有id,說明這個id也可能存在重復情況,可以通過index來獲取需要的元素。(從0開始查找dom樹中的同名resource-id屬性)
# 通過id進行定位,resource-id element = driver.find_element_by_id("com.tencent.mobileqq:id/btn_login") # element = driver.find_element_by_id("btn_login") # 或者這樣寫 element.click()
3、xpath定位
Android:Android的Xpath定位與PC的XPATH定位大同小異,可以通過相對路徑的定位方式定位,區別在於,這里相對路徑定位的//后只可以接Android的class屬性或*。(//android.widget.Button[@text="登 錄"])
iOS:iOS10 以上使用XCUITest框架后,原生框架不支持XPATH,Appium進行了轉換,速度很慢不建議使用。
# xpath定位方式 element = driver.find_element_by_xpath("//android.widget.Button[@text='登 錄']") element.click()
4、AccessibilityId
Android:Android的content-desc屬性對應AccessibilityId定位方式,這個content-desc屬性專門為殘障人士設置,如果這個屬性不為空則推薦使用。
iOS:iOS的label和name屬性都對應AccessibilityId定位方式,如果有則推薦使用。
element = driver.find_element_by_accessibility_id("請輸入QQ號碼或手機或郵箱") element.send_keys('358571102')
5、AndroidUiautomator定位
這個在運行時,調用的是Android自帶的UI框架UiAutomator的Api。格式固定,介紹幾個常用的格式如下
# 這個在運行時,調用的是Android自帶的UI框架UiAutomator的Api # 介紹幾個簡單常用的,text、className、resource-id # text # 匹配全部text文字 driver.find_element_by_android_uiautomator('new UiSelector().text("手機號")') # 包含text文字 driver.find_element_by_android_uiautomator('new UiSelector().textContains("機")') # 以text什么開始 driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("手")') # 正則匹配text driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^手.*")') # className driver.find_elements_by_android_uiautomator('new UiSelector().className("android.widget.TextView")') # classNameMatches driver.find_elements_by_android_uiautomator('new UiSelector().classNameMatches("^android.widget.*")') # resource-id、resourceIdMatches driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.syqy.wecash:id/et_content")') # description driver.find_element_by_android_uiautomator('new UiSelector().description("S 日歷")') # descriptionStartsWith driver.find_element_by_android_uiautomator('new UiSelector().descriptionStartsWith("日歷")') # descriptionMatches driver.find_element_by_android_uiautomator('new UiSelector().descriptionMatches(".*歷$")')
6、iOSPredicateString
僅支持iOS10以上,可以多個屬性同時定位,推薦。(替代XPATH)
driver.find_elements_by_ios_predicate("label == '登錄'") driver.find_elements_by_ios_predicate("type='XCUIElementTypeOther' and name='聯系人,標簽, 第2個按鈕,共3個'")
7、iOSUIAutomation
iOS9.3以下使用,現在已經廢棄,iOSPredicateString代替了iOSUIAutomation
三、查找元素
我們也可以通過appium-desktop的search for element(查找元素)功能。相當於火狐的try path定位元素工具。通過定位方式和對應的值來查找元素,從而驗證定位方式和值的正確性
可以看到定位方式就是我們上面說的幾種定位方式。選擇一個定位方式,填入對應的值,點擊search。
選中找到的元素,可以看到左側對應手機界面中的元素被選中。從而也證明我們的這種定位方式和對應的值都是沒問題的。可以定位到元素的。
下面還提供了測試方式,如果是按鈕,就點擊 tap element ,相當於代碼中的click()
如果是輸入框,就在‘enter keys' 中輸入內容,然后點擊sendkeys就可以往已選的元素中輸入內容,相當於代碼中的send_keys()
四、錄制
點擊小眼睛圖標的錄制按鈕,可以看到界面展現出來代碼模塊。選擇python或其他語言,點擊右側的分享功能,可以變成可以直接運行的python代碼,再右側是復制按鈕和刪除按鈕。
然后和右側selected element 欄目中的tap、send keys、clear 或者 search for element結合操作,根據search for element找到元素定位i,並tap或者sendkeys等操作。這些操作都會被錄制下來並生成python代碼。可直接使用
錄制后得到的代碼如下:
# This sample code uses the Appium python client # pip install Appium-Python-Client # Then you can paste this into a file and simply run with Python from appium import webdriver import time caps = {} caps["deviceName"] = "127.0.0.1:5555" caps["platformName"] = "Android" caps["platformVersion"] = "5.1.1" caps["appPackage"] = "com.tencent.mobileqq" caps["appActivity"] = "com.tencent.mobileqq.activity.SplashActivity" caps["noReset"] = True# 加上不格式化參數,一般可以用於保存登錄狀態 driver = webdriver.Remote("http://localhost:4723/wd/hub", caps) time.sleep(3)#加上等待時間,防止不能定位到元素 el2 = driver.find_element_by_id("com.tencent.mobileqq:id/btn_login") el2.click() driver.quit()