Ios Instruments Automation屏幕截图忽略以编程方式添加的控件
我正在仪器自动化中保存一个屏幕截图,但该屏幕截图中缺少一些控件。以编程方式添加的控件似乎被“忽略” 我怎样才能解决这个问题 模拟器中的手动屏幕截图:(注意黄色框) 仪器自动化中的屏幕截图: 自动化脚本:Ios Instruments Automation屏幕截图忽略以编程方式添加的控件,ios,xcode,automation,instruments,Ios,Xcode,Automation,Instruments,我正在仪器自动化中保存一个屏幕截图,但该屏幕截图中缺少一些控件。以编程方式添加的控件似乎被“忽略” 我怎样才能解决这个问题 模拟器中的手动屏幕截图:(注意黄色框) 仪器自动化中的屏幕截图: 自动化脚本: var target = UIATarget.localTarget(); target.delay(0.5) target.captureScreenWithName( "screenshot1.png" ); 我在Xcode中创建了一个新的单视图应用程序(universal,objec
var target = UIATarget.localTarget();
target.delay(0.5)
target.captureScreenWithName( "screenshot1.png" );
我在Xcode中创建了一个新的单视图应用程序(universal,objective-c)。我在故事板中添加了一个按钮和一个带有自动布局约束的标签
我添加了以下代码以编程方式添加黄色按钮:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIButton *b = [[UIButton alloc] init];
b.backgroundColor = [UIColor yellowColor];
[b setTitle:@"Extra" forState:UIControlStateNormal];
[b setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:b];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:b attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTopMargin multiplier:1.0 constant:0.0]];
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:b attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailingMargin multiplier:1.0 constant:0.0]];
[self.view setNeedsUpdateConstraints];
// Correction: - initially I used the line below, but that was wrong
// The problem is not solved with using setNeedsUpdateConstraints.
// [self.view updateConstraints];
}
我使用的是Xcode版本7.1.1(7B1005),我的操作系统是El Capitan 10.11.1(15B42)。我知道它在早期版本中是有效的,因为我用它来截图,现在出现了问题,以前也有效。这不是ui屏幕截图的问题,因为我可以用仪器自动化单独复制它
我能怎么办
编辑:
故事板中的控件和手动创建的控件之间的一个区别可能是对象ID,可以在故事板源代码中看到。如果出现问题,我是否可以为手动创建的控件设置id
?(或者从情节提要中读取场景后,它是否丢失?)
编辑2:
我获取了视图控制器视图中元素的所有属性(通过objc/runtime),并比较了两个按钮的属性值。差别不大:(不包括相同的条目)
所有按钮现在都有黄色背景,但是“额外”按钮不在屏幕截图中
我主要关注的不是定制外观。我也试过了
UIButton *b = [UIButton buttonWithType:UIButtonTypeSystem];
所以这个按钮就像典型的蓝色按钮。自动屏幕截图中仍然没有显示该按钮
编辑5:
如果相关:我可以从自动化脚本访问控件并点击-例如(从另一个应用程序,而不是此测试代码):
轻敲被处理,因此自动化脚本可以访问控件
编辑6:我在苹果的bugreport系统中创建了一个bug报告。如果你能复制它,那么同样做可能会很好(至少我是这样理解在苹果的bug报告的预期用途的)
编辑7:(感谢quellish的回答-在这里处理我的第一波想法:)我纠正了代码中的一个错误-我调用了[self.view updateConstraints]代码>,但它应该是[self.view setNeedsUpdateConstraints]代码>。但是,这对自动化屏幕截图结果没有影响
我想知道是否更新了约束,并记录了对updateViewConstraints
和其他一些约束的调用。以下是应用程序加载时的日志记录方式:
viewDidLoad
viewWillAppear
updateViewConstraints
viewWillLayoutSubviews
viewWillLayoutSubviews
viewDidAppear
因此,当我在viewDidLoad
中添加按钮和约束,并调用updateViewConstraints
时,我会假设在调用viewdidappease
时,所有约束都已解决
我在viewdideappear
中使用它做了一个快速测试:(还不确定,这是否是一种方法——我对可访问性几乎没有经验。)
自动化屏幕截图保持白色
然而,有趣的是,在元素树中,额外按钮的屏幕截图部分显示了正确的位置。所以我假设,自动化选择了正确的位置。您看到的问题是由几个因素造成的。如你在问题中所述,你的问题是:
- UIAutomation屏幕截图将不包括您的样式化按钮,因为您包含了测试项目和自动化脚本
在不同的条件下,您会看到不同的行为:
- 当按钮通过nib或故事板实例化时,问题不会发生,仅当按钮在代码中声明并添加到视图层次结构时(具体地说,视图控制器的
viewDidLoad
)
- 在早期版本的iOS(即iOS 8)中运行时,该按钮确实会出现在UIAutomation屏幕截图中
也就是说,如果您删除了在viewDidLoad
中添加的约束,您将看到样式化按钮开始出现在屏幕截图中。这应该是一个提示-约束是问题的一部分
当布局引擎解决约束时,它会尝试成批完成尽可能多的工作,合并性能约束。当按钮和约束在nib或故事板中描述时,约束引擎将一次获得它们,并且在视图层次结构的生命周期中更早。因此,布局过程的步骤可以大大简化
但是,当在视图层次生命周期的后期添加约束时,需要重新计算约束。将添加的约束视为添加到队列中,布局引擎将在下次队列“满”时重新计算它们。UIAutomation钩住UIAccessibility API来完成它的工作,而accessibility可能不知道或不关心可视化表示的布局发生了什么。视觉表现可能会改变,但不会影响可访问性,从而影响UIAutomation的世界观
iOS 9改变了布局过程在引擎盖下的工作方式,这就是为什么您现在看到这个问题
您可以采取多种行动:
- 在nib或故事板中构建视图层次结构。这将为您带来最一致的体验,并具有性能和其他优势
- 使用辅助功能API提示按钮的位置(辅助功能框架)在布局传递后已更改。不幸的是,除非在布局完成之前禁用了可访问性、可见性或用户交互,否则您仍然可能看到UIAutomation在布局发生时捕获它
-
UIButton *b = [UIButton buttonWithType:UIButtonTypeSystem];
target.frontMostApp().mainWindow().buttons()[25].tap()
viewDidLoad
viewWillAppear
updateViewConstraints
viewWillLayoutSubviews
viewWillLayoutSubviews
viewDidAppear
_extraButton.accessibilityFrame = UIAccessibilityConvertFrameToScreenCoordinates(_extraButton.frame, self.view);