0

Je suis incapable de trouver un élément (UiObject2) en utilisant UiAutomator dans mon androidTest. J'ai obtenu exemple UIDevice et essayer de trouver l'objet avec ceci:UiAutomator - UiDevice ne peut pas trouverObject par sélecteur (nom du paquet et ID de ressource)

MY_UI_DEVICE.findObject(By.res(CURRENT_PACKAGE, id)); 

CURRENT_PACKAGE est le paquet de mon application MY_UI_DEVICE.getCurrentPackageName(). J'ai essayé aussi avec celui-ci:

MY_UI_DEVICE.wait(Until.findObject(By.res(CURRENT_PACKAGE, id)), 10000); 

Je peux voir l'application est en attente pendant 10 secondes sur l'écran de droite (où l'objet désiré persiste), mais après le délai, il ne parvient pas à trouver et test échoue. Il échoue toujours sur l'émulateur (API 23), mais fonctionne rarement bien sur un périphérique réel (API 25). Quand je débogue le code je pouvais voir que manuellement je pouvais obtenir le bon élément en appelant la séquence de getChild(index) méthodes sur AccessibilityNodeInfo mais dans l'exécution il échoue encore même l'application attend sur le bon écran où j'attends l'élément spécifique .

Je jouais avec les différentes fonctions de UiDevice, mais aucune de ces fonctions n'a aidé et je n'ai plus d'idées, donc toute aide sera appréciée.

Répondre

2

Il y avait 2 problèmes avec mes tests:

  1. Le premier problème était à obtenir/initialisant UiDevice exemple dans le bloc statique (comme un champ statique dans la classe util). Je l'ai déplacé dans @Before et il a aidé à résoudre le problème en partie.
  2. Un autre problème se produisait lors de la recherche d'un élément en utilisant un nom de package obtenu à partir du UiDevice. J'ai remplacé obtenir le paquet avec InstrumentationRegistry.getTargetContext().getPackageName(); comme c'est fait dans google samples.
+0

a rencontré le même problème, a résolu le problème en utilisant le nom du paquet retourné par InstrumentationRegistry.getTargetContext(). GetPackageName() – Qasim

0

Assurez-vous que votre méthode de test lance le UiObjectNotFoundException. J'ai eu ce problème avec UiObject2 aussi bien jusqu'à ce que je commencé à forcer le jet d'erreur

@Test 
public void clockTest() throws UiObjectNotFoundException, InterruptedException { 
    mDevice.click(1146,37); //click on clock top right corner 
    Thread.sleep(1500);//wait 1.5 seconds for screen to load 
    mDevice.click(1138,135);//clicks in shell 
    Thread.sleep(1500);//wait 1.5s for screen to load 

    UiObject2 dTSettingsButton = mDevice.findObject(By.text("Date & Time Settings")); 
    //assertNotNull(dTSettingsButton);//find and assert the settings button 
    dTSettingsButton.clickAndWait(Until.newWindow(), LAUNCH_TIMEOUT);//clicks the settings button 

    UiObject2 timeFormatButton = mDevice.findObject(By.text("Select Time Format")); 
    assertNotNull(timeFormatButton);//find and assert timeformat button 
    timeFormatButton.clickAndWait(Until.newWindow(), LAUNCH_TIMEOUT);//click timeformat button 

    UiObject2 twelveHourButton = mDevice.findObject(By.res("com.REDACTED.settings:id/first_btn")); 
    assertNotNull(twelveHourButton);//find and assert twelvehour button 
    twelveHourButton.clickAndWait(Until.newWindow(), LAUNCH_TIMEOUT);//click twelvehour button 
} 
+0

Merci pour votre commentaire. En fait, le problème est que je ne trouve aucun objet en appelant 'findObject' sur l'instance' UiDevice'. Comment lancer UiObjectNotFoundException peut-il aider? – Luke

+0

Avez-vous utilisé l'outil UiAutomator Viewer pour inspecter l'écran et obtenir l'ID de ressource ou d'autres informations qui vous permettraient d'utiliser 'UiObject' sur' UiObject2'? – Tadhg

+1

Oui, je l'ai fait. L'ID de ressource est correct. Comme je l'ai mentionné, cela fonctionne parfois. Pour un vrai périphérique, cela fonctionne presque toujours, mais pas pour l'émulateur. D'ailleurs, je pense avoir trouvé le problème. J'ai eu l'initialisation de 'UiDevice' dans le bloc statique dans la classe différente (gardé comme champ statique). Quand je l'ai déplacé à la méthode '@ Before' cela fonctionne. Merci pour vos commentaires tho. – Luke