2013-07-16 23 views
12

Tôi đang cố gắng xác định chế độ xem gốc của phần tử ui để tôi có thể điều hướng thông qua giao diện người dùng một cách tự do.Làm thế nào tôi có thể nhận được phụ huynh của một cái nhìn bằng cách sử dụng uiautomator?

Ví dụ, trong ứng dụng Settings, tôi có thể tìm thấy những cái nhìn với dòng chữ "Bluetooth":

UiObject btView = new UiObject(new UiSelector().text("Bluetooth")); 

Bây giờ, phần nơi tôi gặp khó khăn là thế này một: Tôi muốn hướng hai cấp độ và bắt đầu tìm kiếm mới cho nút bật/tắt cho phép và tắt bluetooth.

Lưu ý: Tôi có thể nhận được nút nếu tôi sử dụng mã bên dưới.

UiObject btButtonView = new UiObject(new UiSelector().className("android.widget.Switch").instance(1)); 

Tìm kiếm này cho nút chuyển và trả về lần hiển thị thứ hai. Tôi muốn tìm kiếm chính xác hơn và tìm nút trong bố cục tuyến tính có chứa văn bản "Bluetooth".

UPDATE: Đây là cách bố trí của ứng dụng Settings (phần Bluetooth mà tôi cần):

LinearLayout 
    LinearLayout 
     ImageView 
    RelativeLayout 
     TextView (with text = "Bluetooth") 
    Switch() 

Trả lời

14

Bạn cần tìm hai cấp UiObject lên trước bằng văn bản. Điều này có thể được thực hiện bằng cách sử dụng các phương thức getChildByText() trong UiCollection hoặc UiScrollable. Sau đó, bạn có thể dễ dàng tìm thấy công tắc. Đối với 'Cài đặt', mã này hoạt động trên thiết bị của tôi:

UiScrollable settingsList = new UiScrollable(new UiSelector().scrollable(true)); 
UiObject btItem = settingsList.getChildByText(new UiSelector().className(LinearLayout.class.getName()),"Bluetooth", true); 

UiObject btSwitch = btItem.getChild(new UiSelector().className(android.widget.Switch.class.getName())); 
btSwitch.click(); 
+1

Phương pháp này không hoạt động. Các UiObject hai cấp độ lên là một LinearLayout, nhưng nó không có thuộc tính văn bản. Vì vậy, tôi không thể xác định nó bằng văn bản "Bluetooth". Đã cập nhật câu hỏi với bố cục thực tế của ứng dụng. –

+1

Nó hoạt động. Bạn không xác định bằng văn bản của LinearLayout. "Có vẻ như bất kỳ đứa trẻ nào phù hợp với đối số childPattern có phần tử giao diện người dùng con ở bất kỳ đâu trong phân cấp phụ có thuộc tính văn bản bằng văn bản". Nói cách khác, bạn tìm một LinearLayout có một con với Bluetooth văn bản. – Anders

+0

Có, nó hoạt động. Có vẻ như tôi đã làm điều gì đó sai lần đầu tiên. –

0

Nếu bạn muốn chỉ cần tìm kiếm ON/OFF trượt -> Bạn có thể trực tiếp tìm kiếm bluetooth Nút OFF/ON và nhấp vào nó để tắt/bật bluetooth -

Bạn có thể kiểm tra ảnh chụp màn hình của trang bluetooth (sử dụng lệnh - uiautomatorviewer) trong dấu nhắc lệnh và thấy nút TẮT sẽ có văn bản trong thanh trượt TẮT/BẬT. Sau đó, chỉ cần sử dụng -

new UiObject(new UiSelector().text("OFF")).click(); 
+1

tôi có thể xác định các nút sử dụng các lớp học Tên. Tôi chỉ chọn thể hiện thứ hai của đối tượng ui đó. Tôi muốn tìm kiếm phần tử ui trong chế độ xem chính của phần tử có thể được xác định 100%, bất kể bố cục của tôi là gì tại một điểm. Vì vậy, câu hỏi vẫn là: làm thế nào tôi có thể xác định được phụ huynh của một ui elemen? –

3

Mã bên dưới hoạt động cho tôi.

//Getting the scrollable view 

UiScrollable settingsList = new UiScrollable(new UiSelector().scrollable(true)); 

for (int i=0; i<=settingsList.getChildCount(new UiSelector().className(LinearLayout.class.getName())); i++) { 
//Looping through each linear layout view 
UiObject linearLayout = settingsList.getChild(new UiSelector().className(LinearLayout.class.getName()).instance(i)); 

//Checking if linear layout have the text. If yes, get the switch, click and break out of the loop. 
if (linearLayout.getChild(new UiSelector().text("Bluetooth")).exists()) { 
    UiObject btSwitch = linearLayout.getChild(new UiSelector().className(android.widget.Switch.class.getName())); 
    btSwitch.click(); 
    break; 
    } 
} 
+0

cảm ơn cho Looping thông qua soultion bố trí tuyến tính! làm việc tốt cho tôi! –

0

gần đây đã tìm thấy rằng chúng tôi có thể sử dụng getFromParent (cho UiObject) và fromParent (cho UiSelector) để chọn một chú của đối tượng chẳng hạn. Nếu chúng ta có cách bố trí như vậy:

`LinearLayout 
    relative layout 
     text View 
    relative layout 
     check box` 

chúng tôi có thể nhận được từ ô trống TextView với mã này:

TextViewTitle().getFromParent(new UiSelector() 
      .fromParent(new UiSelector() 
        .resourceId("android:id/checkbox"))); 

nơi TextViewTitle là một Uiobject với quan điểm văn bản

+0

nope, doen't làm việc – 13bit

+0

nhưng chúng tôi có thể sử dụng UiObject2 với BySelector – 13bit

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