2012-01-13 38 views
5

tôi có một cái nhìn với cấu trúc sau:như thế nào UIAutomation xác định liệu một UIAElement.isVisible()

GrandView 
-Parent View1 
-Parent View2 
--Child View1 
--Child View2 

xem Đứa trẻ mất gần như tất cả các giới hạn của Parent View2, nhưng vẫn có một số không gian xung quanh các cạnh. Tôi có thể chọn Parent View2 trong trình mô phỏng với trình kiểm tra trợ năng nếu tôi nhấp vào các cạnh. Tôi cũng có thể gõ Parent View2 trong UIAutomation nếu tôi sử dụng:

tapWithOptions({tapOffset:{x:0.15, y:0.95}}); 

Tuy nhiên, các cuộc gọi của tôi để isVisible() luôn luôn trả 0. Tôi hy vọng rằng nếu tôi có thể nhấn vào phần tử hoặc chọn phần tử đó bằng trình kiểm tra trợ năng, nó sẽ trả lại 1.

Làm thế nào để UIAutomation xác định liệu một UIAElement hiển thị?

Trả lời

0

Nếu đó là UIView, nó phải được điều khiển thuộc tính hidden. Nếu đó không phải là chế độ xem và đó là vùng chứa, nó sẽ được điều khiển bởi accessibilityElementsHidden.

Nói chung, bạn không muốn sử dụng điều này cho UIAutomation. Thay vào đó, bất cứ điều gì bạn sẽ làm trên màn hình - trong trường hợp này, một vòi() - tiếp tục và làm điều đó, và để cho hệ thống ném một lỗi nếu nó hết giờ. Nói chung, đây là mô hình bạn muốn theo dõi trong các tập lệnh của bạn thay vì kiểm tra xem có cái gì đó có sẵn trước không. Sine UIAutomation là DOM scripting thông tin UIAccessibility, khi những thứ như chuyển động xem hình ảnh động xảy ra những điều có được ra khỏi đồng bộ. Đôi khi tập lệnh thực thi nhanh hơn so với giao diện người dùng giao diện người dùng và đôi khi ngược lại! waitForInvalid có thể là lối tắt cho giải pháp cho bạn.

Thư viện tuneup.js của Alex Vollmer cho UIAutomation giúp việc viết bài kiểm tra dễ dàng hơn nhiều và dễ mở rộng. https://github.com/alexvollmer/tuneup_js

+0

Tôi thấy nó được điều khiển bởi những thứ khác ngoài 'ẩn' và' AccessibilityElementsHidden', như được ngụ ý bởi câu hỏi của tôi. Tôi muốn khẳng định thuộc tính 'isVisible()' để đảm bảo rằng một thùng chứa có mặt mà không phải kiểm tra nội dung của vùng chứa, điều này có thể thay đổi. –

0

Mọi thao tác bạn thực hiện với phần tử đều hết thời gian chờ. Đây không phải là rõ ràng từ các tài liệu của Apple, nhưng nếu bạn nhìn vào: setTimeout, nó cho chúng ta biết:

Giá trị timeout thiết lập một thời gian ân hạn giải quyết đối tượng. Nếu một đối tượng đại diện cho một phần tử giao diện người dùng có sẵn trong thời gian gia hạn, một nỗ lực được thực hiện để khởi tạo đối tượng đó từ thông tin được giữ lại bởi công cụ.

setTimeout chính nó chỉ thay đổi giá trị mặc định (cũng như nhấn và bật). Những gì bạn thực sự muốn làm là thực hiện hành động của bạn trên quan điểm của bạn, và thất bại về thời gian chờ nếu nó không bao giờ trở nên có sẵn (thời gian chờ mặc định là 5 giây).
Phiên WWDC 2010 "Tự động kiểm tra giao diện người dùng bằng dụng cụ" không đi sâu vào điều này một chút, nó có sẵn trên trang ADC WWDC 2010, với cả video và trang trình bày. Trong trường hợp của bạn, bạn muốn thực hiện tap() trên màn hình của bạn. Nếu vì một lý do nào đó, chế độ xem đó không khả dụng cho UIAutomation trong vòng 5 giây, bạn sẽ thấy ngoại lệ.
Thử nghiệm với việc thay đổi thời gian chờ bằng cách thực hiện:

var oldTimeout = target.timeout(); target.pushTimeout(10);

trước khi mã của bạn, và

target.popTimeout(oldTimeout);

sau.

+0

Nhưng một lần nữa, tôi không thể thực hiện một 'tap()' trên quan điểm của tôi. Tôi chỉ có thể thực hiện một 'tapWithOptions()', như tôi đã đề cập trong câu hỏi của mình. Tuy nhiên, tôi không muốn 'tap()' quan điểm của tôi vì điều đó sẽ khởi tạo các hành động mà tôi không quan tâm. Tôi chỉ muốn biết rằng nó là hiện tại và tappable. –

+0

Sau đó thay vì nhấn(), hãy truy cập một phương thức như tên(). Một lần nữa, bạn đang chờ đợi hành động đó để hết thời gian. Điều bạn đang thực sự tìm kiếm là "chế độ xem này có sẵn trong khoảng thời gian chờ này" hay không. Nếu cuộc gọi đến name() hết giờ, nó sẽ không khả dụng. Nếu chế độ xem của bạn sẽ mất nhiều hơn 5 giây mặc định để có sẵn, hãy sử dụng pushTimeout và popTimeout để kéo dài thời gian chờ. TapWithOptions hoạt động không phải là một bất ngờ, xem là hiện tại nhưng chưa có sẵn để tự động hóa như là một phần của hệ thống phân cấp (tức là giải quyết đối tượng chưa được thực hiện) – quellish

+0

Ý của bạn là "đối tượng chưa được giải quyết"? –

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