2016-05-17 13 views
7

Tôi có triển khai thực hiện XCTestCase rất đơn giản để kiểm tra một lần nhấn vào nút và mong đợi một Trình điều khiển cảnh báo hiển thị. Vấn đề là phương pháp tap() không hoạt động. Đặt một điểm ngắt trong IBAction của nút liên kết, tôi nhận ra logic thậm chí không được gọi.XCUIElement tap() không hoạt động

class uitestsampleUITests: XCTestCase { 

    var app: XCUIApplication! 

    override func setUp() { 
     super.setUp() 
     continueAfterFailure = false 
     app = XCUIApplication() 
     app.launch() 
    } 

    func testButton() { 
     let button = app.buttons["Button"] 
     button.tap() 

     expectationForPredicate(NSPredicate(format: "exists == 1"), evaluatedWithObject: button, handler: nil) 
     waitForExpectationsWithTimeout(5.0, handler: nil) 
    } 
} 

Ngoài ra, nhân đôi hướng dẫn button.tap() làm cho các đường chuyền kiểm tra, như thế này:

func testButton() { 
     let button = app.buttons["Button"] 
     button.tap() 
     button.tap() 

     expectationForPredicate(NSPredicate(format: "exists == 1"), evaluatedWithObject: button, handler: nil) 
     waitForExpectationsWithTimeout(5.0, handler: nil)  
    } 

Tôi đang phải đối mặt với vấn đề này trong Xcode 7.3.1 Tôi có thiếu cái gì? Nó là một lỗi?

+1

Tôi đã báo cáo lỗi cho Apple: https://openradar.appspot.com/26320475 –

+0

Có thể đó là vấn đề về thời gian không? Điều gì sẽ xảy ra khi bạn thêm thời gian chờ 1 giây trước khi thử nhấn? Thật không may, khuôn khổ tự động hóa giao diện người dùng, đặc biệt là tạo sự kiện, có đầy đủ các vấn đề. – Sulthan

+0

Tôi không sợ. Nó không hoạt động ngay cả khi tôi chờ đợi kỳ vọng này 'expectationForPredicate (NSPredicate (định dạng:" hittable == 1 "), evaluationWithObject: button, handler: nil)' –

Trả lời

8

Vì vậy, một kỹ sư của Apple phản ứng với báo cáo lỗi của tôi nói:

Khả năng thứ hai là bạn đang chạy vào một vấn đề mà đôi khi xảy ra nơi các ứng dụng kết thúc tung ra nhưng màn hình splash doesn không biến mất ngay lập tức và các sự kiện được gửi đến ứng dụng không được xử lý đúng cách.

Để cố gắng giải quyết vấn đề đó, hãy cân nhắc đặt một độ trễ nhỏ tại khi bắt đầu thử nghiệm (ngủ (1) là đủ).

Vì vậy, tôi đã làm điều đó và bây giờ nó hoạt động:

override func setUp() { 
    super.setUp() 
    continueAfterFailure = false 
    app = XCUIApplication() 
    app.launch() 
    sleep(1) 
} 
+1

Đối với tôi, vấn đề được đề cập không nhất thiết phải ngay sau khi khởi chạy ứng dụng. Đó là lý do tại sao giải pháp này sẽ không bao gồm tất cả các trường hợp. –

+0

bạn đã giải quyết vấn đề này chưa? Tôi có cùng một vấn đề plz giúp đỡ nếu bạn giải quyết. –

1

Tôi đã có một cái gì đó tương tự. Đối với tôi, vấn đề là các yếu tố mà tôi đã cố gắng khai thác, đôi khi không phải là hittable vì một số lý do.

Từ tài liệu của Apple:

Gửi một sự kiện tap đến một điểm hittable tính cho phần tử.

Vì vậy, nếu một phần tử không phải là hittable, thao tác nhấn không làm nhiều, vi phạm logic của trường hợp thử nghiệm của bạn.

Để khắc phục điều này, trước khi tôi nhấn vào thứ gì đó, tôi đợi cho đến khi phần tử thích hợp trở thành hittable. Khá đơn giản.

#import <XCTest/XCTest.h> 

@interface XCUIElement (Tap) 

- (void)tapInTestCase:(XCTestCase *)testCase; 

@end 

@implementation XCUIElement (Tap) 

- (void)tapInTestCase:(XCTestCase *)testCase 
{ 
    // wait until the element is hittable 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hittable == true"]; 
    [testCase expectationForPredicate:predicate evaluatedWithObject:element handler:nil]; 
    [testCase waitForExpectationsWithTimeout:5.0f handler:nil]; 

    // and then tap 
    [self tap]; 
} 

@end 
+0

Với câu trả lời tôi nhận được từ Apple, giải pháp của bạn có thể hoạt động. Tuy nhiên, trong mẫu thử nghiệm rất đơn giản, tôi đã cung cấp nút luôn ở đó vì vậy nó không cần phải đợi để có 'hittable' (thử nghiệm sẽ bắt đầu khi UI sẵn sàng). Ngoài ra, tính năng Xcode 'Kiểm tra giao diện người dùng 'của Apple không điền mã cho nút để đợi là' hittable'. Tôi muốn thêm giải pháp 'sleep (1)' cho đến khi họ sửa lỗi này. –

+0

Tuyệt vời, tôi rất vui vì bạn đã có một giải pháp. Nhưng tôi nên nói, nó hoàn hảo. –

+1

Đối với tôi, cả hai giải pháp đều không hoạt động. Đôi khi họ làm, đôi khi không. Vẫn đang tìm kiếm cách nhấn nút chính xác ... Cũng có vấn đề với 'typeText:' –

1

Đối UIWebView đó là hittable, vòi nước không làm việc cho đến khi tôi đã thực hiện nó thông qua phối hợp:

extension XCUIElement { 
    func forceTap() { 
     coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap() 
    } 
} 

Hy vọng nó sẽ giúp ai đó

PS Cũng hoạt động cho các mục không phải là hittable, như nhãn và như vậy.

+0

Đã phải sử dụng điều này khi tôi đang sử dụng một chế độ xem nổi trên màn hình (scrollview trong trường hợp này, mặc dù không biết nếu nó quan trọng). Nó đã được nhìn thấy, và tồn tại nhưng không phải là hittable nên tap() không hoạt động. – sargturner

Các vấn đề liên quan