1.Appium介紹
1,appium是開源的移動端自動化測試框架;
2,appium可以測試原生的、混合的、以及移動端的web項目;
3,appium可以測試ios,android應用(當然了,還有firefoxos);
4,appium是跨平台的,可以用在osx,windows以及linux桌面系統上;
2.Appium基本原理
在Android端,appium基於WebDriver協議,利用Bootstrap.jar,最后通過調⽤
用UiAutomator的命令,實現App的自動化測試。
UiAutomator測試框架是AndroidSDK自帶的AppUI自動化測試Java庫。
另外由於UiAutomator對H5的支持有限,appium引入了chromedriver以及
safaridriver等來實現基於H5的自動化。
2.1.appium在android端工作流
1.client端也就是我們testscript是我們的webdriver測試腳本。
2.中間是起的Appium的服務,Appium在服務端起了一個Server(4723端口),
跟seleniumWebdriver測試框架類似,Appium⽀持標准的WebDriver
JSONWireProtocol。在這里提供它提供了一套REST的接口,AppiumServer接
收webdriverclient標准rest請求,解析請求內容,調⽤用對應的框架響應
操作。
3.appiumserver會把請求轉發給中間件Bootstrap.jar,它是用java寫的,安裝
在手機上.Bootstrap監聽4724端口並接收appium的命令,最終通過調⽤用
UiAutomator的命令來實現。
4.最后Bootstrap將執行的結果返回給appiumserver。
5.appiumserver再將結果返回給appiumclient。
3.Appium安裝配置
3.1.限制
如果你在windows上安裝appium,你沒法使用預編譯專用於OSX的.app文件,
你也將不能測試IOSapps,因為appium依賴OSX專用的庫來支持IOS測試。這
意味着你只能通過在mac上來運行IOS的app測試。這點限制挺大。
3.2.傻瓜式安裝node.js
3.2.1.查看是否安裝成功
nodejs安裝完畢后,需要配置環境變量
在PATH中添加:D:\ProgramFiles\nodejs;
3.3.傻瓜式安裝Appium
3.3.1.成功界面
3.4.配置appium環境變量
D:\Appium\node_modules\.bin
3.5.打開控制台,查看appium環境
3.5.1.appium-doctor
3.6.配置Android—環境變量
D:\androidSDK
3.7.Python中配置appium環境(聯網)
進入:D:\python\Scripts
打開控制台:
pipinstallAppium-Python-client
3.8.總結:
1) androidsdk安裝完畢后,需要配置環境變量
新建ANDROID_HOME
在PATH中添加:%ANDROID_HOME%:\.....
2) nodejs安裝完畢后,需要配置環境變量
在PATH中添加:D:\ProgramFiles\nodejs;
3) appium安裝完畢后,需要配置環境變量
D:\ProgramFiles(x86)\Appium\node_modules\.bin;
4) 配置好后,啟動cmd,
輸入node-v,查看node安裝版本
輸入appium-doctor檢查appium的安裝環境是否成功,
5) 安裝Python,配置環境變量
4.第一個腳本示例
4.1.首先通過eclpse啟動android模擬器
4.2.啟動Appium
4.3.點擊左上角有“機器人”的按鈕:
選擇你的android版本
4.4.點擊右上角的“三角”按鈕啟動Appium。
4.5.通過Python編寫自動化測試腳本。
desired_caps是一個字典,用於在appiumserver與手機端建立會話關系時,手
機端需要告訴服務端設備相關的一些參數,根據這些參數服務端可以做出相應的
處理。
4.6.畫出來的這三個,是需要在腳本中正確填寫的
4.7.執行效果
5.Appium界面內容解析
5.1.整體介紹
主頁面頂部從左到右依次是:
1、AndroidSettings:android相關的設置
2、GeneralSettings:全局設置,設置appium相關的內容
3、DeveloperSettings:開發者設置,一般不用需要關心
4、About:appium相關信息,不需要關心
5、Inspector:查找元素用的,windows無法使用,MAC可以使用,windows可
以不用關心。
6、LaunchAppium:啟動appium按鈕
7、右下角清除日志按鈕。
5.2.AndroidSettings
此頁面分為Application、La、、四部分,先看圖
之后分析分別有什么作用
5.2.1.1、Application
本模塊設置被測試app信息,如安裝包路徑、包名、activity等
ApplicationPath:選擇要測試的apk,選擇他后與全局設置中的
Pre-LaunchApplication配合,啟動appium時會先把apk安裝到手機(或模擬器)
再啟動app。
Package:根據apk生成的app包名,之前提到過的,我們這個包的身份證,我
們需要通過這個去找到包,不然我們安裝后我們通過什么去辨別這些包呢?
WaitforPackage:等待包名。
LaunchActivityactivityActivity
就是其中的一個個網頁,我們啟動app時需要去運行的activity,這里我們填寫
首次啟動頁面的activity。我們選擇第一啟動的activity與aapt命令生成的
launchable-activity:name一致
WaitforActivity:和上面的差不多,意思是等待某個Activity打開,用的時間不是
很多,做了解。
UseBrowser:測試瀏覽器選擇這項,與前五項互逆。及選擇了他前五個就不可以
選擇。
FullReset:將所有設置復位。即將手機(模擬器)恢復到啟動到appium前的狀
態
NoReset:不需要重置手機(模擬器)中的app
6.2.2.LaunchDevice
本模塊是模擬器設置,針對的是SDK創建的模擬器,不是genymotion等其
他模擬器。
LaunchAVD:要啟動的模擬器名稱。
DeviceReadyTimeout:等待模擬器啟動時間。
Arguments:啟動模擬器時需要的參數。
6.2.3.Capabilities
運行測試的相關信息。
PlatformName:測試平台,可以選擇Android、FireFoxOS、MAC版的還可以選擇
IOS。
PlatformVersion:被測試手機(模擬器)版本。
DeviceName:設備名稱,手機連接電腦后打開cmd輸入adbdevices可獲取。
Language:被測試手機(模擬器)使用語言。
Locale:被測試手機(模擬器)所屬區域。
5.4.元素偵測:
這個按鈕的功能和firebug的定位工具功能類似,但是他還有一個功能,他會檢
測你的各個系統配置是否正確,如果前面各項參數不正確時,使用該功能會報錯。
如果你不正常連接手機也不行。還是建議用sdk工具里面自帶的
uiautomatorviewer。
5.5.啟動服務
所有參數配置好后你需要做的就是啟動appium服務,只有啟動之后你才能夠做
自動化。
5.6.清除日志(右下角):
在寫腳本、調試過程中會產生很多的日志,但是你可能想看的只是中間某個時間
段的,那么你在這個時候可以將頁面的日志清除。
6.Appium查看界面元素的工具
6.1.通過androidsdk的uiautomaterviewer獲取元
素內容
uiautomatorviewer.bat是一個用來來掃描和分析Android應用程序的UI組件的
GUI工具。具體使用方法可參考。打開uiautomatorviewer以后,可以看到
uiautomatorviewer已經將模擬器的圖形展示在上面了。
6.2.右側xml節點詳解
7.獲取appPackage和appActivity
appPackage和appActivity進行appium自動化測試非常重要的兩個參數,
我們所測試的APP不同,這兩個參數肯定也是不一樣的。那如何快速的獲取這
APP的這兩個參數呢
7.1.方法一:通過cmd指令來獲取
1.adbshell
2.dumpsysactivity|grepmFocusedActivity
3、adbshelldumpsysactivityactivities
7.2.方法二:使用Appium來獲取
進入設置頁,選擇APK路徑,下面就會顯示包名和Activity名稱
8.Appium常用定位方法講解
對象定位是自動化測試中很關鍵的一步,也可以說是最關鍵的一步,畢竟你對象
都沒定位那么你想操作也不行,下面我們來看我們常用的一些定位方式。
8.1.ID定位(取resource-id的值):
無論是在web自動化還是app自動化中id都是唯一的,可能有的小伙伴看
到這里會有疑問,因為有的資料說是通過name定位是唯一的,為什么你這里是
id呢,其實這個在之前是不沖突的,但是如果你用的是appium較新版本是不行
的,在新版本中name定位被去掉了,所以在以后的定位中不會有name定位了,
通常情況下我們也更喜歡用id進行定位。這里可能剛學的小伙伴會有疑問,
有的時候你的應用為什么沒有id,或者說在這個手機上有但是另外的手機上
沒有。1、開發沒有添加。2、android版本是4.4以下的。
如果我們需要對“7”這個數字進行點擊操作,
driver.find_element_by_id("com.android.calculator2:id/digit7").click()
8.3.className定位(取class的內容)
在實際工作中className定位用得相對而言會比較少。當你經常去看class
時你會發現很多的className是一樣的,你沒有辦法對其進行唯一定位,下面我
們看下面兩張圖片
driver.find_element_by_class_name("android.widget.EditText").send_keys("111111")
這種方式去定位,你會發現你永遠定位不了密碼欄,這是為什么呢?因為在設計
的時候如果你查找的元素在頁面有多個,系統會自動給你選擇第一個,所以你永
遠操作不了后面的
8.4.text定位(需要使用uiautomator的定位方式,
使用text的內容)
使用這里需要注意一下,如果通過text定位的結果是個list,不能直接click。所
以如果要點擊需要取數組的值,比如下面是點擊找到的第一個元素
8.5.xpath定位
xpath定位在web自動化中是最常見的,而且也是最有效的,使用xpath定
位避免了找不到元素導致報錯的問題,但是在app中使用xpath定位是一件很low
的事情。只要遇見使用xpath定位元素他的反應就會比較慢,自動化的目的是為
了提高效率,但是使用xpath后會降低效率,所以這里說很low
driver.find_element_by_xpath("//android.widget.TextView[@text='JavaScript']").click()
在xpath里面我們的語法是這樣“//android.widget.TextView[@text='JavaScript']”,
這個和我們之前web的xpath一樣,意思是查找所有節點中節點為
android.widget.TextView(這里使用的是className,也可以使用id,系統會依次
去找)並且他的text屬性值為JavaScript,這樣是否更容易理解呢?下來多練習。
這樣的定位方式不推薦,效率很慢。
8.6.css_selector定位(webview)--加載網頁--css
只適用於webview的html頁面,繼承自webdriver,與pc版本的UI測試一致
driver.find_element_by_css_selector()
8.7.link_text定位(webview)
只適用於webview容器中的html頁面,繼承自webdriver,與pc版本的UI測試
一致
driver.find_element_by_link_text()
8.8.源代碼
10.Appium操作界面之觸摸操作(了解)
10.1.規范中的可用事件有:
*短按(press)
*釋放(release)
*移動到(moveTo)
*點擊(tap)
*等待(wait)
*長按(longPress)
*取消(cancel)
*執行(perform)
10.2.單點觸摸TouchAction(driver)
通過TouchAction對象,添加tap、move_to等操作,然后perform()執行,可以
實現解鎖屏幕等功能
action=TouchAction(driver)
action.press(x=220,y=700).move_to(x=840,y=700).move_to(x=220,
y=1530).move_to(x=840,y=1530).release().perform()
10.3.多點觸控MultiAction()
通過MultiAction().add()添加多個TouchAction操作,最后調用perform()一起執行
這些操作
舉例
action0=TouchAction().tap(el)
action1=TouchAction().tap(el)
MultiAction().add(action0).add(action1).perform()
10.4.滑動driver.swipe(x1,y1,x2,y2,duration)
命令解釋:從坐標(x1,x2)滑動到坐標(x2,y2),duration非必填項,滑動時間(滑
動時中間要加等待時間,不加等待時間容易出錯,而且加等待時間的長短也要掌
握好,一般在200-1000毫秒之間應該差不多,自己調試幾次感覺一下哪個時間
比較穩,每個程序可能會有所差異)
滑動的坐標不能超過屏幕的寬高
可以通過【driver.get_window_size()】命令獲得窗口高和寬{'width':1080,'height':
1788}
#獲得機器屏幕大小x,y
defgetSize(driver):
x=driver.get_window_size()['width']
y=driver.get_window_size()['height']
return(x,y)
#屏幕向上滑動
defswipeUp(driver,t=500):
l=getSize(driver)
x1=int(l[0]*0.5)#x坐標
y1=int(l[1]*0.75)#起始y坐標
y2=int(l[1]*0.25)#終點y坐標
driver.swipe(x1,y1,x1,y2,t)
#屏幕向下滑動
defswipeDown(driver,t=500):
l=getSize(driver)
x1=int(l[0]*0.5)#x坐標
y1=int(l[1]*0.25)#起始y坐標
y2=int(l[1]*0.75)#終點y坐標
driver.swipe(x1,y1,x1,y2,t)
#屏幕向左滑動
defswipLeft(driver,t=500):
l=getSize(driver)
x1=int(l[0]*0.75)
y1=int(l[1]*0.5)
x2=int(l[0]*0.05)
driver.swipe(x1,y1,x2,y1,t)
#屏幕向右滑動
defswipRight(driver,t=500):
l=getSize(driver)
x1=int(l[0]*0.05)
y1=int(l[1]*0.5)
x2=int(l[0]*0.75)
driver.swipe(x1,y1,x2,y1,t)
10.5.長按示例
10.6.2.打開界面,使用如下指令,查看activity和package
10.6.3.編寫python腳本代碼
11.系統按鍵事件(了解)
press_keycode(AndroidKeyCode)#發送按鍵事件
例如:點擊home鍵,home鍵的KeyCode是3
12.driver的一些比較重要操作
12.1.reset()
#重置app#這時候driver會重置,相當於卸載重裝應用。所以本地緩存會失效
driver.reset()
12.2.start_activity(包名,activity名)
例如:
#啟動app的某一個activity
啟動一個activity,這個activity必須是AndroidManifest.xml中有intent-filter的
activity,對於其他的activity需要程序跳轉過去
12.3.scroll(起始元素,結束元素)
driver.scroll(origin_el,destination_el)
12.4.獲得當前頁面的所有元素
driver.page_source
這可以用來判斷元素是否存在,例如(assert“發布成功”indriver.page_source)
12.5.補充一些driver啟動時可能用到的項(了解)
其實這些在上一篇啟動里都有介紹,但是有些可能大家沒注意到的點再列一下。
這些點也是我在測試中實際遇到的點
autoLaunch:Appium是否要自動啟動或安裝app,默認true
desired_caps[‘autoLaunch’]=‘false’
有的時候我不想讓appium每次都啟動app,想自己去啟動activity,那這個項
這時就可以起作用了
noReset:在會話前是否重置app狀態。默認是false
desired_caps[‘noReset’]=‘true’
newCommandTimeout:設置未接收到新命令的超時時間,默認60s
如果60s內沒有接收到新命令,appium會自動斷開連接,如果我需要很長時間
做driver之外的操作,可能延長接收新命令的超時時間
desired_caps[“newCommandTimeout”]=1800
13.自動化測試簡單案例-登錄
13.1.打開UIAutomatorViewer
13.2.代碼實現
driver.find_element_by_id("com.example.login:id/et_username").send_keys("hello");
driver.find_element_by_id("com.example.login:id/et_password").send_keys("123");
driver.find_elements_by_class_name("android.widget.Button")[1].click()
14.自動化測試案例2-轉轉
14.1.下載轉轉,並打開,在初始界面查看包和
activity
14.2.使用UIAutomatorViewer查看轉轉按鈕
14.3.點擊跳過
#強制等待3秒鍾
time.sleep(3)
#跳過按鈕
#driver.find_element_by_id("com.wuba.zhuanzhuan:id/arw").click()
14.4.點擊分類
driver.implicitly_wait(10)
#分類按鈕
driver.find_element_by_id("com.wuba.zhuanzhuan:id/b1v").click()
driver.implicitly_wait(10)
#搜索按鈕
driver.find_element_by_id("com.wuba.zhuanzhuan:id/b1p").click()
driver.implicitly_wait(10)
#搜索框中輸入搜索內容
driver.find_element_by_id("com.wuba.zhuanzhuan:id/mg").send_keys(u"電動車")
time.sleep(10)
#點擊搜索
driver.find_element_by_id("com.wuba.zhuanzhuan:id/mi").click()
driver.quit()
15.啟信寶案例
#coding:utf-8
fromappiumimportwebdriver
#desired_caps是一個字典
desired_caps={}
#你要測試的手機操作系統
desired_caps['platformName']='Android'
#手機操作系統的版本
desired_caps['platformVersion']='7.0'
#使用的手機類型或模擬器類型
desired_caps['deviceName']='XPUDU17113015063'
#deviceName你的模擬器名字,就是在下載AVD的時候,你填寫的,忘
了的回頭去找,或者在模擬器頂部會顯示
#所運行的app包名
desired_caps['appPackage']='com.bertadata.qxb'
#app運行的事件
desired_caps['appActivity']='.activity.SplashActivity'
#啟動打開app
driver=webdriver.Remote('http://127.0.0.1:4723/wd/hub',
desired_caps)
#根據元素定位,執行點擊操作
driver.implicitly_wait(10)
serh=
driver.find_element_by_id("com.bertadata.qxb:id/tv_home_searc
h_desc")
serh.click()
driver.find_element_by_id("com.bertadata.qxb:id/et_search_con
tent").send_keys("優思安科技")
driver.quit()