2014-10-02 8 views
5

Sto testando la mia applicazione Android utilizzando il framework Appium. Ho uno schermo Android che non ha id per le sue viste (e non voglio aggiungere ...), quindi ho pensato di usare Xpath.È necessario identificare xpath per l'elemento Android utilizzando l'appio

Questo è come lo schermo appare come in UI Automator Viewer: enter image description here

voglio ottenere tutti i relativi schemi (segnato in rosso - sedici elementi)

Ho provato quanto segue:

List<WebElement> webElementslist = 
mAppDriver.findElementsByXPath("//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.ViewAnimator[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[2]"); 

Ma non ho ricevuto alcun oggetto.

Ho cercato sul Web e ho trovato i prossimi tutorial di xpath, ho provato più opzioni, ma ancora senza successo.

http://www.zvon.org/comp/r/tut-XPath_1.html#intro

http://www.w3.org/TR/xpath/

apprezzerebbe alcun aiuto.

+0

Questo è sembra troppo prolisso, come su qualcosa del genere: '// LinearLayout [TextView]/LinearLayou t/LinearLayout/RelativeLayout'? (Non ho familiarità con XPath in appium però) – har07

+0

Ancora non buono, dandomi zero elementi. Ho provato anche meno dettagliato, senza risultati. –

+0

Se è Io, inizierei con XPath più semplice che restituisce qualcosa, quindi lo aggiorno ulteriormente per restituire solo gli elementi che volevo. '//android.widget.LinearLayout [android.widget.TextView]' o anche '// android.widget.TextView' restituisce qualcosa? – har07

risposta

5

In questo momento c'è un paio di bug fastidiosi con XPath su Android che spiegano i comportamenti che stai vedendo. Essi sono programmati per essere fissato nel 1.3.1 release

  1. Non è possibile cercare per nodi principali .. link
    • Sfortunatamente, questo significa che un XPath verbose è probabile che il XPath (gioco di parole) al successo
  2. a volte si trova 240 di un elemento quando si hanno solo 16 link

Idealmente, si potrebbe cercare la risorsa-id del android.widget.LinearLayout madre di tutte le 16 RelativeLayout s e poi fare qualcosa di simile:

//android.widget.LinearLayout[@resource-id="foo"]/android.widget.RelativeLayout 

La soluzione verbose non ha funzionato perché ti ha dato uno dei layout di una posizione di [2].

Eccolo, fissata:

//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.ViewAnimator[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ScrollView[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.RelativeLayout 

.... si prega, si prega di utilizzare la prima soluzione.

sto cercando una soluzione per il problema utilizzando UiAutomator strategia locator, ma nessuno risponde ancora (perché .fromChild() e .fromParent() sembrano essere rotto)

+1

Grazie per la tua risposta, proverò con la tua prima soluzione, forse risolverà il mio problema. –

+0

Aveva un errore di battitura. Hai bisogno di doppie virgolette attorno al tuo id-risorsa nel localizzatore. Come testate di solito i vostri locatori per Appium? – sheeptest

+0

Di solito sto testando i miei locatori usando resource-id, ma il problema è che questo schermo non è un normale schermo Android, è costruito da json. Quando aggiungo gli ID non riesco a vederli in UI Automator Viewer. Questo è il motivo per cui non voglio aggiungere nulla di nuovo, ma testarlo così com'è. –

1

tenendo presente il fatto che //foo[1] restituisce tutti i nodi che sono foo i primi figli di un genitore (non il primo figlio del nodo foo) provare qualcosa di simile:

//ScrollView/LinearLayout/LinearLayout[2]/LinearLayout/RelativeLayout

non testato, ma dovrebbe darà tutte le RelativeLayouts che sono un figlio di un LinearLayout che è figlio di un LinearLayout che è il secondo figlio di un LinearLayout che è figlio di una ScrollView.

0

Basta provare questo u può facilmente accedere

driver.findElement(By.xpath("//*[@class='android.widget.FrameLayout' and @bounds='[418,564][780,885]']")).click(); 

Screenshot of UI