在 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:) 的转换有关吗?
看看 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 的存在。
如果问题中有不清楚的地方,请发表评论。谢谢
在我的 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,视图也不会变得可点击。
我错过了什么?
这是我在代码中设置它的方式:
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中使用XCTest测试我的应用程序.
有人有例子如何测试UIElement大小?tableView中单元格的高度,或tableView单元格中标签的高度.任何例子将不胜感激.
在Xcode的UI测试,我怎么insertText了UIView符合UIKeyInput?
我创建了一个CodeInputView符合的UIKeyInput。
当我记录自己手动输入代码时,Xcode会写app.typeText("1234")。
但是,当我尝试播放该错误时,出现错误UI Testing Failure-元素和任何后代都不具有键盘焦点。而且,该问题的解决方案均无效。
在用户定义的运行时属性中,将accessibilityIdentifier值设置为browseTabBarButton。
但是,当我尝试UITests使用以下方法访问它时:
app.tabBars.buttons["browseTabBarButton"]
Run Code Online (Sandbox Code Playgroud)
UITabBarItem无法识别。为什么?
我的用户界面中有一些按钮只显示图像而没有标题.如何在UI测试期间访问它们? window.buttons["delete"].click()由于缺少标题,没有找到按钮.我无法设置标题,因为图像具有一定的透明度.
在我的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在第一种情况下找到,而在第二种情况下找不到.
编辑 …
我试图了解如何编写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) xcode-ui-testing ×10
swift ×6
xcode ×5
ios ×4
xcuitest ×2
macos ×1
properties ×1
stub ×1
swift3 ×1
ui-testing ×1
uikeyinput ×1
xcode8 ×1
xcode9 ×1
xctest ×1