Ich habe das folgende Skript für die Eingabe von "33" in den Rechner, in Android, mit UiAutomator. Jedoch wird nur die erste "3" akzeptiert, die zweite wird vollständig ignoriert.Wie drücken Sie eine Taste zweimal mit 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();
}
}
Ich habe versucht, für 2 Sekunden nach dem ersten Klick in einen Schlaf hinzufügen, indem Sie:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
... aber das hat nichts ändern.
Ich habe auch versucht, auf einer anderen Schaltfläche klicken, zwischen den 2 ‚3 ist, das heißt:
new UiObject(new UiSelector().text("3")).click();
new UiObject(new UiSelector().className("android.widget.EditText")).click();
new UiObject(new UiSelector().text("3")).click();
... aber das entweder nicht funktioniert hat.
Ideen?
(Anmerkung: mit Android 4.1.2, in einem AVD, läuft auf Ubuntu Linux 12.04)
bearbeiten, folgende Rami Beobachtungen habe ich versucht, die folgenden, für die die gleiche UIObject-Objekt für eine zweite Anforderung wiederzuverwenden gleiche Beschreibung:
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;
}
... aber es hat nicht funktioniert, obwohl es klar ist die gleiche UIObject- jedes Mal wiederverwendet, weil es sagt nur ‚Erstellt neues Objekt für [3]‘ einmal.
Dann habe ich versucht, die UiDevice.click() ‚Trick‘, um eine Funktion ‚Klick‘ wie folgt zu erstellen, wieder Beobachtungen folgende Rami:
void click(UiObject target) throws UiObjectNotFoundException {
Rect rect = target.getBounds();
System.out.println("rect: " + rect);
getUiDevice().click(rect.centerX(), rect.centerY());
}
Dies ist jedoch für mich funktioniert nicht : nur die erste "3" wird angezeigt, und die zweite wird ignoriert, obwohl beide Klicks eindeutig an der gleichen Stelle sind, da die Ausgabestellen rect:
identisch sind. Wenn ich zweimal manuell auf "3" klicke, benutze ich meine eigene Desktop-Maus, dann erscheinen beide 3s ok.
Ich habe auch versucht, eine zwei Sekunden Thread.sleep()
zwischen den Klicks, und immer noch nur eine einzige "3" erschien für mich.
Dieses wie eine große Abhilfe klingt, aber ich habe gerade versucht es jetzt, und es für mich nicht funktioniert. Wenn ich den '3' Button zweimal manuell drücke, dann sehe ich '33', aber wenn ich UiAutomator dazu bringe, 'getUiDevice() zu benutzen, klicke()' um zweimal am gleichen Ort zu klicken, dann sehe ich immernoch einen ' 3'. Dies, sogar ich füge ein 'Thread.sleep (2000)' zwischen den zwei Klicken hinzu. –
Ich habe eine Methode namens 'setUpDigit()' erstellt, in der ich mein UIObject 'UiObject zero = neues UiObject (new UiSelector(). Text (" 0 "));' setze und einen globalen Wert Rzero habe die gleiche Methode setUpDigit() 'Rzero = zero.getBounds();' Dann habe ich einen Schalter, der den globalen Wert Rzero verwenden wird und klicken Sie auf die rechte Schaltfläche 'getUiDevice(). Klicken Sie auf (Rzero.centerX(), Rzero.centerY()); 'Der schwierige Teil ist, wenn Sie setUpDigit() aufrufen. Sie müssen angerufen werden, wenn Sie den Taschenrechner oder für mich die Alarmanlage auf dem Bildschirm haben. –