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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top