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?