O selênio pode avaliar todos os elementos XPath?
Pergunta
É possível para o selênio avaliar todos os elementos que podem corresponder a um certo XPath
?
Por exemplo, eu gostaria de avaliar se tudo caixas de seleção são verificados com //input[type='checkbox']
-Problema é que eu só recebo um elemento devolvido.
Solução
Você pode usar o comando getxPathCount para determinar o número de elementos correspondentes. Em seguida, você pode percorrer -los usando um incremento para localizar cada elemento individualmente. O exemplo Java (Testng/Junit) a seguir verifica se todas as caixas de seleção em uma página são verificadas:
int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue();
for (int i = 1; i < totalCheckboxes+1; i++) {
assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]"));
}
Outras dicas
Eu tentei a abordagem acima e o selênio estava lançando exceções de que o elemento não foi encontrado. Advogando o prefixo xpath = resolveu o problema.
exemplo
xpath=(//td[@class='cell name bold'])[1]
xpath=(//td[@class='cell name bold'])[2]
Com
/descendant::input[@type='text'][1]
/descendant::input[@type='text'][2]
você só pode procurar por tudo elementos de entrada na árvore. Não funcionará se você quiser apenas analisar uma subárvore.
Uma maneira melhor é:
(/form/div/input[@type='text'])[1]
(/form/div/input[@type='text'])[2]
que retornará o resultado nº 1, #2 etc. da expressão XPath dentro dos colchetes.
Claro que você também poderia fazer
(//input[@type='text'])[1]
Isso é bastante útil, pois o Selênio usa a primeira partida e não pode lidar com um conjunto de resultados, que é o que o XPath geralmente retorna.
Não há como o selênio avaliar uma lista de itens retornados por um localizador. Ele apenas pega o primeiro e faz coisas com ele.
Dave Answer é a melhor alternativa para o que você está procurando.
Estou tentando fazer exatamente a mesma coisa em Selenium e tentei usar o exemplo de @Dave-Hunt, mas é um método incorreto para encontrar um elemento individual em uma coleção.
Considere o seguinte exemplo:
<form>
<div>
<input type="text" name="field1" />
</div>
<div>
<input type="text" name="field2" />
</div>
</form>
Se você usar uma expressão como:
//input[@type='text'][1]
Isso retornará todas as entradas de texto na página. Por quê? Porque cada entrada é o primeiro elemento correspondente em sua própria árvore.
No entanto, se você usar uma expressão como:
/descendant::input[@type='text'][1]
ou
/descendant::input[@type='text'][2]
A primeira expressão pegará a primeira entrada e a segunda expressão pegará a segunda entrada. É muito importante que você use um único "/" e não um duplo "//".