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.

È stato utile?

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 " // " ;.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top