Test del selenio con ID elemento generato dinamicamente: selettori XPATH o CSS?

0

Background: sono uno stagista con l'incarico di imparare il selenio; la mia organizzazione prevede di sottoporre QA / Test a semplificare i test. Utilizziamo JSF e WebSphere Application Server.

Uno dei problemi persistenti che io (e altri utenti) ho avuto con l'utilizzo di Selenium è l'identificazione di elementi di input che hanno attributi ID generati dinamicamente. In parole povere, non so come vengono generati gli ID o quando cambiano, quindi l'hard-coding degli ID nel test case è giusto.

Fortunatamente, ho trovato due soluzioni al problema. Non sono sicuro di quale sia il migliore, e di conseguenza non sono sicuro di quale consiglio.

1) Potrei usare XPATH per localizzare l'elemento. Gli sviluppatori usano quasi sempre l'attributo ID quando scrivono l'html e mentre JSF lo riassegna nella pagina renderizzata, la sottostringa assegnata dallo sviluppatore è sempre (AFAIK) una parte dell'ID generato da JSF. Ad esempio:

<input id="name"...>

sarà reso come qualcosa di simile:

<input id="j_id1234567:name"...>

Tuttavia, una ricerca usando XPATH può produrre falsi positivi. Potrebbe anche non rimanere stabile se un dev cambia l'ID o se l'algoritmo di generazione dell'ID cambia.

2. (Consigliato da un amico che lavora effettivamente con il selenio) Creare classi CSS vuote per gli elementi di input, poiché i selettori CSS possono essere utilizzati per individuare un elemento nel selenio., ad es.

<input id = "name"... class="... qa_name">

dove .qa_name è vuoto, quindi usa driver.findElement.(By.cssSelector(".qa_name")) per individuare.

Se crei una classe per elemento testato, hai un modo deterministico per identificare l'elemento desiderato. Ciò che mi preoccupa di questo è che

  • Non so se questo creerà un sovraccarico durante il caricamento della pagina.
  • La webapp utilizzata per questo ha un sacco di campi di input.
  • Dev probabilmente non sarà entusiasta di dover creare un gruppo di CSS personalizzati per ogni pagina.
  • Questo non sembra un uso corretto dei CSS. Avevo l'impressione che il CSS fosse puramente per lo styling, non dando informazioni su un elemento.

Uno di questi metodi è più valido dell'altro o entrambi sono validi? Inoltre, le mie preoccupazioni su questi metodi sono valide?

    
posta Steve J 10.08.2015 - 17:54
fonte

2 risposte

2

Mi concentrerei sulla ricerca della porzione stabile di ID . Puoi usare i selettori CSS per farlo.

driver.findElement(By.cssSelector("input[id^='j_id']");

Si legge che trova un tag INPUT con ID che inizia con (^) j_id . Puoi anche cercare estremità con ($) o contiene (*).

Ulteriori informazioni su Selettori CSS

    
risposta data 20.09.2015 - 06:16
fonte
0

Per prima cosa, devi identificare se potrebbe esserci qualche logica negli ID di cui semplicemente non sei a conoscenza. Tu dichiari che Simply put, I don't know how the ID's are generated or when they change che mi fa pensare che ci possa essere una logica per questi ID di cui semplicemente non sei a conoscenza. Poiché questi ID sono più probabili quando si inviano dati (probabilmente funzioneranno come chiavi nella gestione dei dati POST), ci sono buone probabilità che siano deterministici.

Se i tuoi ID sono davvero dinamici, devi andare in questa direzione nell'altro modo. Diciamo che hai un modulo di input generato dinamicamente per un questionario. Se pensi al modo in cui un utente dovrebbe compilare questo modulo, non "inseriscono John Doe nel campo con id fld_name". Invece, vedranno un elemento etichettato 'Inserisci il tuo nome completo' con una casella di testo lungo il lato e inserire il loro nome completo in quella casella di testo. Scrivi il test in questo modo: cerca il logico 'raggruppamento' di elementi (come una riga della tabella contenente un'etichetta con il testo 'Inserisci il tuo nome completo') e da quel livello, determina dove devi andare (la casella di testo che è presente nella riga della tabella)

I CSS possono essere utili come selettori, ma in realtà dovrebbero essere usati solo per identificare gli oggetti secondo il loro stile. Aggiungere CSS in modo specifico per i test dell'interfaccia utente può essere facilmente sostituito aggiungendo un attributo cruscotto dati che è semanticamente più chiaro e molto meno soggetto a modifiche.

    
risposta data 19.11.2015 - 13:09
fonte

Leggi altre domande sui tag