Xcode UI测试-UI测试失败-点击搜索字段“取消”按钮时,无法滚动到可见(通过AX操作)


85

我试图通过点击搜索栏中的“取消”按钮来关闭搜索字段。

测试用例无法找到取消按钮。在Xcode 7.0.1中运行正常

我添加了谓词以等待按钮出现。当我们点击“取消”按钮时,测试用例失败

let button = app.buttons[“Cancel”]
let existsPredicate = NSPredicate(format: "exists == 1")

expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)

button.tap() // Failing here

日志

    t =     7.21s     Tap SearchField
t =     7.21s         Wait for app to idle
t =     7.29s         Find the SearchField
t =     7.29s             Snapshot accessibility hierarchy for com.test.mail
t =     7.49s             Find: Descendants matching type SearchField
t =     7.49s             Find: Element at index 0
t =     7.49s             Wait for app to idle
t =     7.55s         Synthesize event
t =     7.84s         Wait for app to idle
t =     8.97s     Type 'vinayak@xmd.net' into
t =     8.97s         Wait for app to idle
t =     9.03s         Find the "Search" SearchField
t =     9.03s             Snapshot accessibility hierarchy for com.test.mail
t =     9.35s             Find: Descendants matching type SearchField
t =     9.35s             Find: Element at index 0
t =     9.36s             Wait for app to idle
t =     9.42s         Synthesize event
t =    10.37s         Wait for app to idle
t =    10.44s     Check predicate `exists == 1` against object `"Cancel" Button`
t =    10.44s         Snapshot accessibility hierarchy for com.test.mail
t =    10.58s         Find: Descendants matching type Button
t =    10.58s         Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.58s     Tap "Cancel" Button
t =    10.58s         Wait for app to idle
t =    10.64s         Find the "Cancel" Button
t =    10.64s             Snapshot accessibility hierarchy for com.test.mail
t =    10.78s             Find: Descendants matching type Button
t =    10.78s             Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.79s             Wait for app to idle
t =    11.08s         Synthesize event
t =    11.13s             Scroll element to visible
t =    11.14s             Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003

@乔·马西洛蒂有什么想法吗?
2015年

只是一个健全性检查,但是屏幕上是“取消”按钮还是需要滚动到该按钮?我知道仍然存在滚动到元素并不总是有效的问题。
Joe Masilotti 2015年

屏幕上显示@JoeMasilotti取消按钮。取消按钮是系统默认按钮,它是UISearchbar的一部分。当我点击[self.buttons [@“ Cancel”] tap]时,在Xcode 7.0.1中运行正常。
2015年

1
@Vinpai当您app.tables.cells.allElementsBoundByAccessibilityElement.count在点击按钮之前添加a时会发生什么?只是好奇-这有时帮助我“刷新”屏幕。
cakes88

@Konnor,我尝试使用您建议的API,但是当我点击“取消”按钮时,它失败了。当我在调试器中查询application.buttons时,它显示取消按钮
Vinpai 2015年

Answers:


140

我想在这里“取消”按钮返回falsehittable属性,那就是防止它拍打。

如果您tap()在文档中看到它说

/*!
 * Sends a tap event to a hittable point computed for the element.
 */
- (void)tap;

似乎XCode 7.1破坏了一切,为了使自己(以及u;))不受这些问题的困扰,我写了一个扩展XCUIElement,允许即使无法命中也可以点击元素。以下可以为您提供帮助。

/*Sends a tap event to a hittable/unhittable element.*/
extension XCUIElement {
    func forceTapElement() {
        if self.hittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
            coordinate.tap()
        }
    }
}

现在您可以致电

button.forceTapElement()

更新-对于Swift 3,请使用以下命令:

extension XCUIElement {
    func forceTapElement() {
        if self.isHittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0))
            coordinate.tap()
        }
    }
}

感谢您的修复。我遇到了类似的问题,cell.tap()并解决了这个问题。Xcode7.1中的某些内容似乎已发生更改,导致某些元素不再可击中
francisOpt 2015年

我有一个自定义的NavigationBar backButtonItem,在Xcode7.1中不是“可命中的”,此解决方案对我有用self.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex

谢谢-为我的同一个工作。
Tache

7
就我而言,它在水龙头位于视图中心时起作用。将偏移量更改为(0.5,0.5)。let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
格雷厄姆·珀克斯

1
做得好。在看到这一点之前,我几乎要杀死我的Macbook。
ChaosSpeeder '16

11

对我来说,根本原因是我想点击的对象

  • 已设置为隐藏(并返回)
  • 已被删除并重新连接

在这两种情况下,isAccessibilityElement财产都是false后来的。设置回true固定。


3
这正是我的问题。奇怪的是,它开始在iOS 11上发生(在iOS 10上运行良好)。
里卡多·桑切斯·塞兹

4

对于Google查询,该问题在术语“无法滚动到可见(通过AX操作)按钮失败”方面的排名很高。鉴于问题的年代久远,我倾向于认为这已不再是XCUITest框架的问题,正如公认的答案所暗示的那样。

我发现此问题是由于XCElement现有原因引起的,但被隐藏在软件键盘后面。该错误由框架发出,因为它无法将存在于视图中的视图滚动到可点击的视图中。就我而言,该按钮有时位于软件键盘后面。

我发现iOS模拟器的软件键盘在某些情况下(例如在您的计算机上)可能已关闭,而在其他情况下(例如在您的CI上)可能已打开。就我而言,我在一台机器上关闭了软件键盘,默认情况下,在另一台机器上又打开了它。

解决方案:在尝试轻按键盘背后的按钮之前,请先将其关闭。

我发现在某个按钮上敲击可以明确解散键盘的地方,然后再在所有环境下都解决了我的问题。

我添加了一些操作,以使当前响应者重新登录到resignFirstResponder。我的文本视图后面的视图将迫使第一响应者辞职,因此我在最后一个文本区域下方的某个位置点击。

 /// The keyboard may be up, dismiss it by tapping just below the password field
let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1))
pointBelowPassword.press(forDuration: 0.1)

2

请检查元素的特征,我在使用TableViewSectionHeader时遇到了相同的问题,我在尝试轻按,但在所有地方都失败

在此处输入图片说明


1

Sandy的变通办法似乎在一段时间内有所帮助,但随后不再有用-然后我将其更改为:

func waitAndForceTap(timeout: UInt32 = 5000) {
    XCTAssert(waitForElement(timeout: timeout))
    coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}

要点是因为问题在于isHittable检查会引发异常,所以我根本不执行此检查,而是在找到元素后直接查找坐标。



0

如果您使用AppCenter模拟器运行测试,则应确保在与本地模拟器相同的设备版本上运行测试。因此,我失去了3天的工作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.