最新macOS 11.4+Xcode 12.5+iOS 14.6 编译安装WebDriverAgent填坑记

最近要使用腾讯的GAutomator2来进行iOS端的unity游戏UI自动化测试,于是在配置环境阶段需要将WebDriverAgent编译安装到iOS设备上。

我有随时更新系统的习惯,Mac系统不能降级,iPhone系统不能降级。这整个的过程真是一个坑接着一个坑,接下来记录下自己填坑的过程吧。

我的Mac系统是现在最新的:

macOS Big Sur 版本:11.4

Xcode Version 12.5 (12E262)

iPhone 系统版本:14.6

WebDriverAgent介绍

WebDriverAgent是iOS的WebDriver服务器实现,可用于远程控制iOS设备。它允许您启动和终止应用程序,点击并滚动视图或确认屏幕上是否存在视图。

这使其成为用于应用程序端到端测试或通用设备自动化的理想工具。它通过调用Apple的API来直接在设备上执行命令来工作。

下载wt-wda

facebook原版:https://github.com/facebook/WebDriverAgent
差别在于增加了一些快速点击和快速截图的接口。若使用GA录制工具,需要下载wetest版。
下载好之后找到所在目录,终端里执行./Scripts/bootstrap.sh,这个命令会通过刚刚安装的carthage安装很多依赖包,时间可能会很长,耐心等待即可。

编译WDA

1、申请苹果开发者证书,部署IOS项目平台需要开发者证书,现在可以通过个人Apple Id登录即可
登录方式为:Xcode -> Preferences -> Accounts -> Manage Certificates -> 左下角+号 -> ios development
 
2、使用xcode打开:WebDriverAgent.xcodproj路径,如下图:
 
3、选择WebDriverAgentLib和WebDriverAgentRuner的Team字段,进入Singing&Capabilities选项,修改Team字段为刚才自己设置的证书,如图:
 WebDriverAgentLib:
 
WebDriverAgentRuner:
 
4、设置好账号后还会报出一个错误,如下图:
 
大概意思是这个项目的app ID冲突了,随意修改成一个不重复的id即可,修改位置:

 
5、选择Product -> Schema -> WebDriverAgentRunner,如下图:
 
6、选择Product -> Destination -> 连接的真机名:
 
7、开始编译:

 

如果一切正常的话,那么就会Build Success。然后进行下面第8步:
8、运行运行Product -> Test,安装成功后手机上会出现一个无图标的WebDriverAgent应用,启动之 后,马上又返回到桌面,这是很正常的。

遇到的错误

错误1:提示build failed,报错信息为:semantic issue:Messaging unqualified id,可以参考以下解决方案:

解决方法:
找到如下文件: 
/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/Configurations/ProjectSettins.xcconfig

WARNING_CFLAGS = $(inherited) -Weverything -Wno-objc-missing-property-synthesis -Wno-unused-macros -Wno-disabled-macro-expansion -Wno-gnu-statement-expression -Wno-language-extension-token -Wno-overriding-method-mismatch -Wno-missing-variable-declarations -Rno-module-build -Wno-auto-import -Wno-objc-interface-ivars -Wno-documentation-unknown-command -Wno-reserved-id-macro -Wno-unused-parameter -Wno-gnu-conditional-omitted-operand -Wno-explicit-ownership-type -Wno-date-time -Wno-cast-align -Wno-cstring-format-directive -Wno-double-promotion -Wno-partial-availability
修改为:
WARNING_CFLAGS = $(inherited) -Weverything -Wno-objc-missing-property-synthesis -Wno-unused-macros -Wno-disabled-macro-expansion -Wno-gnu-statement-expression -Wno-language-extension-token -Wno-overriding-method-mismatch -Wno-missing-variable-declarations -Rno-module-build -Wno-auto-import -Wno-objc-interface-ivars -Wno-documentation-unknown-command -Wno-reserved-id-macro -Wno-unused-parameter -Wno-gnu-conditional-omitted-operand -Wno-explicit-ownership-type -Wno-date-time -Wno-cast-align -Wno-cstring-format-directive -Wno-double-promotion -Wno-partial-availability -Wno-objc-messaging-id

错误2:编译报错Building for iOS, but the linked and embedded framework 'RoutingHTTPServer.framework' was built for iOS + iOS Simulator.

解决方法:
将 BuildSettings ->Build Options->Validate Workspace 设置为 Yes。它仍然会显示警告,但会构建项目。

 

错误3:'assign' property of object type may become a dangling reference; consider using 'unsafe_unretained'

解决方法:
报错出双击,进入到报错代码处,将assign改为strong后再次build
错误4:implementing deprecated method
 
这个错误是使用了Object-C垃圾回收器不支持的方法 Objective-C garbage collection is no longer supported.
当时查到一个帖子,说了造成此错误的原因,但是没有说解决方法,由于不是开发者,说得其他的方法我也看不懂,我自己查了好久也没有找到解决方式,已经打算放弃了,后来在同事的帮助下,又继续找原因。总算功夫苦心人,我在苹果开发者文档(文末参考链接3)中找到了解决方法,如下:
在Xcode中,点击报错的地方,会导航到出错的代码,然后作如下修改:

修改之后再次Build,就看到 Build Succeed! 

报错5:unrecognized selector sent to instance 0x283f96b00;

这个一般是在执行第8步骤的时候报错:
如下图:
 
 
解决方法:
修改 WebDriverAgentLib/Utilities/FBFailureProofTestCase.m  第26行

 
self.internalImplementation = (_XCTestCaseImplementation *)[FBXCTestCaseImplementationFailureHoldingProxy proxyWithXCTestCaseImplementation:self.internalImplementation];

 修改为:

  if ([self respondsToSelector:@selector(internalImplementation)]) {
    // The `internalImplementation` API has been removed since Xcode 11.4
    self.internalImplementation =
      (_XCTestCaseImplementation *)[FBXCTestCaseImplementationFailureHoldingProxy
                                    proxyWithXCTestCaseImplementation:self.internalImplementation];
  } else {
    self.shouldHaltWhenReceivesControl = NO;
  }
}

  

然后 运行Product -> Test,让项目以Test模式跑起来 耗时4天,终于成功了,老泪纵横…
成功之后如下图:
在命令行中使用 iproxy 8200 :8100命令,将手机的8100端口与PC的8200端口做映射,在地址栏中打开http://127.0.0.1:8200/status返回一个json串即表明连接成功:

 

原文地址:https://www.cnblogs.com/xiehong/p/14898938.html