Appium iOS 获取 page_source 方案讨论

wangst · 2016年12月20日 · 最后由 wangst 回复于 2017年02月21日 · 3013 次阅读

起因:
在 iOS 端,使用 appium 的 driver.page_source 方法,获取当前页面的页面结构时,出现了以下错误:

XCTRunner[7782]: Enqueue Failure: UI Testing Failure - Failure fetching attributes for element <XCAccessibilityElement: 0x6000002533e0> Device element: Error Domain=XCTestManagerErrorDomain Code=13 "Error copying attributes -25202" UserInfo={NSLocalizedDescription=Error copying attributes -25202} <unknown> 0 1

然后就开始调研,发现社区里也有同学遇到了相似问题:https://testerhome.com/topics/6396

同时找到了一个比较靠谱的原因:https://github.com/facebook/WebDriverAgent/issues/316 ,是一个 WDA 的 issue 问题:https://github.com/facebook/WebDriverAgent/issues/372

现在想和各位咨询一下,是否还有其他方案可以获取当前页面的 page_source?

备注:
目前了解到的方案 1:通过 UIAutomation 脚本,UIATarget.localTarget.logElementTree() 来获取。---目前采用 XCUITest,该方案目测不可行。

@xdf @seveniruby @Lihuazhang @Anikikun @xubin98246

谢谢!

目前一种解决方案,有同学验证已经 OK 了,我这里采用相同方案,依然有问题,大家可以试试:
方案为:

1.找到 XCUIElement+FBIsVisible.m。具体地址为:

/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m

或者

/User/xxxx/.nvm/versions/node/v6.3.0/lib/node_modules/.appium_npminstall/node_modules/appium-xcuitest-driver/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m

2.将 fb_isVisible 方法进行修改,具体调整为:

- (BOOL)fb_isVisible
{
  return !CGRectIsEmpty(self.frame) && !CGRectIsEmpty(self.visibleFrame) && (CGRectIntersectsRect(self.visibleFrame, self.application.frame) || ((self.application.interfaceOrientation == UIInterfaceOrientationLandscapeLeft || self.application.interfaceOrientation == UIInterfaceOrientationLandscapeRight) && self.application.frame.size.height > self.application.frame.size.width && CGRectIntersectsRect(self.visibleFrame, CGRectMake(0, 0, self.application.frame.size.height, self.application.frame.size.width))));
  // return !CGRectIsEmpty(self.frame) && !CGRectIsEmpty(self.visibleFrame);
}

祝各位好运。

共收到 20 条回复 时间 点赞
wangst 关闭了讨论 12月20日 10:50
wangst 重新开启了讨论 12月20日 10:50
匿名 #22 · 2016年12月20日

我已经升级到 1.6.3 版本了,还是有这个问题。
而且,现在遇到了一个更奇葩的问题,还是这个报错,
运行 python 脚本,目前在获取某一个值的时候每次在这里都报错,获取不到,
但是用 excel 跑同样的用例,也会调用到同样的方法,却没有这种问题!

我还没遇到. 你可以查查原因. 要不自己修复这个 bug, 要不就等下 wda 解决

#3 楼 @Tank007 我情况应该和你类似。
目前也一直遇到这个问题

wangst #19 · 2016年12月20日 Author

#4 楼 @seveniruby appcrawler 工具在 iOS 上,没有出现这种吗? 尤其是在 tableview 中,当 tabelview 具有 loadmore 的时候,或者有下拉刷新,上拉加载更多的时候。

另外,想咨询一下思寒,iOS 和 Android 端,处理 alert 或者系统权限,有没有优美的方式或者通用的方式?
以前 iOS 端是 autoacceptalert,但是这个功能现在不能使用。

wangst #18 · 2016年12月20日 Author

#4 楼 @seveniruby 除了 appium 提供的方案,思寒有了解,还有其他哪些方案或者工具,能够获取当前 window 的 page_source 吗?

匿名 #17 · 2016年12月20日

我已经解决了,现在没有这个报错了 ,你可以试试 https://testerhome.com/topics/6396

wangst #16 · 2016年12月20日 Author

#8 楼 @Tank007
这个方案我试了,我这里依然有问题。
哈哈,不过,你那里通过这个方案解决了,是个好事。

赞!

wangst 关闭了讨论 01月06日 16:53
思寒_seveniruby 重新开启了讨论 01月12日 10:14

#8 楼 @Tank007 我最近也遇到了 现在公司的 app 也出现这个问题了 我试试你的方案 看起来是 wda 的问题 appium1.6.4 bug 也有点多

#8 楼 @Tank007 本质的问题是官方的这段代码没修复好.

https://github.com/facebook/WebDriverAgent/commit/381a4845aaf839858e05e07e10ea86eea8bf37c2#diff-be3350fe6810b7f7a366420d037638fe
注释里面也提了原因, 可惜官方还是没修改好.

- (BOOL)fb_isVisible
{
  if (CGRectIsEmpty(self.frame) || CGRectIsEmpty(self.visibleFrame)) {
    /*
     It turns out, that XCTest triggers
       Enqueue Failure: UI Testing Failure - Failure fetching attributes for element
       <XCAccessibilityElement: 0x60000025f9e0> Device element: Error Domain=XCTestManagerErrorDomain Code=13
       "Error copying attributes -25202" UserInfo={NSLocalizedDescription=Error copying attributes -25202} <unknown> 0 1
     error in the log if we try to get visibility attribute for an element snapshot, which does not intersect with visible appication area
     or if it has zero width/height. Also, XCTest waits for 15 seconds after this line appears in the log, which makes /source command
     execution extremely slow for some applications.
     */
    return NO;
  }
  return [(NSNumber *)[self fb_attributeValue:FB_XCAXAIsVisibleAttribute] boolValue];
}
匿名 #11 · 2017年01月12日

#13 楼 @seveniruby 你修改后怎么样,问题解决没?

#14 楼 @Tank007 解决了 25202, 还有个 25201 的问题, 这个问题资料更少. 肯定还是跟读取元素属性有关.

2017-01-12 15:19:51.551 XCTRunner[31911:3032971] Enqueue Failure: UI Testing Failure - Failure getting snapshot Error Domain=XCTestManagerErrorDomain Code=9 "Error -25201 getting snapshot for element <AXUIElement 0x7fde15c1bbb0> {pid=31912}" UserInfo={NSLocalizedDescription=Error -25201 getting snapshot for element <AXUIElement 0x7fde15c1bbb0> {pid=31912}} <unknown> 0 1
    t =   370.11s         Find the Application "com.meituan.xxxx" 0x7fced87ddb70 (retry 1)
    t =   370.11s             Snapshot accessibility hierarchy for com.meituan.iToGo.ep
2017-01-12 15:20:08.399 XCTRunner[31911:3033873] Enqueue Failure: UI Testing Failure - Failure getting snapshot Error Domain=XCTestManagerErrorDomain Code=9 "Error -25201 getting snapshot for element <AXUIElement 0x7fde15e147c0> {pid=31912}" UserInfo={NSLocalizedDescription=Error -25201 getting snapshot for element <AXUIElement 0x7fde15e147c0> {pid=31912}} <unknown> 0 1
    t =   387.24s         Find the Application "com.meituan.xxxx" 0x7fced87ddb70 (retry 2)
    t =   387.24s             Snapshot accessibility hierarchy for com.meituan.iToGo.ep
匿名 #9 · 2017年01月12日

#15 楼 @seveniruby 你这个是跟截图相关的,你可以把截图功能关掉,会不会就没这个报错了

#16 楼 @Tank007 这个错误是在调用 getPageSource 的时候才报的错误. 你是怎么认为跟截图有关啊

匿名 #7 · 2017年01月12日

#17 楼 @seveniruby UI Testing Failure - Failure getting snapshot Error,那 25201 的问题,就只能等 wda 修复了

#18 楼 @Tank007 他这个应该不是截图的意思. 是取当时的控件的快照. 其实遇到有问题的控件跳过就可以了. wda 估计对异常没做太多兼容处理导致的. OC 不会, 只能等官方修复了. 我先通过其他方法实现了我要做的功能.

#16 楼 @Tank007 解决了. 我用了 9.3 版本的模拟器就会报错. 10.x 以上的就没了. 跟实现有关.

匿名 #23 · 2017年01月12日

#22 楼 @seveniruby 跟模拟器的系统版本也有关啊,好吧,这太坑了

#22 楼 @seveniruby https://github.com/appium/appium/issues/7641 我用这里面的方法解决的,目前运行后,效果还不错。
另外,更新了 appium 中所有包:npm uninstall -g appium && npm install -g appium --no-shrinkwrap

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册