标签: xcode-ui-testing

无法在横向模式下点击 (x,y) 坐标

在 Xcode 8 / Swift 3 中,使用坐标(withNormalizedOffset: CGVector)函数与 XCUIElement 交互似乎只能在纵向模式下工作。

为了测试此功能,我创建了一个单屏项目,其中一个按钮位于视图中央。然后我运行了以下 UI 测试:

func testExample() {

    XCUIDevice.shared().orientation = .portrait

    let window = XCUIApplication().windows.element(boundBy: 0)

    let centerPoint = window.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))

    centerPoint.tap()
}
Run Code Online (Sandbox Code Playgroud)

这成功地点击了按钮。但是,如果我在 LandscapeLeft 或 LandscapeRight 中运行相同的测试,则不会点击该按钮。打印坐标的屏幕点显示它在纵向和横向模式下都位于按钮的框架内。

对于 Xcode 7 / Swift 2 中的所有方向,相同的逻辑都是成功的:

func testExample() {

    XCUIDevice.sharedDevice().orientation = .LandscapeLeft

    let window = XCUIApplication().windows.elementBoundByIndex(0)

    let centerPoint = window.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))

    centerPoint.tap()
}
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了什么,或者这是一个合法的框架错误?它与从 Swift 2 中的 CGVectorMake 到 Swift 3 中的 CGVector(dx: dy:) 的转换有关吗?

ios-ui-automation xcode-ui-testing swift3 xcode8

6
推荐指数
1
解决办法
2008
查看次数

在 XCUITests 中,如何等待两个 ui 元素中的任何一个存在

看看 XCTWaiter().wait(...) 我相信我们可以使用这段代码等待多个期望成为现实

let notHittablePredicate = NSPredicate(format: "hittable == false")
let myExpectation = XCTNSPredicateExpectation(predicate: notHittablePredicate, object: element)
let result = XCTWaiter().wait(for: [myExpectation], timeout: timeout)
//for takes array of expectations
Run Code Online (Sandbox Code Playgroud)

但这在提供的期望中使用 AND 之类的。有没有办法在提供的期望中做 OR。

就像我在登录时有一个用例一样,在点击提交后,我想等待两个元素之一。第一个元素是“您已经在另一台设备上登录。如果继续,您另一台设备上的任何未保存数据将丢失?”。第二个元素是登录后的主屏幕。所以任何人都可以出现。目前我首先等待第一个元素,直到超时发生,然后等待第二个元素。但是我想在这里优化时间并在两个元素中的任何一个存在时继续前进==真。然后我将检查 element1 是否存在,然后点击 YES,然后等待主屏幕,否则只需断言 element2 的存在。

如果问题中有不清楚的地方,请发表评论。谢谢

xcode swift xcode-ui-testing xcode9 xcuitest

6
推荐指数
1
解决办法
2995
查看次数

XCUIElement 存在,但不可命中

在我的 UI 测试中,我UIView使用(缩短)以编程方式 创建了一个

let topMarker = UIView.init(frame: CGRect.init())
…
topMarker.accessibilityIdentifier = kTopMarker  
Run Code Online (Sandbox Code Playgroud)

该topMarker视图位于自定义表格视图单元格中。在我的 UI 测试中,我使用

let new1stCell = app.cells.element(boundBy: 0)
let topMarker = new1stCell.otherElements[kTopMarker]
let topMarkerExists = topMarker.waitForExistence(timeout: 15)
XCTAssertTrue(topMarkerExists, "Top marker does not exist")
XCTAssertTrue(topMarker.isHittable, "Top marker is not hittable")
Run Code Online (Sandbox Code Playgroud)

当我设置测试失败断点时,测试在最后一行停止,即topMarker存在,但不可命中。
另一方面,我可以在快照中看到视图,即它存在并且可见。
这很奇怪,因为文档说:

如果元素存在并且可以在其当前位置单击、点击或按下,则 isHittable 返回 true。如果该元素不存在、不在屏幕上或被另一个元素覆盖,则返回 false。

我想,也许它是可见的,但不能被点击、点击或按下,因为userInteractionEnable不是true,但即使我将此属性设置为true,视图也不会变得可点击。

我错过了什么?

xcode xcode-ui-testing

6
推荐指数
1
解决办法
4400
查看次数

UITests:如何通过带有谓词的accessibilityIdentifier找到UIBarButtonItem?

这是我在代码中设置它的方式:

let userBarButtonItem = UIBarButtonItem(image: userIcon, 
                                        style: .Plain, 
                                        target: self, 
                                        action: Selector("userButtonTapped:"))
userBarButtonItem.accessibilityIdentifier = "userBarButtonItem"
Run Code Online (Sandbox Code Playgroud)

然后在里面UITestCase我需要找到这个:

XCUIApplication().otherElements["userBarButtonItem"] //doesnt work, and the reason is:
Run Code Online (Sandbox Code Playgroud)

断言失败:UI测试失败 - 未找到"userBarButtonItem"匹配的其他内容

有没有办法如何使用谓词来找到它?

xcode ios swift xcode-ui-testing

5
推荐指数
1
解决办法
4240
查看次数

XCTest UI测试UIElements大小

我在XCode中使用XCTest测试我的应用程序.

有人有例子如何测试UIElement大小?tableView中单元格的高度,或tableView单元格中标签的高度.任何例子将不胜感激.

ui-testing ios xctest swift xcode-ui-testing

5
推荐指数
1
解决办法
2582
查看次数

Xcode UI测试UIKeyInput typeText

在Xcode的UI测试,我怎么insertText了UIView符合UIKeyInput?

我创建了一个CodeInputView符合的UIKeyInput。

当我记录自己手动输入代码时,Xcode会写app.typeText("1234")。

但是,当我尝试播放该错误时,出现错误UI Testing Failure-元素和任何后代都不具有键盘焦点。而且,该问题的解决方案均无效。

ios uikeyinput swift xcode-ui-testing

5
推荐指数
2
解决办法
1265
查看次数

如何从UITests中访问UITabBarItem?

在用户定义的运行时属性中,将accessibilityIdentifier值设置为browseTabBarButton。

但是,当我尝试UITests使用以下方法访问它时:

app.tabBars.buttons["browseTabBarButton"]
Run Code Online (Sandbox Code Playgroud)

UITabBarItem无法识别。为什么?

xcode ios swift xcode-ui-testing

5
推荐指数
2
解决办法
1252
查看次数

使用Xcode进行UI测试:如何找到没有标题的按钮?

我的用户界面中有一些按钮只显示图像而没有标题.如何在UI测试期间访问它们? window.buttons["delete"].click()由于缺少标题,没有找到按钮.我无法设置标题,因为图像具有一定的透明度.

macos xcode-ui-testing

5
推荐指数
1
解决办法
3055
查看次数

Xcode UITest有时找不到XCUIElement的属性

在我的UI测试中,XCUIElement找到了一些框架属性,但没有找到其他框架属性.
下面使用的可访问性标识符在storyboard中设置,并app在setUp()as中初始化XCUIApplication().

这是故事板布局:

在此输入图像描述

测试中使用的两个UI元素是Text Field和Add Button.

这是相关代码:

func test() {
    // given
    let mainViewNavigationBar = app.navigationBars[„NavBar“]
    let navBarHeight = mainViewNavigationBar.frame.size.height
    print("navBarHeight: \(navBarHeight)") // is printed out correctly

    let addShoppingItemTextField = app.textFields["TextField"]
    let textFieldHeight = addShoppingItemTextField.frame.size.height // error breakpoint here
    print("textFieldHeight: \(textFieldHeight)")
}
Run Code Online (Sandbox Code Playgroud)

测试在第二行的错误断点处停止,并显示以下消息:

No matches found for Find: Descendants matching type TextField from input {(
    Application, 0x60000019f070, pid: 13114, label: ‚xxx‘
)}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么frame应该为所有人定义的属性XCUIElement在第一种情况下找到,而在第二种情况下找不到.

编辑 …

xcode properties xcode-ui-testing xcuitest

5
推荐指数
1
解决办法
6063
查看次数

使用Mockingjay终止HTTP请求不起作用

我试图了解如何编写UI测试,但似乎无法使HTTP存根正常工作。运行测试时,看不到存根中的数据,而是API的数据。

我已经在Xcode 10.2和9.4.1中进行了尝试,所以不是因为它不再在Xcode 10中起作用。

我一定在某处做错了,但我不知道该怎么办。

我创建了一个最小的示例来检查是否是因为我在一个大项目中工作并且有什么干扰,但是那没有用。

您可以在这里找到整个最小项目:https : //github.com/vrwim/TestingTest

在我的viewcontroller中,我有一个简单的tableview设置,它执行API调用,并将结果加载到行中。我有一个UI测试目标,该目标具有一个简单的测试设置,该测试使用Mockingjay存根HTTP请求。

我的API调用代码:

func callSimpleAPI(completionHandler: @escaping ([Patient]?, Error?) -> ()) {
    let url = URL(string: "https://pastebin.com/raw/3PusWbw6")!

    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        DispatchQueue.main.async {
            guard let data = data else {
                completionHandler(nil, error!)
                return
            }

            do {
                let patientResponse = try JSONDecoder().decode(TherapistPatientResponse.self, from: data)
                completionHandler(patientResponse.patients, nil)
            } catch {
                completionHandler(nil, error)
            }
        }
    }
    task.resume()
}
Run Code Online (Sandbox Code Playgroud)

和我的测试代码:

override func setUp() {
    let app = XCUIApplication()
    app.launch()

    stub(everything, …
Run Code Online (Sandbox Code Playgroud)

stub swift xcode-ui-testing

5
推荐指数
1
解决办法
299
查看次数