前提條件:
===========================================
1.Xcode版本為Xcode10及以上
2.Appium版本必須為1.9及以上,因為Xcode為10.0
3.appium-desktop
4.安裝所需依賴庫,包括:
a.Homebrew
b.Git
c.node (brew install node)
d.npm (brew install npm)
e.carthage (brew install carthage)
f.libimobiledevice(真機測試需要)(brew install libimobiledevice)
g.ios-deploy(真機測試需要)(brew install ios-deploy)
5、WDA配置
===========================================
上面的環境配置具體參考:
《【Mac + Appium學習(一)】之安裝Appium環境前提准備》
《【Mac + Appium + Python3.6學習(三)】之IOS自動化測試環境配置》
環境:
- MacOS:10.13.6
- Appium:1.9.1
- Appium-desktop:1.7.1
- Java:1.8
- XCode:10.0
一、安裝測試環境
1、配置上面都有就不一一描述了,下面來看一下IOS模擬器:
1)打開Xcode,選擇如下圖所示,打開模擬器:

會啟動一個模擬器:

模擬器的版本可以自行選擇,這里我選擇iPhone7:

如果想關閉某個模擬器,則點擊要關閉的窗口再關閉,如下圖:
下面去appium官網下載IOS演示程序:
地址:https://github.com/appium/ios-uicatalog
項目clone到本地環境:
$ git clone https://github.com/appium/ios-uicatalog.git Cloning into 'ios-uicatalog'... remote: Enumerating objects: 294, done. remote: Total 294 (delta 0), reused 0 (delta 0), pack-reused 294 Receiving objects: 100% (294/294), 6.63 MiB | 1.35 MiB/s, done. Resolving deltas: 100% (159/159), done.
命令打開項目:
$ open UICatalog.xcodeproj/
2、模擬器上跑自動化
1)剛剛的項目在模擬器中進行編譯:
點擊紅框



會自動啟動模擬器:

2)然后拷貝項目app的xpath,來配置在參數中:
①拷貝到參數中


會報錯:
Original error: '10.3.1' does not exist in the list of simctl SDKs. Only the following Simulator SDK versions are available on your system: 10.3, 12.0
意思是沒有'10.3.1',只有'10.3、12.0'版本的SDK,所以手動修改:

又報錯:
Original error: Could not create simulator with name 'appiumTest-iPhone7', device type id 'iPhone7' and runtime id '10.3.1'. Reason: 'simctl error running 'create': Invalid device type: iPhone7'
經過查詢得知:
感謝:每天1990:《Appium1.6啟動iOS真機》*很重要
②udid通過命令獲取:
instruments -s devices
獲取你打開的模擬器的id。
再運行session:

完整參數如下:
{ "platformName": "iOS", "platformVersion": "10.3", "deviceName": "iPhone7", "automationName": "XCUITest", "app": "/Users/xxx/Library/Developer/Xcode/DerivedData/UICatalog-hiixtcsjcynttngjfqlnzjjtpxkv/Build/Products/Debug-iphonesimulator/UICatalog.app", "udid": "D3062BB8-5627-4867-8E97-AEDF6D953353" }
3)並且輸入地址:http://localhost:8100/inspector,也會有檢查器顯示。

4)設置log路徑,如圖:
①第一種在appium桌面程序設置log路徑:

②第二種用命令行重新啟動一個自己的appium(相當於新建一個appium服務5723)
輸入命令:
$ appium -g /Users/xxx/Desktop/mine/Stu資料/Git/git—download/project/appium2.log -p 5723 [Appium] Welcome to Appium v1.9.1 [Appium] Non-default server args: [Appium] port: 5723 [Appium] log: /Users/xxx/Desktop/mine/Stu資料/Git/git—download/project/appium2.log [Appium] Appium REST http interface listener started on 0.0.0.0:5723
再設置參數啟動:

同樣可以啟動app,並且生成appium2.log文件。
5)擴展:對Simulator控制
https://github.com/facebook/FBSimulatorControl/blob/master/fbsimctl/README.md
6)編寫用例
利用IDEA編輯器,在之前《【Mac + Appium + Java1.8學習(一)】之Android自動化環境安裝配置以及IDEA配置(附錄擴展Selenium+Java自動化)》已經介紹如何使用配置IDEA。
之前在appium-desktop中可以自動生成代碼,把它復制到IDEA中,如圖:

但是,從現在開始先暫時不用appium-desktop,用XCode自帶的查看元素工具。

如圖步驟:

上代碼:
解釋=>findElementByAccessibilityId,如果包含name屬性則可以使用。
參考官網:http://appium.io/docs/en/writing-running-appium/finding-elements/
package IOS_Simulator; import io.appium.java_client.ios.IOSDriver; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.remote.DesiredCapabilities; import java.net.MalformedURLException; import java.net.URL; public class DemoTest { private IOSDriver driver; @Before public void setUp() throws MalformedURLException { DesiredCapabilities desiredCapabilities = new DesiredCapabilities(); desiredCapabilities.setCapability("platformName", "iOS"); desiredCapabilities.setCapability("platformVersion", "10.3"); desiredCapabilities.setCapability("deviceName", "iPhone7"); desiredCapabilities.setCapability("automationName", "XCUITest"); desiredCapabilities.setCapability("app", "/Users/xxx/Library/Developer/Xcode/DerivedData/UICatalog-hiixtcsjcynttngjfqlnzjjtpxkv/Build/Products/Debug-iphonesimulator/UICatalog.app"); desiredCapabilities.setCapability("udid", "D3062BB8-5627-4867-8E97-AEDF6D953353"); URL remoteUrl = new URL("http://127.0.0.1:4723/wd/hub"); driver = new IOSDriver(remoteUrl, desiredCapabilities); } @Test public void sampleTest() { // MobileElement el1 = (MobileElement) driver.findElementByXPath("//XCUIElementTypeApplication[@name=\"UICatalog\"]/XCUIElementTypeWindow[1]/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeTable/XCUIElementTypeCell[4]"); // el1.click(); // MobileElement el2 = (MobileElement) driver.findElementByXPath("(//XCUIElementTypeButton[@name=\"Button\"])[2]"); // el2.click(); driver.findElementByAccessibilityId("Buttons").click(); // driver.getPageSource().sout ===> System.out.println(driver.getPageSource()); System.out.println(driver.getPageSource()); driver.findElementByXPath("//*[@label='Button']").click(); driver.findElementByAccessibilityId("UICatalog").click(); } @After public void tearDown() { // driver.quit(); } }
運行結果:

3、真機上跑自動化
真機官網地址說明:http://appium.io/docs/en/drivers/ios-xcuitest-real-devices/
1)配置參數
為了入門學習,還是要啟動appium-desktop,完整參數:app參數有坑
{ "platformName": "iOS", "platformVersion": "10.3", "deviceName": "iPhone5s", "automationName": "XCUITest", "app": "/Users/xxx/Library/Developer/Xcode/DerivedData/UICatalog-hiixtcsjcynttngjfqlnzjjtpxkv/Build/Products/Debug-iphonesimulator/UICatalog.app", "udid": "42ebab931b6b2d6a140b1a4f5bd55305dbfe2ff0" }
啟動session,報錯:
Original error: Could not install app: 'Command 'ios-deploy --id 42ebab931b6b2d6a140b1a4f5bd55305dbfe2ff0 --bundle /Users/zhangc/Library/Developer/Xcode/DerivedData/UICatalog-hiixtcsjcynttngjfqlnzjjtpxkv/Build/Products/Debug-iphonesimulator/UICatalog.app' exited with code 253'
因為這個app當時是在模擬器進行的配置,所以我們還要配置真機,如下:

但是報錯:
Signing for "UICatalog" requires a development team. Select a development team in the project editor. (in target 'UICatalog')

如圖修改就不報錯了:

再一次運行,真機配置安裝app成功:

復制app的Path到appium-desktop的參數中:


啟動session后,可以加載app,如圖:

2)編寫自動化腳本
(1)WebView自動化
需要安裝以下幾個命令:
①安裝依賴庫:libimobiledevice
brew install libimobiledevice --HEAD
②安裝ios-webkit-debug-proxy:
官網為:
https://github.com/google/ios-webkit-debug-proxy
http://appium.io/docs/en/writing-running-appium/web/ios-webkit-debug-proxy/
# 調試轉換 brew install ios-webkit-debug-proxy
並且IOS手機設置一下Web檢查器:設置->safari瀏覽器->高級->Web檢查器->打開
# 擴展:手機截圖 idevicescreenshot
安裝完成后,進行appium-desktop參數配置:
{ "platformName": "iOS", "platformVersion": "10.3", "deviceName": "iPhone5s", "automationName": "XCUITest", "udid": "auto", # 默認第一台連接設備 "startIWDP": true, "browserName": "Safari" }
啟動session后,成功:

③編寫腳本
package IOS.Real; import io.appium.java_client.ios.IOSDriver; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.remote.DesiredCapabilities; import java.net.MalformedURLException; import java.net.URL; public class DemoTest_WebView { private IOSDriver driver; @Before public void setUp() throws MalformedURLException { DesiredCapabilities desiredCapabilities = new DesiredCapabilities(); desiredCapabilities.setCapability("platformName", "iOS"); // desiredCapabilities.setCapability("platformVersion", "10.3"); desiredCapabilities.setCapability("deviceName", "auto"); desiredCapabilities.setCapability("automationName", "XCUITest"); desiredCapabilities.setCapability("udid", "auto"); desiredCapabilities.setCapability("startIWDP", true); desiredCapabilities.setCapability("browserName", "Safari"); // 42ebab931b6b2d6a140b1a4f5bd55305dbfe2ff0 URL remoteUrl = new URL("http://localhost:4723/wd/hub"); driver = new IOSDriver(remoteUrl, desiredCapabilities); } @Test public void web(){ driver.get("https://testerhome.com"); driver.findElementByXPath("//*[contains(@title,'北京管理沙龍')]").click(); // driver.get("https://appium.io/"); // driver.findElementByXPath("(//XCUIElementTypeOther[@name=\"導航\"])[1]").click(); } @After public void tearDown() { // driver.quit(); } }
運行代碼后一直報錯,后來經過痛苦的查詢得知:
參考解決地址:《AppiumDriver driver = new AppiumDriver 的AppiumDriver報錯問題解決》
WebDriverException: An unknown server-side error occurred while processing the command. Original error: Unhandled endpoint
錯誤日志:org.openqa.selenium.WebDriverException: An unknown server-side error occurred while processing the command. Original error: Unhandled endpoint: /session/763C2E9E-9078-4931-BDF3-A05C2E3AF2E5/wda/screen -- http://localhost:8100/ with parameters {
wildcards = (
"session/763C2E9E-9078-4931-BDF3-A05C2E3AF2E5/wda/screen"
);
}
代碼執行到這里就報錯:
driver = new IOSDriver(remoteUrl, desiredCapabilities);
因為使用的appium-client版本太高導致的,后來在Maven中由6.1.0版本降到5.0.4版本再運行就好了

