APP——Python——元素定位方法01


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()
復制代碼

 

 

 


免責聲明!

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



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