Ho il seguente script per digitare "33" nella calcolatrice, in Android, usando UiAutomator. Tuttavia, solo il primo '3' è accettato, la seconda stampa è completamente ignorata.Come premere due volte un pulsante con 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();
}
}
Ho provato ad aggiungere un sonno per 2 secondi dopo il primo scatto, facendo:
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
... ma questo non cambia nulla.
Ho provato anche facendo clic su un pulsante diverso, tra il 2 '3 di, vale a dire:
new UiObject(new UiSelector().text("3")).click();
new UiObject(new UiSelector().className("android.widget.EditText")).click();
new UiObject(new UiSelector().text("3")).click();
... ma che non ha funzionato neanche.
Idee?
(Nota: utilizzare Android 4.1.2, in un AVD; in esecuzione su Ubuntu Linux 12.04)
Edit, a seguito delle osservazioni di Rami, ho provato la seguente, di riutilizzare lo stesso oggetto UIObject per una seconda richiesta per la stessa descrizione:
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;
}
... ma non ha funzionato, anche se è chiaramente riutilizzare lo stesso UIObject ogni tempo, perché si dice solo 'nuovo oggetto creato per [3]' una volta.
poi ho provato l'UiDevice.click() 'trucco', con la creazione di una funzione di 'click' nel seguente modo, ancora una volta, a seguito delle osservazioni di Rami:
void click(UiObject target) throws UiObjectNotFoundException {
Rect rect = target.getBounds();
System.out.println("rect: " + rect);
getUiDevice().click(rect.centerX(), rect.centerY());
}
Tuttavia, questo non ha funzionato neanche per me : viene visualizzato solo il primo '3' e il secondo viene ignorato, anche se entrambi i clic sono chiaramente nella stessa posizione, poiché le posizioni di output rect:
sono identiche. Se faccio doppio clic su "3" manualmente, utilizzando il mio mouse desktop, entrambi i 3 appaiono ok.
Ho anche provato ad aggiungere due secondi Thread.sleep()
tra i clic, e ancora solo un singolo '3' apparve per me.
Questo suona come una grande soluzione, ma ho provato solo ora, e non funziona per me. Se faccio doppio clic sul pulsante "3" manualmente due volte, vedo "33", ma se ottengo UiAutomator per usare 'getUiDevice(). Click()' per fare clic due volte nella stessa posizione, quindi vedo ancora solo una singola ' 3' . Questo, anche io aggiungo un 'Thread.sleep (2000)' tra i due clic. –
Ho creato un metodo chiamato 'setUpDigit()' dove ho impostato il mio UIobject 'UiObject zero = new UiObject (nuovo UiSelector(). Text (" 0 "));' e ho un valore globale Rzero che è impostato in lo stesso metodo setUpDigit() 'Rzero = zero.getBounds();' Allora ho un interruttore che userà il valore globale Rzero e clicchiamo con il tasto destro 'getUiDevice(). click (Rzero.centerX(), Rzero.centerY()); 'La parte difficile è quando chiamare setUpDigit(). Deve essere chiamato quando si ha la calcolatrice o per me la creazione di un allarme sullo schermo. –