簡體   English   中英

Xcode UITest中的PageControl

[英]PageControl in Xcode UITest

我有一個應用程序,其中使用頁面控件來指示多個屏幕。 當用戶點擊頁面控件時(例如:在當前所選頁面的右側),滾動視圖將滾動到以下屏幕。 工作正常。

我想為這種情況編寫一個UI測試。 我發現我無法點擊特定的頁面控件“點”來觸發該操作。 我可以檢查的是頁面控件是否存在以及當前所選頁面。

另一個問題是,即使我能夠這樣做,如何檢查滾動視圖是否已經滾動? 我只能訪問滾動視圖的框架,而不能訪問其邊界。

我剛剛開始使用Xcode UITest,這讓我失望了。 我認為它現在將很強大(它是Xcode 7引入的,並且以前作為UI Automation可用),但似乎還沒有。

我將回到單元測試+手動功能測試。 如果有人有其他想法,請分享。

不要這么快就放棄,Xcode UITest有時可能會令人沮喪,但是一旦您確定了要使用的技巧,它們就會非常強大:

您可以像這樣測試UIPageControl:

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點擊當前頁面的UIPageIndicator (請參見上面的代碼示例)

要測試您是否在UIScrollView中的正確頁面上,可以將每個頁面的accessibilityIdentifier設置為唯一的字符串,然后在點擊頁面控件后斷言具有該標識符的UIElement存在。

在我的情況下,頁面是3個UIView。 我將其accessibilityIdentifier設置為“ page_1”,“ page_2”和“ page_3”,然后斷言“ page_3”存在,而“ page_2”不存在。

這是我要獲取的頁數和當前頁數的擴展。 它使用正則表達式在字符串value找到兩個數字,並假定較大的一個是頁面數,較小的是當前頁面。

這樣做的好處是,即使您的設備/模擬器未設置為英語,它也可以正常工作。

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
    }
}

您可以像這樣使用它:

let pageCount = app.pageIndicators.element(boundBy: 0).numberOfPages() ?? 0
for _ in 0 ..< pageCount {
    app.pageIndicators.element(boundBy: 0).swipeLeft()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM