【笔记】软件测试02——移动测试基础02
(一)移動測試概念
1、定義
????????測試手機程序
2、測試的方面
- 功能測試:查看功能是否正常
- 安裝卸載測試
- 升級測試
- 兼容性測試 - Android系統版本
- 廠商二次開發版本
- 不同分辨率
- 不同網絡
 
- 網絡切換、中斷測試
- 使用中來電話、短信
- 橫豎屏切換
- 健壯性:耗電性、流量消耗、崩潰回復
(二)環境搭建
1.java sdk
? ? ? ? 安裝
????????配置JAVA_HOME和PATH
2.Android SDK
3.虛擬機安裝
????????使用夜神模擬器
????????也可以使用真機
????????????????a.?? ?手機通過usb線連接到電腦
 ????????????????b.?? ?在手機上打開文件傳輸(通知欄,手機正在充電)
 ????????????????c.?? ?在電腦上會發現多了一個CD驅動器,里面時手機的驅動
 ????????????????d.?? ?安裝驅動,電腦的設備管理器中就可以看到型號了
 ????????????????e.?? ?開啟開發者模式:手機-設置-關于手機-版本號(多次點擊)
 ????????????????f.?? ?打開usb調試:手機-設置-開發者選項-usb調試(打開)
1、ADB
命令:重要 a. 服務(如果發現代碼連不上手機了) adb kill-server adb start-serverb. 查看設備 adb devicesc. 進入手機終端 adb shelld. 獲取信息獲取手機android版本:
adb shell getprop ro.build.version.release
獲取手機當前運行的程序和界面的名稱:
adb shell dumpsys window windows | findstr mFocusedApp
?綠色是當前運行的程序activity,紅色是當前程序運行的activity所在的包。
e.其他 i. 文件傳輸 adb push 電腦上的文件 手機上的位置 adb pull 手機上的文件 電腦上的位置ii. 軟件安裝卸載 adb install 電腦上的apk文件路徑 安裝路徑 adb uninstall 應用的包名iii. 獲取其他信息 adb shell am start -w 包名/.啟動名(三)自動化測試案例
1、自動化測試工具
選取Appnium。支持語言多,支持的平臺多。
環境搭建:
????????1.安裝appnium的程序
????????2.在python中安裝Appnium-Python-Client
需要打開ADB、模擬器、Appnium、Pycharm
如果是之間導入的一個自己在電腦中直接建立的文件夾,沒有匹配對應的python環境。
2、入門案例代碼?
1.連接設備
#1.連接設備 #組裝一個字典,注明平臺,系統版本,名稱 #從appnium導入webderiver from appnium import webdriver import time #連接移動設備所必須的參數 desired_caps = {} # desired_capabilities 是字典,先定義一個空字典 #當前要測試的設備名稱 desired_caps["deviceName"] = "172.0.0.1:62001" #看系統 desired_caps["platformName"] = "Android" #系統的版本 desired_caps["latformVersion"] = "7.1" #要啟動的app的名稱(app的唯一標識:包名) desired_caps["appPackage"] = "com.android.setting" #要啟動的app的界面 desired_caps["appActivity"] = ".Settings" driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub",desired_capabilities=desired_caps) time.sleep(1)#這里進行所需要的操作#關閉app 關閉后需要釋放資源 driver.close_app() driver.quit()亦或者:
#1.連接設備 #組裝一個字典,注明平臺,系統版本,名稱 #從appnium導入webderiver from appnium import webdriver import time #連接移動設備所必須的參數 desired_caps = {"deviceName": "172.0.0;1:62001","platformName": "Android", "latformVersion": "7.1","appPackage": "com.android.setting","appActivity": ".Settings"} #看系統 #系統的版本 #要啟動的app的名稱(app的唯一標識:包名) #要啟動的app的界面 driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub",desired_capabilities=desired_caps) time.sleep(1) #g關閉app 關閉后需要釋放資源 driver.close_app() driver.quit()ADB進入命令行:
????????首先進入python模式
????????再下指令pip list查看當前已經安裝的包
?workon查看當前的虛擬環境。
?從Remote點擊查看webdriver.py
?Appnium端需要配置 的環境變量:
?退出configuraations后:
端口號,與代碼端口號要一致。host的ip地址也要一致
點擊start:(運行代碼前要start)
代碼中的的信息如何查找:
1.deviceName:
desired_caps["deviceName"] = "172.0.0.1:62001"
?
2.看系統
desired_caps["platformName"] = "Android"
注意首字母大寫
3.看系統版本
#系統的版本
desired_caps["latformVersion"] = "7.1"
模擬器中查看:
4.要啟動的app名稱
#要啟動的app的名稱(app的唯一標識:包名)
desired_caps["appPackage"] = "com.android.setting"
5.要啟動的app界面
#要啟動的app的界面
desired_caps["appActivity"] = ".Settings"
4和5使用命令在命令行中查看:
獲取手機當前運行的程序和界面的名稱:
adb shell dumpsys window windows | findetr mFocusedApp
?3、測試原理
????????代碼通過remote連接服務器(Appnium client),將信息傳到server(appnium),需要解析,server通過adb命令傳遞指令給手機。
4、基礎操作
基礎API:
- driver
| close_app() | 關閉打開的應用 | 
| quit() | 斷開連接(后續不能發送指令了) | 
| install_app('apk在電腦的絕對路徑') | 安裝應用 | 
| remover_app('應用的包名') | 卸載應用 | 
| is_app_installed('應用的包名') | 判斷應用是否安裝 | 
| push_file(目標位置,base64編碼的內容) | |
| pull_file(來源位置) | 返回值是base64編碼的內容 | 
| pase_source | 獲取界面xml源碼 | 
| find_element... | |
| find_elements... | |
| current_package | 獲取當前操作的應用的包名 | 
| current_activity | 獲取當前操作的界面名稱 | 
python代碼中查看:
print(driver.pase_source)
安裝:需要放在當前目錄下,r是將特殊字符轉換回原生字符串
driver.install_app(r"文件目錄\文件包名")
卸載:需要先判斷是否已經安裝
if driver.is_app_install("程序包名(adb指令查看)"):
? driver.remove_app("程序包名(adb指令查看)")
查看包名、界面名稱:
print(driver.current_package)
print(driver.current_activity)
- element
| text | 獲取元素文本的內容 | 
| click() | 點擊元素對應的位置 | 
| get_attribute(屬性名稱) | 獲取屬性值 | 
| location | 獲取元素左上角的坐標(相對于屏幕的左上角) | 
| size | 獲取元素的寬高(字典) | 
5、輸入文本
對于有些元素,可以接受文本輸入。
- send_keys(文本內容)
????????可以輸入文字,但對中文,在連接設備的時候要加上配置。(現在默認是可以的輸入中文,若是不可以則把以下兩行內容進行配置)
desired_caps('unicodeKeyboard')= True??? #unicode設置(允許中文輸入)
desired_caps['resetKeyboard'] = True??? #鍵盤設置(允許中文輸入)
如果對于同一元素,多次調用此方法,會先一個一個刪除掉原內容,再輸入。
- clear()
清除文本框的內容。(最后一個不會自動刪除,需要清楚一個)
eg:
driver.find_element_by_xpath("//*[@resource-id='com.android.setting:id/search']").click()time.sleep(1)driver.find_element_by_xpath("//*[@resoure-id='android:id/search_src_text']").send_keys('abd')driver.find_element_by_xpath("//*[@resoure-id='android:id/search_src_text']").send_keys('123')driver.find_element_by_xpath("//*[@resoure-id='android:id/search_src_text']").send_keys('張三')time.sleep(2)driver.find_element_by_xpath("//*[@resoure-id='android:id/search_src_text']").clear()6、元素定位
????????與web自動化不一樣,web元素是在html上,而移動端是在xml上,可通過print(driver.pase_source)指令查看到。定位元素使用xpath的方式.
????????通過以下這個bat運行一個截圖工具,查看頁面的元素。
????????進去之后,點擊左上角UI字眼下面偏綠色的按鈕進行截圖。再通過滑動點擊頁面元素,可在右邊查看到元素信息。
?
#從appnium導入webderiver from appnium import webdriver import time #連接移動設備所必須的參數 desired_caps = {} # desired_capabilities 是字典,先定義一個空字典 #當前要測試的設備名稱 desired_caps["deviceName"] = "172.0.0.1:62001" #看系統 desired_caps["platformName"] = "Android" #系統的版本 desired_caps["latformVersion"] = "7.1" #要啟動的app的名稱(app的唯一標識:包名) desired_caps["appPackage"] = "com.android.setting" #要啟動的app的界面 desired_caps["appActivity"] = ".Settings" driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub",desired_capabilities=desired_caps) time.sleep(1)print(driver.pase_source)# //*[text()='顯示'] 的意思是在整個頁面下尋找任意的元素(*),限定條件text #在安卓手機中,text并不是文本,而是屬于標簽的屬性 driver.find_element_by_xpath("//*[text()='顯示']").click()#g關閉app 關閉后需要釋放資源 driver.close_app() driver.quit() 以上報錯原因是:< /,即開始和結束標簽是在一起的,在安卓手機中,text并不是文本,而是屬于標簽的屬性。 在xml中 <a herf="www.baidu.com"你好</a你好就是a標簽的text,herf指的就是a標簽的屬性 如果中間沒有值,可以直接如下寫: <a herf="www.baidu.com改成: driver.find_element_by_xpath("//*[text()='顯示']").click() #改成: driver.find_element_by_xpath("//*[@text()='顯示']").click() 一般情況下,通過文本獲取,少數情況下通過id。(四)模擬手勢
1、安卓內在機制
????????1. 對于目前不需要在屏幕中顯示的內容,是不需要處理的,為了節省硬件資源;2. 安卓使用了棧的方式管理界面;3. 頁面滑動有“慣性”機制,會根據按下、抬起的位置以及總的時間,滾動不一樣的距離。2、滾動
swipe(self,start_x:int,start_y:int,end_x:int,end_y:int,duration:int = 0)
注意:duration默認是600單位是毫秒
????????它會影響實際滾動的距離
還需注意:
????????click方法,實際上并不是點元素,而是點元素所在位置。在獲取的時候有位置,但可以經過滑動,位置發生了變化,可能點不準。非常有可能在點擊之前睡一會,等待滑動結束。
scroll(origin_el,destination_el,duration)
scroll直接傳遞元素作為參數即可,不需要手動獲取位置
scroll底層實現:與swipe有一些區別,沒有中間的采樣點,只有起始、結束,但最終的效果和swipe是一樣的。
eg:
預估位置: driver.swip(start_x=270,start_y=640,end_x=270,end_y=320) 第二種方式: size = driver.get_window_size() prinnt(size) width = size["width"] height = size["height"] driver.swipe(start_x=width/2,start_y=height/3*2,end_x=width/2,end_y=height/3)滾動: el1=driver.find_element_by_xpath("//*[@text='通知']") el2=driver.find_element_by_xpath("//*[@text='WLAN']") driver.scoll(el1,el2)關于坐標:
第二種方式的滑動print:
3、拖拽
在安卓中,拖拽=按下 等待一定時間 移動 松手
drag_and_drop(origin_el,destinatiion_el)
eg:
el1.driver.find_element_by_xpath("//*[@text='酷安']") el2.driver.find_element_by_xpath("//*[@text='京東']") driver.drag_and_drop(el1,el2) time.sleep(2)4、TouchAction
- 作用
構建相對比較復雜的、連續的觸摸動作
- 用法
- 創建TouchAction對象,需要把driver作為參數傳遞
- 通過各種方法添加動作
- 執行操作perform()
- 方法 - 按下
 
press(self,el,x,y,pressure)
????????如果傳遞了el參數,x,y可以不傳
????????如果el為none,就需要傳遞x,y
????????pressure是ios專用的
- 長按
long_press(self,el,x,y,duration=1000)
????????如果傳遞了el參數,x,y可以不傳
????????如果el為none,就需要傳遞x,y
- 移動
move_to(self,el,x,y)
????????如果傳遞了el參數,x,y可以不傳
????????如果el為none,就需要傳遞x,y
- 等待
wait(self,ms)
????????ms等待時間,單位毫秒,默認600ms
- 松手
release()
- 輕敲
tap(el,element,x,y,count=1)
????????tap和click的區別:click有延遲促發效果(為了校驗是不是雙擊),通過tap(el,count=2)可以模擬雙擊。
實例:
#需要再導一個包,其他內容要包括基本內容 from appnium.webdriver.common.touch_action import TouchActionel1.driver.find_element_by_xpath("//*[@text='通知']") el2.driver.find_element_by_xpath("//*[@text='WLAN']") #實例化TouchAction action = TouchAction(driver) #既可以使用坐標又可以使用元素 action.press(el1).wait(2000).release() #分開寫: #在移動的過程中wait必不可少,wait(0)是默認600ms action.press(el1).wait(2000).move_to(el2) #x和y是絕對坐標 action.press(x=270,y=640).wait(500).move_to(x=270,y=370) action.release() #執行 模擬收拾的使用,TouchActio進行模擬手勢的時候,一定要記得執行操作 action.perform() time.sleep(3)5、圖形滑動案例
案例如下:
????????安全不顯示在當前屏幕中,需要滑動到下面讓其顯示在屏幕前,才能查找到
el1=driver.find_element_be_xpath("//*[@text='聲音']") el2=driver.find_element_be_xpath("//*[@text='WLAN']") action = TouchAction(driver) action.press(el1).wait(500).move_to(el2) action.releasse() action.perform() time.sleep(1) driver.find_element_be_xpath("//*[@text='安全']").click() time.sleep(1) driver.find_element_be_xpath("//*[@text='屏幕鎖定']").click() time.sleep(1) driver.find_element_be_xpath("//*[@text='圖案']") time.sleep(1) #按下的位置 Z型 action.press(x=105,y=450).wait(200).move_to(x=270,y45).wait(200).move_to(x=435,y=450).wait(200).move_to(x=270,y=615).wait(200).move_to(x=105,y=780).wait(200).move_to(x=270,y=780).wait(200).move_to(x=435,y=780) action.release() action.perform()6、基礎操作
- device_time :獲取手機時間
- get_window_size():獲取屏幕大小
- network_connection :獲取手機網絡信息 - 飛行模式
- WiFi
- 移動數據? 6=2+4
 
- set_network_connection(網絡模式數字)? :設置手機網絡信息
- keyevent(按鍵數字) :點擊按鍵
- set_screenshot_as_file/save_screenshot(圖片路徑) :截屏
- open_notification() :打開通知欄
eg:
print(driver.device_time) print(driver.network_connection) driver.get_screenshot_as_file("jietu.png")總結
以上是生活随笔為你收集整理的【笔记】软件测试02——移动测试基础02的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Nginx基本命令
- 下一篇: 2021-06-10 免费crm软件如何
