Kiểm tra giao diện người dùng Xcode - Không thể kiểm tra giao diện người dùng - Không thể cuộn đến hiển thị (bằng hành động AX) khi chạm vào trường Tìm kiếm nút "Hủy"


85

Tôi đang cố gắng loại bỏ trường tìm kiếm bằng cách nhấn vào nút 'Hủy' trong thanh tìm kiếm.

Trường hợp kiểm tra không tìm thấy nút hủy. Nó hoạt động tốt trong Xcode 7.0.1

Tôi đã thêm vị từ để đợi nút xuất hiện. Trường hợp kiểm tra không thành công khi chúng tôi nhấn vào nút "hủy"

let button = app.buttons[“Cancel”]
let existsPredicate = NSPredicate(format: "exists == 1")

expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)

button.tap() // Failing here

nhật ký :

    t =     7.21s     Tap SearchField
t =     7.21s         Wait for app to idle
t =     7.29s         Find the SearchField
t =     7.29s             Snapshot accessibility hierarchy for com.test.mail
t =     7.49s             Find: Descendants matching type SearchField
t =     7.49s             Find: Element at index 0
t =     7.49s             Wait for app to idle
t =     7.55s         Synthesize event
t =     7.84s         Wait for app to idle
t =     8.97s     Type 'vinayak@xmd.net' into
t =     8.97s         Wait for app to idle
t =     9.03s         Find the "Search" SearchField
t =     9.03s             Snapshot accessibility hierarchy for com.test.mail
t =     9.35s             Find: Descendants matching type SearchField
t =     9.35s             Find: Element at index 0
t =     9.36s             Wait for app to idle
t =     9.42s         Synthesize event
t =    10.37s         Wait for app to idle
t =    10.44s     Check predicate `exists == 1` against object `"Cancel" Button`
t =    10.44s         Snapshot accessibility hierarchy for com.test.mail
t =    10.58s         Find: Descendants matching type Button
t =    10.58s         Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.58s     Tap "Cancel" Button
t =    10.58s         Wait for app to idle
t =    10.64s         Find the "Cancel" Button
t =    10.64s             Snapshot accessibility hierarchy for com.test.mail
t =    10.78s             Find: Descendants matching type Button
t =    10.78s             Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.79s             Wait for app to idle
t =    11.08s         Synthesize event
t =    11.13s             Scroll element to visible
t =    11.14s             Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003

@ Joe Masilotti có ý kiến ​​gì không?
Vinpai

Chỉ là một kiểm tra sự tỉnh táo, nhưng nút Hủy trên màn hình hay nó cần phải được cuộn đến? Tôi biết vẫn còn vấn đề trong đó việc cuộn đến các phần tử không phải lúc nào cũng hoạt động.
Joe Masilotti

Nút hủy @JoeMasilotti hiển thị trên màn hình. Nút Hủy là nút mặc định của hệ thống, là một phần của thanh UISearch. Nó hoạt động tốt trong Xcode 7.0.1 khi tôi thực hiện [self.buttons [@ "Cancel"] tap];
Vinpai

1
@Vinpai điều gì sẽ xảy ra khi bạn thêm dấu app.tables.cells.allElementsBoundByAccessibilityElement.counttrước khi nhấn vào nút của mình? Chỉ tò mò - điều này đã giúp 'làm mới' màn hình cho tôi.
bánh ngọt88

@Konnor, tôi đã thử với API mà bạn đã đề xuất, nhưng nó không thành công khi tôi nhấn vào nút Hủy. Khi tôi truy vấn application.buttons trong debugger, nó được hiển thị nút hủy
Vinpai

Câu trả lời:


140

Tôi đoán ở đây nút "Hủy" trả về falsecho thuộc hittabletính, điều đó đang ngăn nó khai thác.

Nếu bạn thấy tap()trong tài liệu, nó nói

/*!
 * Sends a tap event to a hittable point computed for the element.
 */
- (void)tap;

Có vẻ như mọi thứ đã bị phá vỡ với XCode 7.1. Để giữ cho bản thân tôi (và cả bạn nữa;)) không bị chặn khỏi những vấn đề này, tôi đã viết một tiện ích mở rộng XCUIElementcho phép chạm vào phần tử ngay cả khi nó không thể nổi. Sau đây có thể giúp bạn.

/*Sends a tap event to a hittable/unhittable element.*/
extension XCUIElement {
    func forceTapElement() {
        if self.hittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
            coordinate.tap()
        }
    }
}

Bây giờ bạn có thể gọi là

button.forceTapElement()

Cập nhật - Để sử dụng swift 3 sau:

extension XCUIElement {
    func forceTapElement() {
        if self.isHittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0))
            coordinate.tap()
        }
    }
}

Cảm ơn vì đã sửa chữa. Tôi đã gặp phải vấn đề tương tự với cell.tap()và điều này đã khắc phục nó. Có vẻ như có gì đó đã thay đổi trong Xcode7.1 khiến một số phần tử không còn có thể chạy được nữa
francisOpt

Tôi có một tùy chỉnh Navigationbar backButtonItem đó không phải là 'hittable' trong Xcode7.1, và giải pháp này làm việc cho tôiself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex

Cảm ơn - Đã làm việc cho vấn đề tương tự của tôi.
Tache

7
Trong trường hợp của tôi, nó hoạt động khi vòi ở giữa chế độ xem. Thay đổi độ lệch thành (0,5, 0,5). let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Graham Perks

1
công việc tuyệt vời. Tôi gần như bắt đầu giết macbook của mình trước khi tôi thấy điều này.
ChaosSpeeder

11

Đối với tôi, nguyên nhân sâu xa là do các đối tượng tôi muốn chạm vào

  • đã được đặt thành ẩn (và quay lại)
  • đã được gỡ bỏ và gắn lại

Trong cả hai trường hợp, isAccessibilityElementtài sản là falsesau đó. Đặt nó trở lại để truesửa nó.


3
Đây chính xác là vấn đề của tôi. Thật kỳ lạ, nó bắt đầu xảy ra trên iOS 11 (nó hoạt động tốt trên iOS 10).
Ricardo Sanchez-Saez

4

Câu hỏi này xếp hạng tốt cho các truy vấn của Google xung quanh thuật ngữ "Không thể cuộn đến nút hiển thị (bằng hành động AX)" . Với độ tuổi của câu hỏi, tôi có xu hướng nghĩ rằng đây không còn là vấn đề với khung XCUITest như câu trả lời được chấp nhận cho thấy.

Tôi thấy vấn đề này là do sự cố XCElementhiện có, nhưng bị ẩn sau bàn phím phần mềm. Lỗi do khung công tác phát ra vì nó không thể cuộn chế độ xem tồn tại sang chế độ xem có thể chạm được. Trong trường hợp của tôi, nút được đề cập ở phía sau bàn phím phần mềm đôi khi .

Tôi nhận thấy bàn phím phần mềm của Trình mô phỏng iOS có thể bị tắt trong một số trường hợp (ví dụ: trên máy của bạn) và bật ở những người khác (ví dụ: trên CI của bạn). Trong trường hợp của tôi, tôi đã tắt bàn phím phần mềm trên một máy và theo mặc định, nó được bật trên những máy khác.

Giải pháp: Loại bỏ bàn phím trước khi cố gắng nhấn vào các nút có thể nằm sau bàn phím.

Tôi nhận thấy việc chạm vào một nơi nào đó đã loại bỏ bàn phím một cách rõ ràng trước khi chạm vào nút đã giải quyết được vấn đề của tôi trong mọi môi trường.

Tôi đã thêm thêm một số hành động để đưa người trả lời hiện tại resignFirstResponder. Các chế độ xem đằng sau các chế độ xem văn bản của tôi sẽ buộc người phản hồi đầu tiên từ chức, vì vậy tôi nhấn vào đâu đó ngay bên dưới vùng văn bản cuối cùng.

 /// The keyboard may be up, dismiss it by tapping just below the password field
let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1))
pointBelowPassword.press(forDuration: 0.1)

2

Vui lòng kiểm tra đặc điểm của phần tử, tôi đã gặp vấn đề tương tự với TableViewSectionHeader, tôi đã cố gắng khai thác nhưng nó không thành công ở mọi điểm

nhập mô tả hình ảnh ở đây


1

Cách giải quyết của Sandy có vẻ hữu ích trong một thời gian nhưng sau đó không còn nữa - sau đó tôi đã thay đổi nó như thế này:

func waitAndForceTap(timeout: UInt32 = 5000) {
    XCTAssert(waitForElement(timeout: timeout))
    coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}

Điểm chính là vì vấn đề là kiểm tra isHittable ném ra một ngoại lệ, tôi không thực hiện kiểm tra này chút nào và đi thẳng đến tọa độ sau khi phần tử được tìm thấy.


0

Trong trường hợp của tôi, nó có một phần tử giao diện người dùng được lập trình thêm vào bao phủ nút.


0

Nếu đang sử dụng trình mô phỏng AppCenter để chạy thử nghiệm, bạn nên đảm bảo rằng bạn đang chạy thử nghiệm trên cùng một phiên bản thiết bị với trình mô phỏng cục bộ của bạn. Tôi đã mất 3 ngày làm việc vì điều này.


0

Với tinh thần của những thứ có thể bao phủ phần tử của bạn, tôi đã đặt trình gỡ lỗi RN một phần phủ lên trên biểu tượng của mình:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.