2010-09-06 55 views
14

Tôi đang cố gắng kiểm tra sự hiện diện của UIAlertView với UIAutomation nhưng trình xử lý của tôi không bao giờ được gọi.Xử lý cảnh báo với UIAutomation

Vào đầu javascript của tôi viết:

UIATarget.onAlert = function onAlert(alert) { 
    UIALogger.logMessage("alertShown"); 
    return false; 
} 

Như tôi hiểu nó, ngay sau khi tôi xác định chức năng onAlert của tôi, nó nên được gọi khi một alertView xuất hiện trong các bài kiểm tra của tôi. Vì vậy, tôi chạy một thử nghiệm cho thấy một alertView, đây là mã cho thấy cảnh báo:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:message message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; 
alertView.accessibilityLabel = @"alerte d'avertissement"; 
[alertView show]; 

tôi chạy thử nghiệm của tôi trong các văn bản, các cảnh báo xuất hiện nhưng xử lý của tôi không bao giờ được gọi. Có ai đã có thể sử dụng xử lý sự kiện với UIAutomation?

Cảm ơn, Vincent.

Trả lời

19

Tài liệu có vẻ sai. Nó chỉ ra rằng cảnh báo được xử lý trên cùng một chủ đề kịch bản của bạn cố gắng để chạy. Vì vậy, nếu bạn muốn trình xử lý cảnh báo được gọi, bạn cần phải ngủ, ví dụ:

UIATarget.onAlert = { ... } 
window.buttons().triggerAlertButton.tap(); 
UIATarget.localTarget().delay(4); 

Ngoài ra, có vẻ như tên và giá trị của cảnh báo luôn được đặt thành rỗng. Tuy nhiên, tôi có thể truy cập vào văn bản tĩnh đầu tiên chứa tiêu đề của cảnh báo.

+0

Trong nhiều trường hợp khi yếu tố không có tên cụ thể nhưng có văn bản tĩnh bên trong, văn bản này có thể được sử dụng như tên tài sản ... cho tôi mà làm việc cho các nút, xem, bảng .... – yoosiba

+2

hi, im cũng có cùng một vấn đề. u có thể tel cho tôi làm thế nào để u nhận được txt tĩnh từ alertview? cảm ơn trước – cancerian

+1

@cancerian bên trong hàm gọi lại 'onAlert', hãy thử' alert.logElementTree() '. Từ đó, tôi thấy rằng 'alert.name()' là 'title' và' alert.elements() [2] .name() 'là' message' của nó. – ma11hew28

0

Tôi cũng gặp vấn đề "không bao giờ được gọi là xử lý cảnh báo". Chỉ cần khởi động lại công cụ của Apple đã giải quyết nó cho tôi :-).

4

Mã bên dưới hoạt động cho tôi. Chức năng đang xử lý cảnh báo và "Cảnh báo hiển thị" được in trên nhật ký.

var target = UIATarget.localTarget(); 
var application = target.frontMostApp(); 
var window = application.mainWindow(); 

UIATarget.onAlert = function onAlert(alert){ 
    UIALogger.logMessage("alert Shown");  
} 

target.frontMostApp().mainWindow().tableViews()[0] 
    .cells()["Fhgui"].buttons()["Images"].tap(); 
// Alert detected. Expressions for handling alerts 
// should be moved into the UIATarget.onAlert function definition. 
target.frontMostApp().alert().defaultButton().tap(); 
6

Đảm bảo tập lệnh Tự động hóa giao diện người dùng vẫn chạy khi chương trình UIAlertView hiển thị.

Ví dụ: thêm dòng sau vào cuối tập lệnh sẽ tiếp tục chạy cho đến khi có thể truy cập cảnh báo hoặc thời gian gia hạn cho độ phân giải đối tượng hết hạn.

// Wait for UIAlert to appear so that UIATarget.onAlert gets called. 
target.frontMostApp().alert(); 

tôi figured này ra bằng cách đọc kỹ lưỡng & hiểu Instruments User Guide: Automating UI Testing, mà tôi khuyên bạn nên làm như một giới thiệu về giao diện người dùng tự động hóa.

Nó cũng có thể hữu ích để xem xét các UIATarget Class Reference, đặc biệt là phương pháp popTimeout, pushTimeout, setTimeout, timeout, và delay.

+0

Điều này đã khắc phục được sự cố của tôi. Gọi '.alert()' sẽ đợi đến 5 giây (theo mặc định, có thể cấu hình với 'target.setTimeout') để nó hiển thị. –

0

ví dụ: - onAlert không được gọi

var target = UIATarget.localTarget(); 
target.buttons()["ShowAlert"].tap() 
UIAtarget.onAlert = function onAlert(alert) 
{...} 

-

ví dụ - onAlert được gọi

var target = UIATarget.localTarget(); 
UIAtarget.onAlert = function onAlert(alert) 
{......} 
target.buttons()["ShowAlert"].tap() 

hoặc

#import "onAlert.js" 
var target = UIATarget.localTarget(); 
target.buttons()["ShowAlert"].tap() 

Hãy thử nó ra.

3

@vdaubry giải pháp rất đơn giản.

Theo tài liệu của Apple, nếu bạn muốn xử lý các cảnh báo bằng tay thì bạn nên trở true thay vì false trong onAlert(alert)

UIATarget.onAlert = function onAlert(alert) { 
    UIALogger.logMessage("alertShown"); 
    return true; 
} 

@Drew Crawford sự chậm trễ sẽ không làm việc vì theo mặc định nút có thể được nhấp bởi giao diện người dùng Tự động hóa. Tài liệu không sai nhưng không được giải thích rõ ràng.

0

đoạn sau làm việc cho tôi trên XCode 6.3.1 & Instruments (6.3.1 (6D1002)):

var target = UIATarget.localTarget(); 

    // Following line shows an internal alert with 'Cancel' & 'Continue' buttons 
    target.frontMostApp().mainWindow().buttons()["ShowAlert"].tap(); 

    // Handle an internal alert 
    UIATarget.onAlert = function onAlert(alert) { 
      return true; 
    } 

    // Perform Tap on alert. 
    target.frontMostApp().alert().buttons()["Continue"].tap(); 
Các vấn đề liên quan