成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HarmonyOS自動化測試實踐

系統 自動化 OpenHarmony
在自動化過程中,元素出現受網絡環境,設備性能等多種因素影響。因此元素加載的時間可能不一致,從而會導致元素無法定位超時報錯,但是實際上元素是正常加載了的,只是出現時間晚一點而已。

[[420953]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

一、運行環境

工具列表

  • Appium-Desktop v1.8.2
  • Android SDK
  • Python
  • Appium-Python-Client
  • Pytest
  • Pycharm

工具安裝:

Appium-Desktop v1.8.2

下載地址:Appium-Desktop v1.8.2, 對于鴻蒙系統,最佳的Appium兼容版本為v1.8.2。其他版本在獲取text時的值為“0.0”

安裝過程:

【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區
【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區
【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區
【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區

Android SDK

1.下載地址:Android SDK

2.將Android Studio安裝在默認路徑: C:\Program Files\Android\Android Studio

3.在Android Studio的SDK Manager中下載Android SDK

4.配置環境變量:

  • 新建JAVA_HOME,值為C:\Program Files\Android\Android Studio\jre
  • 新建ANDROID_HOME,值為C:\Users\Administrator\AppData\Local\Android\Sdk
  • 編輯Path, 新建%JAVA_HOME%\bin, %JAVA_HOME%\jre\bin, %ANDROID_HOME%\tools, %ANDROID_HOME%\tools\bin, %ANDROID_HOME%\platform-tools

Python

下載地址:Python

將Python安裝在默認位置

環境變量配置

打開CMD,輸入 python –version 測試python命令,輸入 pip –V 測試pip命令

如果測試失敗,則需要配置python的環境變量

Appium-Python-Client

安裝命令:pip install Appium-Python-Client

【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區

Pytest

安裝命令:pip install pytest

【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區

Pycharm

1.下載地址:Pycharm

Pycharm是比較流行Python編輯器(IDE工具),選擇Community版本下載

2.將Pycharm安裝在默認位置

3.選擇python編譯器

【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區

二、元素定位

元素定位工具常用的有:uiautomatorviewer.bat,weditor.exe,Appium-Desktop

【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區

以uiautomatorviewer為例看一下常見的查找控件方式

1.通過id定位,resrouce-id

  1. element = conf.driver.find_element_by_id("Id_myButton").click() 

 2.通過ClassName定位: classname

  1. element = conf.driver.find_elements_by_class_name("android.widget.Button").click() 

 3.通過Accessiblityld定位:content-desc

  1. element = driver.find_element_by_accessibility_id("content-desc-text").click() 

 4.通過AndroidUiAutomator

  1. ui_str = 'new UiScrollable(UiSelector().className("{}")).scrollIntoView(new UiSelector().textContains("{}"))'.format(list_id, text_contains) 
  2. element = conf.driver.find_element_by_android_uiautomator(ui_str).click() 

 5.通過坐標定位,XY

  1. TouchAction(conf.driver).tap(x=int(x * phonewidth), y=int(y * phoneheight)).release().perform() 

 6.通過xpath定位終極定位,方式有很多種,以下列幾種常見:

  • 如果元素text是唯一的,可以通過text文本定位:
  1. //*[@text=’text文本屬性’] 
  2. element = conf.driver.find_element_by_xpath("//*[@text='Click me!']").click() 
  • 如果元素id是唯一的,也可以id屬性定位
  1. //*[@resource-id=’id屬性’] 
  2. element = conf.driver.find_element_by_xpath("//*[@resource-id='org.ohosannotations.sample:id/Id_myButton']").click() 
  • 通過content-desc屬性定位
  1. //*[@content-desc=’desc的文本’] 
  2. element = conf.driver.find_element_by_xpath("//*[@content-desc='desc的文本']").click() 
  • contains模糊定位
  1. //[contains(@content-desc, ‘desc的文本’)] 
  2. element = conf.driver.find_element_by_xpath("//*[contains(@content-desc, 'desc的文本')]").click() 
  • 組合定位

如果一個元素有2個屬性,通過xpath也可以同時匹配2個屬性,text, resource-id,class ,index,content-desc 這些屬性都能任意組合定位

通過id和class屬性 定位搜索框

  1. id_class = '//android.widget.EditText[@resource-id="org.ohosannotations.sample:id/Id_myTextField"]' 
  2. element = conf.driver.find_element_by_xpath(id_class).click() 

通過text和index屬性 定位按鈕Start list ability !

  1. desc_class = '//*[@text="Start list ability !" and @index="3"]' 
  2. element = conf.driver.find_element_by_xpath(desc_class).click() 

 通過class和text屬性 定位輸入框

  1. class_text = '//android.widget.EditText[@text="輸入框默認值"]' 
  2. element = conf.driver.find_element_by_xpath(class_text).send_keys("zdhtest"

 通過class和desc 定位搜索框

  1. id_desc = '//*[contains(@resource-id, "Id_myTextField") and @content-desc="desc的文本"]' 
  2. element = conf.driver.find_element_by_xpath(id_desc).click() 

 鴻蒙與安卓定位方式基本相同

三、模擬用戶事件

在自動化用戶操作事件中,鴻蒙與安卓基本方式一致,以下列舉常見的幾種操作事件:

1.點擊(確認點擊)、輸入和清空操作

  • 點擊:能支持點擊跳轉的定位元素,通過.click()執行
  1. driver.find_element_by_id(‘org.ohosannotations.sample:id/Id_myTextField’).click() 

 輸入:有輸入框需要輸入的定位元素,通過.send_keys()執行

  1. driver.find_element_by_id(‘org.ohosannotations.sample:id/Id_myTextField’).send_keys(‘zdhtest’) 

 清空:對已輸入的輸入框清空內容,通過.clear()執行

  1. driver.find_element_by_id(‘org.ohosannotations.sample:id/Id_myTextField’).clear() 

 2.元素等待作用

在自動化過程中,元素出現受網絡環境,設備性能等多種因素影響。因此元素加載的時間可能不一致,從而會導致元素無法定位超時報錯,但是實際上元素是正常加載了的,只是出現時間晚一點而已, 故設置元素等待可以更加靈活的制定等待定位元素的時間,從而增強腳本的健壯性,提高執行效率

  • 強制等待: 設置固定的等待時間,使用sleep()方法即可實現
  1. from time import sleep   
  2. #強制等待5秒 
  3. sleep(5) 
  • 隱式等待: 隱式等待是針對全部元素設置的等待時間
  1. driver.implicitly_wait(20) 
  • 顯式等待: 顯式等待是針對某個元素來設置的等待時間。

方法WebDriverWait格式參數如下:

  1.  
  2. from selenium.webdriver.support.ui import WebDriverWait 
  3.  
  4. WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None) 
  5.  
  6. driver : WebDriver 
  7.  
  8. #timeout : 最長超時時間,默認以秒為單位 
  9.  
  10. #poll_frequency : 休眠時間的間隔時間,默認為0.5秒 
  11.  
  12. #ignored_exceptions : 超時后的異常信息,默認情況下拋NoSuchElementException異常。 
  13.  
  14. WebDriverWait()一般和until()或until_not()方法配合使用 
  15.  
  16. from selenium.webdriver.support.ui import WebDriverWait 
  17.  
  18. WebDriverWait(conf.driver, 10).until(EC.visibility_of_element_located((By.ID, self.locator))) 

3.Toast內容獲取

Toast是一種簡易的消息提示框。 當視圖顯示給用戶,在應用程序中顯示為浮動,和Dialog不一樣的是,它永遠不會獲得焦點,無法被點擊,而且Toast顯示的時間有限,一般3秒左右就消失了,在鴻蒙應用中,Toast目前還捕捉不到,解決方法也是采用截圖比較

  1. #Android獲取Toast方式 
  2. toast_message = "這是一個toast文本" 
  3. message ='//*[@text=\'{}\']'.format(toast_message) 
  4. #顯示等待檢測元素 
  5. toast_element=WebDriverWait(driver, 5).until(EC.visibility_of_element_located((message, self.locator))) 
  6. print(toast_element.text) 
  7.  
  8. #鴻蒙中Toast處理方式 
  9. self.get_image(imagepath) 
  10. flag = self.image_assert(assertimagepath, imagepath, imagesucess) 

 4.截圖操作

  1. save_screenshot() :方法直接保存當前屏幕截圖到當前腳本所在文件位置 
  2. driver.save_screenshot(‘aa.png’) 
  3.  
  4. get_screenshot_as_file(self, filename) :將截圖保留到指定文件路徑 
  5. driver.get_screenshot_as_file(’./images/aa.png’) 

 5.滑動操作

  1. #獲得機器屏幕大小x,y 
  2. def getSize(): 
  3.     x = dr.get_window_size()['width'
  4.     y = dr.get_window_size()['height'
  5.     return (x, y) 
  6.   
  7. #屏幕向上滑動 
  8. def swipeUp(t): 
  9.     l = getSize() 
  10.     x1 = int(l[0] * 0.5)    #x坐標 
  11.     y1 = int(l[1] * 0.75)   #起始y坐標 
  12.     y2 = int(l[1] * 0.25)   #終點y坐標 
  13.     dr.swipe(x1, y1, x1, y2,t) 
  14. #屏幕向下滑動 
  15. def swipeDown(t): 
  16.     l = getSize() 
  17.     x1 = int(l[0] * 0.5)    #x坐標 
  18.     y1 = int(l[1] * 0.25)   #起始y坐標 
  19.     y2 = int(l[1] * 0.75)   #終點y坐標 
  20.     dr.swipe(x1, y1, x1, y2,t) 
  21. #屏幕向左滑動 
  22. def swipLeft(t): 
  23.     l=getSize() 
  24.     x1=int(l[0]*0.75) 
  25.     y1=int(l[1]*0.5) 
  26.     x2=int(l[0]*0.05) 
  27.     dr.swipe(x1,y1,x2,y1,t) 
  28. #屏幕向右滑動 
  29. def swipRight(t): 
  30.     l=getSize() 
  31.     x1=int(l[0]*0.05) 
  32.     y1=int(l[1]*0.5) 
  33.     x2=int(l[0]*0.75) 
  34.     dr.swipe(x1,y1,x2,y1,t) 
  35. #調用向左滑動 
  36. swipLeft(1000) 
  37. #調用向右滑動 
  38. swipRight(1000) 
  39. #調用向上滑動 
  40. swipeUp(1000) 
  41. #調用向下滑動 
  42. swipeDown(1000) 

 6.按壓、長按、點擊(單純點擊)、移動、暫停、釋放、執行等操作

  • 強制等待: 設置固定的等待時間,使用sleep()方法即可實現
  • 按壓:press() 開始按壓一個元素或坐標點(x,y)。通過手指按壓手機屏幕的某個位置。 press也可以接收屏幕的坐標(x,y)。press(self, el=None, x=None, y=None)
  1. TouchAction(driver).press(x=0,y=308) 
  • 長按:longPress() 開始按壓一個元素或坐標點(x,y)。 相比press()方法,longPress()多了一個入參,既然長按,得有按的時間吧。duration以毫秒為單位。1000表示按一秒鐘。其用法與press()方法相同。
  1. long_press(self, el=None, x=None, y=None, duration=1000) 
  • 點擊:tap() 對一個元素或控件執行點擊操作。用法參考press()。不能點擊跳轉,單純的點擊(例如:點擊勾選、點擊點贊,點擊播放等)
  • 移動:move_to() 將指針從上一個點移動到指定的元素或點。(滑動驗證條)
  1. move_to(self, el=None, x=None, y=None) 
  • 暫停:Wait()暫停腳本的執行,單位為毫秒
  1. wait(self, ms=0) 
  • 釋放:方法release() 結束的行動取消屏幕上的指針。
  1. release(self) 
  • 執行:perform() 執行的操作發送到服務器的命令操作。
  1. perform(self) 

7.獲取元素的屏幕尺寸和名稱

  • 獲取屏幕尺寸:
  1. 屏幕總尺寸:分辨率 phonesize = self.get_phone_size() 
  2.  
  3. 屏幕寬度:X值 phonewidth = phonesize["width"
  4.  
  5. 屏幕高度:Y值 phoneheight = phonesize["height"
  • 獲取元素的名稱:
  1. driver.find_element_by_xpath(xpath).text 
  2. driver.find_element_by_id(“org.ohosannotations.sample:id/Id_myTextField”).text 

四、簡單示例

以下是兩個簡單case

1.示例一

下面以ohosannotations組件為例,case中包含事件有:點擊、長按、輸入、文本斷言和圖片對比斷言

  1. def test_ohosannotations(self, getlocator): 
  2.         annotations_locators = getlocator["ohosannotations"
  3.         with allure.step("點擊Click me_按鈕的點擊事件"): 
  4.             self.ta_tap(annotations_locators["Click me_按鈕"]) 
  5.         with allure.step("向輸入框輸入內容"): 
  6.             self.text_input(annotations_locators["myTextField_控件"], "這是一條有內涵的內容!"
  7.             self.ta_tap(annotations_locators["Click me_按鈕"]) 
  8.             time.sleep(2) 
  9.             assert "這是一條有內涵的內容!" == self.get_element_text(annotations_locators["myText_控件"]), "文本顯示不正確" 
  10.         with allure.step("長按Start extra ability, long click !控件"): 
  11.             logger.info("長按Start extra ability, long click !控件"
  12.             self.ta_longpress(annotations_locators["Start extra ability, long click_按鈕"], 1000) 
  13.             time.sleep(2) 
  14.         with allure.step("斷言彈出框圖片與期望圖片是否一致"): 
  15.             self.get_image(imagepath) 
  16.             flag = self.image_assert(assertimagepath, imagepath, imagesucess) 
  17.         if flag is True
  18.             with open(imagesucess, "rb"as f: 
  19.                 context = f.read() 
  20.                 allure.attach(context, "匹配成功的圖片", attachment_type=allure.attachment_type.PNG) 
  21.         else
  22.             with open(imagepath, "rb"as f: 
  23.                 context = f.read() 
  24.                 allure.attach(context, "匹配失敗的圖片", attachment_type=allure.attachment_type.PNG) 
  25.                 logger.info("匹配結果:%s" % flag) 
  26.                 assert flag is True 

 運行結果:

2.示例二

以Sensey組件為例,演示多點觸控的使用方法,驗證Sensey組件的雙指檢測功能

  1. @allure.story('Sensey'
  2. @allure.title("sensey_006 雙指檢測"
  3. @allure.tag("L1"
  4. @allure.severity("normal")  # blocker:阻塞缺陷 critical:嚴重缺陷 normal:一般缺陷 minor:次要缺陷 trivial:輕微缺陷 
  5. @allure.description("雙指檢測"
  6. @pytest.mark.flaky(reruns=1, reruns_delay=5)  # reruns:重試次數 reruns_delay:重試的間隔時間 
  7. def test_sensey_006(self, getlocator): 
  8.     logger.info("sensey_006 雙指檢測"
  9.     self.ta_tap(["TOUCH DETECTOR""XPATH""//*[@text=\"TOUCH DETECTOR\"]"]) 
  10.     self.ta_tap(["Touch Detection""XPATH""//*[@resource-id=\"Id_switch_touch\"]"]) 
  11.     a1 = TouchAction(conf.driver).tap(x=530, y=1380).release() 
  12.     a2 = TouchAction(conf.driver).tap(x=730, y=1380).release() 
  13.     action = MultiAction(conf.driver) 
  14.     action.add(a1,a2) 
  15.     action.perform() 
  16.     time.sleep(0.5) 
  17.     text = self.get_element_text(["Result""XPATH""//*[@resource-id=\"Id_tv_result\"]"]) 
  18.     assert text == "Two Finger Tap""雙指檢測不正確" 

 運行結果:

五、測試報告生成

使用allure-pytest插件

  1. @allure.feature('設置應用')  # 功能名稱 
  2. class TestSettings(BaseCase): 
  3.  
  4.     @allure.story('聲音和振動')  # 子功能名稱 
  5.     @allure.title('settings_001 設置來電鈴聲')  # 用例標題 
  6.     @allure.severity('normal')  # 缺陷級別 
  7.     @allure.description('檢查是否可以設置來電鈴聲')  # 用例描述 
  8.     def test_settings_001(self): 
  9.         # 測試步驟 
  10.         with allure.step('進入聲音和振動'): 
  11.             pass 
  12.         with allure.step('設置來電鈴聲'): 
  13.             pass 
  14.         with allure.step('斷言來電鈴聲設置成功'): 
  15.             pass 

 生成html報告和打開

  1. if __name__ == '__main__'
  2.  
  3.     now = time.strftime('%Y%m%d%H%M%S'time.localtime()) 
  4.     print('執行腳本(%s)' % now) 
  5.  
  6.     xml_path = './reports/report-%s/xml' % now 
  7.     html_path = './reports/report-%s/html' % now 
  8.     case_path = './testcases/' 
  9.  
  10.     # 運行測試腳本 
  11.     pytest.main(['-s''-q''--alluredir', xml_path, case_path]) 
  12.  
  13.     # 生成html報告 
  14.     cmd = 'allure generate %s -o %s --clean' % (xml_path, html_path) 
  15.     os.system(cmd) 
  16.  
  17.     # 打開測試報告 
  18.     cmd = 'allure open %s' % html_path 
  19.     os.system(cmd) 

 生成報告如下:

【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區

展開詳情:

【中軟國際】HarmonyOS 自動化測試實踐-鴻蒙HarmonyOS技術社區

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2022-09-12 16:02:32

測試企業工具

2017-08-29 09:57:26

SaaS產品自動化

2021-09-07 09:00:00

開發測試工具

2023-02-07 08:11:15

2020-11-04 09:00:00

自動化測試回歸測試軟件測試

2022-02-17 10:37:16

自動化開發團隊預測

2012-02-27 17:34:12

Facebook自動化

2013-05-16 10:58:44

Android開發自動化測試

2014-04-16 14:15:01

QCon2014

2011-12-23 17:09:57

自動化測試

2023-03-29 08:33:03

倉儲自動化系統

2021-06-30 19:48:21

前端自動化測試Vue 應用

2012-12-24 22:54:31

2024-11-01 15:05:12

2017-09-06 16:08:45

JmeterJenkins自動化測試

2017-09-21 16:06:43

DevOps自動化測試代碼

2021-11-05 09:00:00

Selenium工具自動化測試

2022-05-26 10:13:22

C/C++GCC插件單元測試

2014-11-20 13:49:15

2011-06-03 17:24:48

自動化測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久国产精品网站 | 日本又色又爽又黄的大片 | 国产色婷婷| 99视频免费在线 | 久久手机在线视频 | 成人深夜小视频 | 欧产日产国产精品国产 | 剑来高清在线观看 | 欧洲国产精品视频 | 黄色a三级 | 欧美一级在线观看 | 成人毛片在线视频 | 中文字幕在线视频免费视频 | 天天干干 | 国产盗摄视频 | 精品欧美一区二区三区精品久久 | 日韩精品在线免费观看视频 | 中文字幕一区二区三区在线观看 | 亚洲美女视频 | 成人免费视频播放 | 国产精品黄色 | 91精品国产综合久久香蕉922 | 羞羞视频网站免费看 | 成人毛片在线观看 | 亚洲国产精品一区二区第一页 | 天天曰天天曰 | 久久综合一区 | 亚洲国产高清高潮精品美女 | 亚洲精品一区av在线播放 | 中文字幕一区二区三区在线观看 | 日本电影韩国电影免费观看 | 天堂视频中文在线 | 欧美精品一区二区在线观看 | 91免费版在线观看 | www.久久.com | 日韩欧美一区二区在线播放 | 国产电影一区二区 | 在线a视频网站 | 久久99精品久久久久久青青日本 | 男人的天堂视频网站 | 日本国产一区二区 |