我的Appium学习记录—— iOS 10.3.2 + Appium 1.6.4 真机实战

上一篇文章中,进了Android的坑,这次,要跳进更大更深的坑——iOS。

百度google了一轮,最大的感触是:好多教程都不适用啊!要么是Appium版本旧,要么是iOS版本旧。想找一篇详细的“从入门到放弃”的教程都没有,之前搭Android环境的时候,能搜到很多十分详实的教程,而iOS的就有点蛋疼了。
然而,坑还是要入的,所以,就从搭环境开始吧。

环境搭建

1. Xcode

必须承认,我是Mac OS新手,有Linux的基础,用了几天Mac OS,算是基本会用了……
本文的系统版本为Mac OS 10.12.5,由于陪测的iOS用的是10.3.2,所以Xcode必须要装上新的8.3.2(不然没有SDK),Xcode在App Store里安装就好了。

2. Appium

Appium向来有命令行版的和GUI版的——我选择后者,到官网下载安装最新的Appium Desktop 1.0.2的dmg,里面带了1.6.4的Appium。

3. Appium客户端库

Python、Ruby、Java、Javascript、PHP、C#等,任君选择,去官网下载。
例如我用Python,就安装Appium-Python-Client,在终端运行

4. Homebrew

Homebrew相当于Linux下的apt-get、yum,要用它来安装node,在终端运行

5. node

6. appium-doctor相关

用来检测Appium相关环境有没有装好的工具:

7. 还有一些库

8. WebDriverAgent相关(大坑

iOS 10+使用的是XCUITest,Appium使用的模块是appium-xcuitest-driver,其中引用了Facebook提供的WDA方案来驱动iOS的测试。
装Appium Desktop的时候,它里面带了一个WebDriverAgent,但是这个自带的是有问题的!会造成不能使用Inspector,卡了很久!从Facebook那里自己clone一份才是王道:

经过了baidu和google,用以上方法解决了不能Inspect的问题。

在使用Appium时,需要把WDA装到真机上,然后又会遇到证书的问题,我也不是很明白,总之跟provisioning profile有关。

用Xcode打开目录下的WebDriverAgent.xcodeproj,对于WebDriverAgentLib 和 WebDriverAgentRunner,勾选“Automatically manage signing”,把Team改成公司的,Bundle Identifier改成公司的证书可以接受的名字,具体可以参考官方文档操作,不懂的找开发同学协助。

然后就可以把WebDriverAgentLib和WebDriverAgentRunner都编译到真机运行一下了。正常来说,会在桌面生成一个没图标的WebDriverAgentRunner,点开之后不会有什么反应,这就对了。

终于把环境搭好了,感动啊。

 

写测试脚本

1. Appium server capabilities

要让App跑起来,还需要了解Appium server capabilities,它告诉Appium服务器很多信息,例如开哪个App、手机的系统/版本、在哪台设备上跑(真机还是模拟器等)等。

给出我用到的一些参数(in Python),其他capabilities请参考官方文档

如果能跑起来,就是正常的,不然看一下报什么错。

2. Inspector

能跑起来只是第一步,更重要的是如何定位元素。

Inspector的使用方法很简单,之前运行driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub’, desired_caps)之后,连接就已经建立好了,只需在浏览器进入http://localhost:8100/inspector即可,之后就可以使用熟悉的driver.find_element_by_xxx方法来定位元素啦。

 

后记

Selenium的坑

后来又遇到了一点坑,例如使用send_keys方法时,报

Message: Parameters were incorrect. We wanted {“required”:[“value”]} and you sent [“text”,”sessionId”,”id”,”value”]

错误,google了一下发现是selenium新版导致的问题,降级后解决:

手势操作

由于XCUI的原因,之前的一些手势操作如swipe、pinch、TouchAction等都不能用了,可以参考这篇官方文档,使用driver.execute_script方法代替。如

对于直接用坐标的,还要注意逻辑分辨率的问题,如iPhone 7 Plus的逻辑分辨率是414×736。

 

最后

刚接触iOS的Appium,之后肯定还会遇到问题,会继续更新本文。

更新,最近更新到了Appium Desktop 1.1,里面带了1.6.5的Appium,使用起来暂时未发现明显区别。

附上一些参考:
1. http://www.cocoachina.com/ios/20170112/18518.html
2. http://blog.sina.com.cn/s/blog_b5a76ebd0102wuce.html
3. https://github.com/appium/appium/blob/master/docs/en/appium-setup/real-devices-ios.md
4. http://blog.csdn.net/achang21/article/details/70877583
5. https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
6. https://github.com/appium/python-client
7. https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/appium-bindings.md
8. https://github.com/facebook/WebDriverAgent/issues/537
9. https://github.com/facebook/WebDriverAgent/wiki/Using-the-Inspector

已有22条评论 发表评论

  1. apple863 /

    写了很详细,感谢作者

    1. 7forz / 本文作者

      谢谢

  2. 烧饼 /

    可以加你qq吗?

    1. 7forz / 本文作者

      可以邮件,上班不能用qq,7f@7forz.com

      1. 烧饼 /

        好的

  3. 小雪 /

    感谢~~

    1. 7forz / 本文作者

      (●’◡’●)

  4. 打豆豆 /

    要哭,邮件发出去被退回,楼主宝宝,WebDriverAgentLib 和 WebDriverAgentRunner的具体操作能写一写嘛,卡在这一步了,开发童鞋也没能解决

    1. 7forz / 本文作者

      啊,看到邮件了,可能是QQ邮箱的过滤太敏感…
      这个我也不专业,大概就是说Bundle Identifier要和Team的对应上,Build Settings里面的Product Bundle Identifier也要改,之后就可以编译运行到手机上

      1. 打豆豆 /

        只改这两个的话,还是不能够编译到手机,会报如下两个错误
        Undefined symbols for architecture armv7:
        “_OBJC_CLASS_$_XCTRunnerDaemonSession”, referenced from:
        objc-class-ref in XCUIElement+FBTap.o
        ld: symbol(s) not found for architecture armv7
        clang: error: linker command failed with exit code 1 (use -v to see invocation)

        1. 7forz / 本文作者

          并没有遇到过 ╮(╯-╰)╭
          但是看报错感觉也不是证书的问题..

  5. 打豆豆 /

    更新了mac系统,就不报错了~

    1. 姜北生 /

      请问更新到哪个版本? 我的是10.12.6

  6. zhaodong /

    楼主你好,我打http://localhost:8100/inspector这报以下错误:求解答
    {
    “value” : “Invalid parameter not satisfying: path\n\n(\n\t0 CoreFoundation 0x000000018142ae50 + 148\n\t1 libobjc.A.dylib 0x0000000180a8ff80 objc_exception_throw + 56\n\t2 CoreFoundation 0x000000018142ad08 + 0\n\t3 Foundation 0x0000000181db0124 + 112\n\t4 WebDriverAgentLib 0x00000001020d1298 -[FBResponseFilePayload initWithFilePath:] + 284\n\t5 WebDriverAgentLib 0x00000001020c926c FBResponseFileWithPath + 84\n\t6 WebDriverAgentLib 0x00000001020dee1c __29+[FBInspectorCommands routes]_block_invoke + 100\n\t7 WebDriverAgentLib 0x00000001020c958c -[FBRoute_Sync mountRequest:intoResponse:] + 168\n\t8 WebDriverAgentLib 0x00000001020c0b78 __37-[FBWebServer registerRouteHandlers:]_block_invoke + 496\n\t9 RoutingHTTPServer 0x00000001067d23cc -[RoutingHTTPServer handleRoute:withRequest:response:] + 144\n\t10 RoutingHTTPServer 0x00000001067d2b80 __72-[RoutingHTTPServer routeMethod:withPath:parameters:request:connection:]_block_invoke + 44\n\t11 libdispatch.dylib 0x0000000180e7547c + 16\n\t12 libdispatch.dylib 0x0000000180e84ae8 + 644\n\t13 libdispatch.dylib 0x0000000180e7547c + 16\n\t14 libdispatch.dylib 0x0000000180e7ab84 _dispatch_main_queue_callback_4CF + 1844\n\t15 CoreFoundation 0x00000001813e0dd8 + 12\n\t16 CoreFoundation 0x00000001813dec40 + 1628\n\t17 CoreFoundation 0x0000000181308d10 CFRunLoopRunSpecific + 384\n\t18 Foundation 0x0000000181d18d8c + 308\n\t19 Foundation 0x0000000181d6dff8 + 88\n\t20 WebDriverAgentLib 0x00000001020bfcd0 -[FBWebServer startServing] + 260\n\t21 WebDriverAgentRunner 0x00000001020afed0 -[UITestingUITests testRunner] + 120\n\t22 CoreFoundation 0x0000000181430ae0 + 144\n\t23 CoreFoundation 0x0000000181328548 + 284\n\t24 XCTest 0x00000001000e60a8 __24-[XCTestCase invokeTest]_block_invoke_2 + 388\n\t25 XCTest 0x000000010011ac98 -[XCTestContext performInScope:] + 208\n\t26 XCTest 0x00000001000e5f0c -[XCTestCase invokeTest] + 268\n\t27 XCTest 0x00000001000e65e0 -[XCTestCase performTest:] + 460\n\t28 XCTest 0x00000001000e3a5c -[XCTestSuite performTest:] + 428\n\t29 XCTest 0x00000001000e3a5c -[XCTestSuite performTest:] + 428\n\t30 XCTest 0x00000001000e3a5c -[XCTestSuite performTest:] + 428\n\t31 XCTest 0x00000001000cf740 __25-[XCTestDriver _runSuite]_block_invoke + 56\n\t32 XCTest 0x00000001000f0260 -[XCTestObservationCenter _observeTestExecutionForBlock:] + 528\n\t33 XCTest 0x00000001000cf5d8 -[XCTestDriver _runSuite] + 460\n\t34 XCTest 0x00000001000d03b4 -[XCTestDriver _checkForTestManager] + 296\n\t35 XCTest 0x000000010011c164 _XCTestMain + 628\n\t36 CoreFoundation 0x00000001813e100c + 20\n\t37 CoreFoundation 0x00000001813e0944 + 308\n\t38 CoreFoundation 0x00000001813de8a8 + 708\n\t39 CoreFoundation 0x0000000181308d10 CFRunLoopRunSpecific + 384\n\t40 GraphicsServices 0x0000000182bf0088 GSEventRunModal + 180\n\t41 UIKit 0x00000001865ddf70 UIApplicationMain + 204\n\t42 XCTRunner 0x00000001000a83d4 XCTRunner + 33748\n\t43 libdyld.dylib 0x0000000180ea68b8 + 4\n)”,
    “sessionId” : “111B2BBF-F287-40C8-BC09-86C3882FC8EE”,
    “status” : 13
    }

    1. 7forz / 本文作者

      你好,虽然我没有遇到,想问一下,①用的是不是FB的WDA;②编译有没有报错?

      1. zhaodong /

        嗯是的,编译没问题啊,我用appium客户端是可以定位的,但是用你那个方法就是这样。

        1. 7forz / 本文作者

          啊..(T_T) 另外请教一下,用appium客户端如何定位?appium版本是?适用的iOS版本?

        2. lisen /

          我也出现类似问题。不知道如何查找元素。希望大神指教

    2. 匿名 /

      我现在也是这样的状态,请问你最后解决了吗?如果解决是如何解决的?

  7. 匿名 /

    我在浏览器里输入http://localhost:8100/inspector直接是不能连接到服务器

  8. 匿名 /

    xudongzhideiMac:WebDriverAgent admin$ ./Scripts/bootstrap.sh
    Fetching dependencies
    Please update to the latest Carthage version: 0.26.0. You currently are on 0.25.0
    *** Downloading RoutingHTTPServer.framework binary at “v1.0.1”
    *** xcodebuild output can be found in /var/folders/lq/_rh3p0dj6756np74dsm6mrmr0000gn/T/carthage-xcodebuild.tojvt5.log
    Building Inspector
    Creating bundle directory…
    Fetching Inspector dependencies…
    npm ERR! code E404
    npm ERR! 404 Not Found: babel-loader@^5.3.2

    npm ERR! A complete log of this run can be found in:
    npm ERR! /Users/admin/.npm/_logs/2017-10-12T02_12_32_820Z-debug.log
    大神 你好 我在输入./Scripts/bootstrap.sh时总是报404

    1. 7forz / 本文作者

      1. 提示更新Carthage
      2. npm尝试换个镜像?
      3. 查看对应log file,看有没有更进一步的信息?

发表评论

验证码 *