Il selenio può valutare tutti gli elementi XPath?
Domanda
È possibile per il selenio valutare tutti gli elementi che possono corrispondere a un certo XPath
?
Ad esempio, vorrei valutare se tutte le caselle di controllo sono selezionate con // input [type = 'checkbox']
- il problema è che ne ottengo solo una elemento restituito.
Soluzione
È possibile utilizzare il comando getXpathCount per determinare il numero di elementi corrispondenti. È quindi possibile eseguire il ciclo attraverso di essi utilizzando un incremento per individuare ogni elemento singolarmente. Il seguente esempio Java (TestNG / JUnit) verificherebbe che tutte le caselle di controllo su una pagina siano selezionate:
int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue();
for (int i = 1; i < totalCheckboxes+1; i++) {
assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]"));
}
Altri suggerimenti
Ho provato l'approccio sopra e il selenio generava eccezioni che l'elemento non è stato trovato. L'aggiunta del prefisso xpath = risolto il problema.
esempio
xpath=(//td[@class='cell name bold'])[1]
xpath=(//td[@class='cell name bold'])[2]
Con
/descendant::input[@type='text'][1]
/descendant::input[@type='text'][2]
puoi solo cercare tutti gli elementi di input nella struttura. Non funzionerà se vuoi solo analizzare una sottostruttura.
Un modo migliore è:
(/form/div/input[@type='text'])[1]
(/form/div/input[@type='text'])[2]
che restituirà il risultato # 1, # 2 ecc. dell'espressione XPath tra parentesi.
Naturalmente puoi anche farlo
(//input[@type='text'])[1]
Questo è abbastanza utile in quanto il Selenio usa solo la prima partita e non riesce a gestire un set di risultati, che è ciò che solitamente XPath restituisce.
Non è possibile che il selenio possa valutare un elenco di articoli restituiti da un localizzatore. Prende solo il primo e fa le cose con esso.
La risposta di Dave è la migliore alternativa a ciò che stai cercando.
Sto provando a fare esattamente la stessa cosa in Selenium e ho provato a usare l'esempio di @ dave-hunt, ma è un metodo errato per trovare un singolo elemento in una raccolta.
Considera il seguente esempio:
<form>
<div>
<input type="text" name="field1" />
</div>
<div>
<input type="text" name="field2" />
</div>
</form>
Se usi un'espressione come:
//input[@type='text'][1]
questo restituirà tutti gli input di testo nella pagina. Perché? Perché ogni input è il primo elemento corrispondente all'interno del suo albero.
Tuttavia, se usi un'espressione come:
/descendant::input[@type='text'][1]
o
/descendant::input[@type='text'][2]
la prima espressione prenderà il primo input e la seconda espressione prenderà il secondo input. È molto importante che tu utilizzi un singolo " / " e NON un doppio " // " ;.