2013-02-13 31 views
6

Tôi chỉ muốn kiểm tra giao diện người dùng iOS của mình với Giao diện người dùng tự động hóa nhưng tôi gặp khó khăn khi nhập văn bản vào UITextFields. Tài liệu nói rằng phương thức "setValue (...)" nên thực hiện thủ thuật nhưng không.iOS Instruments Automation "setValue" không hoạt động

tôi luôn luôn nhận được lỗi này:

Script threw an uncaught JavaScript error: Unexpected error in -[UIATextField_0x9952690 setValue:], /SourceCache/UIAutomation_Sim/UIAutomation-271/Framework/UIAElement.m line 1142, kAXErrorSuccess on line 15 of login.js, #0 setValue() 

Mã này trông như thế này:

var textfields = UIATarget.localTarget().frontMostApp().mainWindow().textFields(); 
username = textfields["username"]; 
username.setValue("test"); 

lĩnh vực Tên người dùng không phải là null hoặc không xác định.

Giải pháp thứ hai của tôi là dự án JS này: https://github.com/alexvollmer/tuneup_js#readme Phương thức "typeString" cho trường văn bản nhưng hơi lỗi và không thành công khi nhập số và chữ hoa.

Tôi đang làm việc với iOS6.1, Công cụ phiên bản 4.6 (46000), Phiên bản Xcode 4.6 (4H127).

Mọi trợ giúp đều được đánh giá cao!

+0

Hmm. Tôi có thể thiết lập giá trị của các trường văn bản trong ứng dụng của tôi với UI Automation. Mã tự động hóa của bạn có vẻ chính xác. Tôi nghi ngờ có điều gì đó sai trong thế giới mục tiêu C. Bạn đang sử dụng một lớp con tùy chỉnh của 'UITextField'? Bạn có thể xây dựng một ứng dụng giả với một trường văn bản duy nhất và cố gắng đặt giá trị của trường đó trên máy của bạn không? Điều đó có thể giúp theo dõi vấn đề. –

+1

Trong các dự án khác, hàm "setValue()" hoạt động. Tôi nghĩ rằng vấn đề là do một hình ảnh động chưa hoàn thành. khi người dùng nhấn vào trường văn bản, chế độ xem cơ bản sẽ cuộn lên đầu để hiển thị khi bàn phím hiển thị. "target.delay (1)" thực hiện những gì tôi đang tìm kiếm và bây giờ hàm "setValue()" hoạt động. – ralphbert

Trả lời

10

Kiểm tra xem liệu bên dưới có phù hợp với bạn không,

target.delay (1); UIATarget.localTarget(). FrontMostApp(). MainWindow(). TextFields() ["tên người dùng"]. Tap(); target.delay (1); Giao diện người dùng (UI).

Kiểm tra hệ thống phân cấp đúng nếu nó không làm việc cho bạn ..

+0

Có vẻ như "target.delay (1)" đã thực hiện thủ thuật. Mã của bạn hoạt động tốt cho tôi, cảm ơn bạn! – ralphbert

0

Tôi đến đây gặp khó khăn để hiểu làm thế nào UI Automation kịch bản tác phẩm, vì mã tài liệu và ví dụ ra có thực sự là thiếu (hoặc bằng văn bản của rất quan điểm cụ thể không giải thích tất cả các trường hợp).

Dưới đây là hai điều về đề tài này tôi đã học:

  1. Trước hết, bạn phải cho phép tiếp cận trên phần tử. Tôi đã vô hiệu hóa nó trong các thử nghiệm của tôi và mọi thứ đã hoạt động rất kỳ lạ cho đến khi tôi kích hoạt lại nó (nhận được một "lỗi không mong muốn tương tự" như bạn). Vì vậy, hãy đảm bảo bạn đã bật Trợ năng. Nhưng lưu ý rằng một số mọi thứ vẫn hoạt động với tính năng này đã bị tắt. Ví dụ: bạn vẫn có thể tra cứu phần tử theo tên của nó (accessIdentifier), nhưng bạn sẽ không thể nhấn vào nó hoặc gọi setValue().

enter image description here

  1. Bạn cần phải khai thác thông qua hệ thống phân cấp ứng dụng của bạn. Giả thiết của tôi là việc đưa ra một phần tử là accessibilityIdentifier sẽ cho phép tôi chỉ cần tìm kiếm phần tử với mã định danh đó như mã HTML getElementById của HTML. Nhưng nó là không phải là như thế này cả. Bạn phải đào sâu cấp độ phân cấp của mình theo cấp độ, ngay cả khi sử dụng một trình xác thực trợ năng. May mắn là bạn có thể sử dụng UIAElement.logElementTree() để có được một số manh mối về cấu trúc phân cấp chính xác để sử dụng.

Cho đến nay tôi KHÔNG hề ấn tượng với khuôn khổ này, nhưng tôi chưa bao giờ từ từ tiến bộ.