[英]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.