Tôi có tập lệnh sau để nhập '33' vào Máy tính, trong Android, sử dụng UiAutomator. Tuy nhiên, chỉ chấp nhận '3' đầu tiên, báo chí thứ hai hoàn toàn bị bỏ qua.Làm thế nào để nhấn một nút hai lần bằng cách sử dụng Google UiAutomator?
import com.android.uiautomator.core.*;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
public class MyFirstUiAutomatorTest extends UiAutomatorTestCase {
UiObject getByDescription(String description) {
return new UiObject(new UiSelector().description(description));
}
UiObject getByText(String description) {
return new UiObject(new UiSelector().text(description));
}
UiObject scrollableGetByText(String text) throws UiObjectNotFoundException {
UiScrollable uiScrollable = new UiScrollable(new UiSelector().scrollable(true));
uiScrollable.setAsHorizontalList();
return uiScrollable.getChildByText(new UiSelector().className(
android.widget.TextView.class.getName()),
text);
}
public void testStuff() throws UiObjectNotFoundException {
getUiDevice().pressHome();
getByDescription("Apps").clickAndWaitForNewWindow();
getByText("Apps").click();
scrollableGetByText("Calculator").clickAndWaitForNewWindow();
// pressing '+' and '=' effectively clears the previous input
getByText("+").click();
getByText("=").click();
getByText("3").click();
// this second '3' is ignored
getByText("3").click();
}
}
Tôi đã thử thêm một giấc ngủ trong 2 giây sau khi nhấp chuột đầu tiên, bằng cách thực hiện:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
... nhưng điều đó không thay đổi bất cứ điều gì.
Tôi cũng cố gắng nhấp chuột vào một nút khác nhau, ở giữa 2 '3 của, ví dụ:
new UiObject(new UiSelector().text("3")).click();
new UiObject(new UiSelector().className("android.widget.EditText")).click();
new UiObject(new UiSelector().text("3")).click();
... nhưng điều đó không làm việc, hoặc.
Ý tưởng?
(Lưu ý: sử dụng Android 4.1.2, trong một AVD; chạy trên Ubuntu Linux 12.04)
Edit, sau quan sát Rami, tôi thử như sau, để tái sử dụng các đối tượng UiObject cùng cho một yêu cầu thứ hai cho cùng mô tả:
HashMap<String,UiObject> objectByText = new HashMap<String,UiObject>();
UiObject getByText(String description) {
if(objectByText.containsKey(description)) {
System.out.println("" + objectByText.get(description));
return objectByText.get(description);
}
System.out.println("Created new object for [" + description + "]");
UiObject object = new UiObject(new UiSelector().text(description));
objectByText.put(description, object);
System.out.println("" + object);
return object;
}
... nhưng nó đã không làm việc, mặc dù nó được tái sử dụng rõ ràng cùng UiObject mỗi lần, vì nó chỉ nói 'tạo đối tượng mới cho [3]' một lần.
Sau đó, tôi đã cố gắng UiDevice.click() 'lừa', bằng cách tạo ra một chức năng nghe tiếng 'click' như sau, một lần nữa, sau những quan sát Rami của:
void click(UiObject target) throws UiObjectNotFoundException {
Rect rect = target.getBounds();
System.out.println("rect: " + rect);
getUiDevice().click(rect.centerX(), rect.centerY());
}
Tuy nhiên, điều này không làm việc cho tôi, hoặc : chỉ lần đầu tiên '3' xuất hiện và thứ hai bị bỏ qua, mặc dù cả hai lần nhấp đều rõ ràng ở cùng một vị trí, bởi vì các vị trí đầu ra rect:
giống hệt nhau. Nếu tôi nhấp vào '3' hai lần theo cách thủ công, sử dụng chuột trên máy tính để bàn của riêng tôi, thì cả 3 đều xuất hiện ok.
Tôi cũng đã thử thêm hai giây Thread.sleep()
giữa các lần nhấp và vẫn chỉ xuất hiện một '3' duy nhất cho tôi.
này nghe có vẻ giống như một cách giải quyết tuyệt vời, nhưng tôi đã thử nó ngay bây giờ, và nó không làm việc cho tôi. Nếu tôi nhấp vào nút '3' theo cách thủ công hai lần, thì tôi thấy '33', nhưng nếu tôi sử dụng UiAutomator để sử dụng 'getUiDevice(). Click()' để nhấp hai lần vào cùng một vị trí, thì tôi vẫn chỉ thấy một ' 3 '. Điều này, ngay cả khi tôi thêm 'Thread.sleep (2000)' vào giữa hai lần nhấp chuột. –
Tôi đã tạo một phương thức gọi là 'setUpDigit()' trong đó tôi thiết lập UIobject 'UiObject zero = new UiObject (new UiSelector(). Văn bản (" 0 "));' và tôi có một giá trị toàn cục Rzero được thiết lập trong cùng phương thức setUpDigit() 'Rzero = zero.getBounds();' Sau đó, tôi có một công tắc sẽ sử dụng giá trị toàn cục Rzero và nhấn vào nút bên phải 'getUiDevice(). click (Rzero.centerX(), Rzero.centerY()); 'Phần khó khăn là khi gọi setUpDigit(). Nó cần phải được gọi khi bạn có máy tính hoặc cho tôi tạo ra báo động trên màn hình. –