J'ai le script suivant pour taper '33' dans la calculatrice, dans Android, en utilisant UiAutomator. Cependant, seul le premier '3' est accepté, la deuxième pression est entièrement ignorée.
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();
}
}
J'ai essayé d'ajouter une mise en veille pendant 2 secondes après le premier clic, en faisant :
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
... mais cela n'a rien changé.
J'ai également essayé de cliquer sur un bouton différent, entre les 2 '3', c'est-à-dire :
new UiObject(new UiSelector().text("3")).click();
new UiObject(new UiSelector().className("android.widget.EditText")).click();
new UiObject(new UiSelector().text("3")).click();
... mais ça n'a pas marché non plus.
Des idées ?
(Note : utilisation d'Android 4.1.2, dans un AVD ; fonctionnement sur Ubuntu linux 12.04)
Edit, suite aux observations de Rami, j'ai essayé ce qui suit, pour réutiliser le même objet UiObject pour une deuxième demande pour la même description :
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;
}
... mais cela n'a pas fonctionné, même s'il est clair que le même UiObject est réutilisé à chaque fois, car il n'est indiqué qu'une seule fois "Created new object for [3]".
J'ai ensuite essayé le "truc" UiDevice.click(), en créant une fonction "click" comme suit, en suivant les observations de Rami :
void click(UiObject target ) throws UiObjectNotFoundException {
Rect rect = target.getBounds();
System.out.println("rect: " + rect );
getUiDevice().click(rect.centerX(), rect.centerY());
}
Cependant, cela n'a pas fonctionné pour moi non plus : seul le premier "3" apparaît, et le second est ignoré, même si les deux clics sont clairement au même endroit, parce que l'élément "3" n'a pas été utilisé. rect:
Les emplacements de sortie sont identiques. Si je clique deux fois sur '3' manuellement, en utilisant ma propre souris de bureau, les deux 3 apparaissent correctement.
J'ai aussi essayé d'ajouter une seconde Thread.sleep()
entre les clics, et toujours un seul '3' est apparu pour moi.