Discriminare tra due elementi identici quando sono entrambi “visualizzati” e “abilitati” ma solo uno è effettivamente visibile

Aug 21 2020

Attualmente sto automatizzando i test per un'app nativa e ho alcuni problemi con gli elementi "fantasmi". Per "elementi fantasma" intendo elementi che sono nel codice e tecnicamente nella pagina ma non sono visibili all'utente.

Sto testando utilizzando Android e non so se il problema sarebbe presente anche con iOS.

In poche parole, voglio fare clic sull'elemento X ma invece finisco per fare clic sull'elemento Y che non è visibile all'utente perché X e Y condividono le stesse specifiche (stesso testo, stesso tipo/classe di elemento).

Ho provato a ignorare l'elemento Y utilizzando "isDisplayed()" e "isEnabled()" ma sembra che sia X che Y siano visualizzati e abilitati (anche se solo X è effettivamente visibile all'utente).

C'è un modo per discriminare tra X e Y usando il fatto che uno è visibile all'utente e l'altro no? Se possibile, non voglio chiedere agli sviluppatori di modificare il codice dell'app.

Se aiuta, ecco come l'app è finita con "elementi fantasma":

  1. Le app aprono la pagina 1, la pagina 1 ha l'elemento Y

  2. Le app aprono la pagina 2, la pagina 2 è diversa dalla pagina 1 ma hanno l'elemento X che è uguale all'elemento Y della pagina 1

  3. Ora siamo a pagina 2 ma la pagina 1 non è scomparsa ed è solo "dietro" la pagina 2.

Ho trovato questo e quello che sembra riguardare lo stesso problema, ma non esiste una soluzione su come risolverlo.


PS: sto usando Java ma accetterei risposte in qualsiasi lingua.

Risposte

1 AlexeyR. Aug 21 2020 at 20:37

Credo che l'interfaccia utente abbia una certa gerarchia e normalmente la gerarchia degli oggetti ha una struttura ordinata (come XML). Ciò significa che quando aggiungi un elemento non lo aggiungi solo in un posto casuale ma in un posto specifico. Di solito è la parte superiore o inferiore del contenitore esterno.

Quindi supponi di avere la struttura come questa:

<app>
  <page>
    <element>bottom</element>
  </page>  
  <page>
    <element>top</element>
  </page>  
</app>

Se la nuova pagina aggiunta viene aggiunta in alto, puoi accedervi con/app/page[1]/element

Se la nuova pagina aggiunta viene aggiunta in fondo, puoi accedervi con/app/page[last()]/element