近期因爲工做須要,本小菜在弄appium+ios+iphone真機的移動自動化,在網上找尋各類資料,發現針對IOS方面的資料少之又少,公司其它部門的弄過的同事也寥寥無幾,即便有,也是安卓方面的。本次書寫此文章,是爲了幫助依然在坑裏摸爬滾打的夥伴們,早日出坑。javascript
1、環境:java
macBook Pro:10.13.4node
iphone真機:iphone6 plus 11.3.1android
appium 1.8.1ios
xcode 9.3.1git
2、appium原理(轉自https://blog.csdn.net/achang21/article/details/60956618的介紹)github
Appium是一個開源、跨平臺的測試框架,能夠用來測試原生及混合的移動端應用。Appium支持IOS、Android及FirefoxOS平臺。Appium使用WebDriver的json wire協議,來驅動Apple系統的UIAutomation庫、Android系統的UIAutomator框架。Appium對IOS系統的支持得益於Dan Cuellar’s對於IOS自動化的研究。Appium也集成了Selendroid,來支持老android版本。web
Appium支持Selenium WebDriver支持的全部語言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl語言,更可使用Selenium WebDriver的Api。Appium支持任何一種測試框架。若是隻使用Apple的UIAutomation,咱們只能用javascript來編寫測試用例,並且只能用Instruction來運行測試用例。一樣,若是隻使用Google的UIAutomation,咱們就只能用java來編寫測試用例。Appium實現了真正的跨平臺自動化測試。npm
appium選擇了client-server的設計模式。只要client可以發送http請求給server,那麼的話client用什麼語言來實現都是能夠的,這就是appium及webdriver如何作到支持多語言的;json
3、環境搭建步驟:
---------------------必要的庫安裝--------------------------------------
1.xcode安裝,app store裏安裝xcode
2.若是沒有安裝 過homebrew,請先安裝
/usr/bin/ruby -e "$(curl –fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
3.若是沒有安裝過npm及node.js,請先安裝
brew install npm,此命令執行後,npme和node.js會所有安裝完畢
4.安裝依賴庫
brew install libimobiledevice --HEAD
npm install -g ios-deploy #若是是iOS10以上的系統才須要安裝
若是沒有安裝 libimobiledevice,會致使Appium沒法鏈接到iOS的設備,因此必需要安裝,若是要在iOS10+的系統上使用appium,則須要安裝ios-deploy
5.appium-doctor 安裝
npm install appium-doctor -g
安裝後執行appium-doctor --ios指令,能夠查看與iOS相關配置是否完整,下圖是所有配置都成功,若是有哪一項是打叉的,則進行安裝就能夠了。好比若是carthage項是打叉的,則須要安裝:
brew install carthage
---------------------webdriverAgent--------------------------------------
1.安裝webdriverAgent
(1)在github上下載最新webdriverAgent代碼
git clone https://github.com/facebook/WebDriverAgent
(2)下載依賴
cd /Users/yourname/WebDriverAgent
mkdir -p Resources/WebDriverAgent.bundle
sh ./Scripts/bootstrap.sh
該腳本會使用Carthage下載全部的依賴,使用npm打包響應的js文件。執行完成後,直接雙擊打開WebDriverAgent.xcodeproj這個文件。
2.配置WebDriverAgent
配置WebDriverAgentLib,選擇開發者帳號
配置WebDriverAgentRunner,選擇開發者帳號
3.鏈接並選擇本身的ios設備,運行
運行成功後,iphone手機上會新建一個無圖標的WebDriverAgent的應用,自動打開後立刻又返回桌面
而在xcode控制檯會打印以下日誌:裏面有IP地址與端口號
4.在網址上輸入http://(ip地址):(端口號)/status,若是網頁上返回一些json格式的數據,說明運行成功http://10.0.223.58:8100/status,有些iphone手機經過手機的IP和端口號還不能訪問,此時須要將手機的端口轉發到mac上
iproxy 8100 8100
執行命令後,經過訪問 http://localhost:8100/ status來驗證, 若是網頁上返回一些json格式的數據,說明運行成功
而若是是想查看UI的圖層,則可訪問http://localhost:8100/inspector,方便書寫測試用例
備註:一般來講爲了持續集成,自動化會比較好一些,咱們沒必要每次都經過這種方式來啓動xcode、WebDriverAgent,這種方式只在第1次搭建環境時運行便可,咱們能夠在自動化腳本中加入以下代碼,這樣只要在之後啓動appium後,運行自動化腳本,就會直接啓動WebDriverAgent
desiredCapabilities.setCapability("useNewWDA", true);
若是xcode在先啓動wda,而代碼中又用此行代碼,運行時xcode中會顯示執行失敗,報出衝突的錯誤哦,因此後期只在代碼中啓動WebDriverAgent便可,再也不須要用xcode啓動
---------------------appium--------------------------------------
appium安裝
我是使用源碼安裝的,在appium的版本選擇上,我不建議一味的追求最新版,由於最新的版本相配套的其它依賴有可能尚未同步更新,可能會報各類各樣的錯誤,並且最新版可能還不穩定,在這次搭建環境過程當中,我用最新版appium會發現appium的bug,經在github上與appium開發者反覆討論,修復bug,才能解決問題。因此在版本的選擇上,我建議使用穩定版本,而沒必要一味追求最新,小白鼠的角色並很差作,穩定纔是最好的~
npm install –g appium
啓動appium
appium --address 127.0.0.1 --port 4723
2.appium環境搭建的其它問題和調試方法:
(1)在appium執行過程當中,咱們能夠根據appium的日誌來查看哪一個環節有錯誤,如下是我在網上隨便找的一些日誌分析,https://blog.csdn.net/jffhy2017/article/details/69372064,能夠google找哦,網上關於日誌分析的內容不少。
若是在appium執行中哪一個環節出錯,咱們能夠將post的命令直接輸入在url中,看看返回的json串中的詳細錯誤信息,根據此錯誤信息排錯。
http://10.0.223.58:8100/(POST的命令)
(2)能夠在github上給appium的開發者留言,來解決問題。本身的英文+google翻譯,appium的開發者仍是很耐心的,並且解決問題一針見血,很是對症~
附上我一個問題:https://github.com/appium/appium/issues/10775
---------------------appium實踐實例-解鎖九宮格-----------------------------------
(附上動態效果圖:之後再加。。。)
代碼以下:
public class SampleTest1 {
private IOSDriver driver;
@Before
public void setUp() throws MalformedURLException {
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("deviceName", "iphone 6 Plus");
desiredCapabilities.setCapability("platformVersion", "11.3.1");
desiredCapabilities.setCapability("platformName", "iOS");
desiredCapabilities.setCapability("app", "/Users/yangyang50/Desktop/work/JDMEIphone_4.6.0.ipa");
desiredCapabilities.setCapability("udid", "*****************");//請填寫手機的udid
desiredCapabilities.setCapability("autoLaunch", false);
desiredCapabilities.setCapability("useNewWDA", true);
desiredCapabilities.setCapability("xcodeOrgId","******");//請填寫開發者賬號對應的OrgId
desiredCapabilities.setCapability("xcodeSigningId","iPhone Developer");
URL remoteUrl = new URL("http://localhost:4723/wd/hub");
driver = new IOSDriver(remoteUrl, desiredCapabilities);
}
@Test
public void sampleTest1() throws InterruptedException{
MobileElement element_cancel = (MobileElement) driver.findElementByAccessibilityId("取消");
element_cancel.click();
Thread.sleep(2000);
MobileElement element_1 = (MobileElement) driver.findElementByXPath("(//XCUIElementTypeButton[@name=\"lock botton unselected\"])[1]");
MobileElement element_3 = (MobileElement) driver.findElementByXPath("(//XCUIElementTypeButton[@name=\"lock botton unselected\"])[3]");
MobileElement element_6 = (MobileElement) driver.findElementByXPath("(//XCUIElementTypeButton[@name=\"lock botton unselected\"])[6]");
TouchAction action = new TouchAction(driver);
action.press(element_1).waitAction(500).moveTo(element_3).waitAction(500).moveTo(element_6).release().perform();
Thread.sleep(1000);
}
@After
public void tearDown() {
driver.quit();
}
}