首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xcode UITest中的PageControl

Xcode UITest中的PageControl
EN

Stack Overflow用户
提问于 2017-11-11 23:00:00
回答 2查看 1.6K关注 0票数 4

我有一个应用程序,其中一个页面控件是用来指示多个屏幕。当用户点击页面控件(例如:在当前所选页面的右侧)时,滚动视图将滚动到下面的屏幕。它工作得很好。

我想为这个场景编写一个UI测试。我发现我不能点击特定的页面控件“点”来触发该操作。我可以检查的是页面控件是否存在,以及当前选择的页面是否存在。

另一个问题是,即使我能够这样做,我如何检查滚动视图已经滚动?我只能访问滚动视图的框架,而不能访问它的边界。

我刚刚开始使用Xcode UITest,它让我很失望。我认为它现在应该很强大了(它是由Xcode7引入的,之前作为UI Automation可用),但看起来还不是。

我将恢复到单元测试+手动功能测试。如果任何人有其他想法,请分享。

EN

回答 2

Stack Overflow用户

发布于 2017-11-12 00:20:13

不要这么快就放弃,Xcode UITest有时可能会让人沮丧,但一旦你找到了要使用的技巧,它们就会变得非常强大:

你可以这样测试你的UIPageControl:

代码语言:javascript
复制
func testPageIndicator() {
    let app = XCUIApplication()
    app.launch()

    let scrollView = app.scrollViews.element(boundBy: 0)
    let pageIndicator = app.pageIndicators.element(boundBy: 0)

    // test that page indicator is updated when user scrolls to page 2
    scrollView.swipeLeft()
    XCTAssertEqual(pageIndicator.value as? String, "page 2 of 3")

    // test that scrollview scrolls to page 3 when user taps right of the current page in page indicator
    pageIndicator.coordinate(withNormalizedOffset: CGVector(dx: 0.9, dy: 0.2)).tap()
    XCTAssert(app.otherElements["page_3"].waitForExistence(timeout: 2))
    XCTAssertFalse(app.otherElements["page_2"].exists)
    XCTAssertEqual(pageIndicator.value as? String, "page 3 of 3")
}

您可以使用coordinate方法告诉测试在哪里点击UIElement。您将一个CGVector对象传递给该方法,该对象描述了点击的位置。

例如,CGVector(dx: 0.9, dy: 0.2)告诉测试在元素宽度的90%和高度的20%处点击元素。

您可以使用它在UIPageIndicator中点击当前页面的左侧或右侧(参见上面的代码示例)

要测试您是否在UIScrollView中的正确页面上,可以将每个页面的accessibilityIdentifier设置为一个惟一的字符串,然后在点击页面控件后断言具有该标识符的UIElement存在。

在我的例子中,页面是3个UIViews。我将它们的accessibilityIdentifier设置为"page_1“、"page_2”和"page_3“,然后断言"page_3”存在,而"page_2“不存在。

票数 7
EN

Stack Overflow用户

发布于 2018-10-02 17:58:14

这是一个我用来获取页数和当前页面的扩展。它使用正则表达式在字符串value中查找两个数字,并假设较大的数字是页数,较小的数字是当前页面。

它的好处是即使你的设备/模拟器不是用英语设置的,它也能工作。

代码语言:javascript
复制
extension XCUIElement {

    func currentPageAndNumberOfPages() -> (Int, Int)? {
        guard elementType == .pageIndicator, let pageIndicatorValue = value as? String else {
            return nil
        }
        // Extract two numbers. This should be language agnostic.
        // Examples: en:"3 of 5", ja:"全15ページ中10ページ目", es:"4 de 10", etc
        let regex = try! NSRegularExpression(pattern: "^\\D*(\\d+)\\D+(\\d+)\\D*$", options: [])
        let matches = regex.matches(in: pageIndicatorValue, options: [], range: NSRange(location: 0, length: pageIndicatorValue.count))
        if matches.isEmpty {
            return nil
        }
        let group1 = matches[0].range(at: 1)
        let group2 = matches[0].range(at: 2)
        let numberString1 = pageIndicatorValue[Range(group1, in: pageIndicatorValue)!]
        let numberString2 = pageIndicatorValue[Range(group2, in: pageIndicatorValue)!]
        let number1 = Int(numberString1) ?? 0
        let number2 = Int(numberString2) ?? 0
        let numberOfPages = max(number1, number2)
        var currentPage = min(number1, number2)
        // Make it 0 based index
        currentPage = currentPage > 0 ? (currentPage - 1) : currentPage
        return (currentPage, numberOfPages)
    }

    /// return current page index (0 based) of an UIPageControl referred by XCUIElement
    func currentPage() -> Int? {
        return currentPageAndNumberOfPages()?.0 ?? nil
    }

    /// return number of pages of an UIPageControl referred by XCUIElement
    func numberOfPages() -> Int? {
        return currentPageAndNumberOfPages()?.1 ?? nil
    }
}

你可以像这样使用它:

代码语言:javascript
复制
let pageCount = app.pageIndicators.element(boundBy: 0).numberOfPages() ?? 0
for _ in 0 ..< pageCount {
    app.pageIndicators.element(boundBy: 0).swipeLeft()
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47239274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档