Localização de um elemento
Uma das técnicas mais fundamentais a aprender quando se utiliza o WebDriver é a forma de encontrar elementos na página. WebDriver oferece uma série de selectortipos incorporados, entre eles encontrando um elemento pelo seu atributo de ID:
Como se vê no exemplo, a localização de elementos no WebDriver é feita no objecto de instânciaWebDriver
. O findElement(By)
método retorna um outro tipo de objecto fundamental, o WebElement
.
-
WebDriver
representa o browser -
WebElement
representa um nó DOM particular(um controlo, por exemplo, um campo de ligação ou de entrada, etc.)
Após ter uma referência a um elemento web que foi “encontrado”, pode reduzir o âmbito da sua pesquisa usando a mesma chamada naquela instância de objecto:
Pode fazer isto porque ambos os tipos WebDriver e WebElement implementam a interface SearchContext. No WebDriver, isto é conhecido como uma interface baseada em funções. As interfaces baseadas em funções permitem-lhe determinar se uma implementação particulardriver suporta uma determinada característica. Estas interfaces são claramente definidas e tentam aderir a ter apenas uma única função de responsabilidade. Pode ler mais sobre o design do WebDriver e os problemas que são suportados em que controladores na secção Some Other Section WhichMust Be Named.
Consequentemente, a interface By usada acima também suporta uma série de estratégias adicionais de localização. Uma pesquisa aninhada pode não ser a estratégia de localização de queijo mais eficaz, uma vez que requer a emissão de dois comandos separados para o navegador; primeiro pesquisar o DOM para um elemento com ID “queijo”, depois uma pesquisa por “cheddar” num contexto anarrowed.
Para melhorar ligeiramente o desempenho, devemos tentar usar um localizador mais específico: WebDriver suporta a procura de elementos por localizadores CSS, permitindo-nos combinar os dois localizadores anteriores numa única pesquisa:
Localização de múltiplos elementos
É possível que o documento com que estamos a trabalhar possa vir a ter uma lista ordenada dos queijos que mais gostamos:
<ol id=cheese> <li id=cheddar>… <li id=brie>… <li id=rochefort>… <li id=camembert>…</ol>
Desde que mais queijo seja indiscutivelmente melhor, e seria incómodo ter de recuperar cada um dos itens individualmente, um superiortechnique para recuperar queijo é fazer uso da versão pluralizada findElements(By)
. Este método devolve uma colecção de webelements. Se for encontrado apenas um elemento, ele ainda devolverá a acollecção (de um elemento). Se nenhum elemento corresponder ao localizador, a lista anémica será devolvida.
Estratégias de selecção de elementos
Existem oito estratégias diferentes de localização de elementos incorporadas no WebDriver:
Locator | Descrição |
---|---|
nome da classe | Localizações elementos cujo nome de classe contém o valor de pesquisa (não são permitidos nomes de classes compostas) |
css selector | Localiza elementos que correspondem a um selector CSS |
id | |
nome | Localiza elementos cujo atributo NOME corresponde ao valor da pesquisa |
link text | Localiza elementos de âncora cujo texto visível corresponde ao valor da pesquisa |
texto de ligação parcial | Localiza elementos de âncora cujo texto visível contém o valor da pesquisa. Se vários elementos forem correspondentes, apenas o primeiro será seleccionado. |
Localiza elementos cujo nome da etiqueta corresponde ao valor da pesquisa | |
xpath | Localiza elementos correspondência de uma expressão XPath |
Dicas sobre a utilização de selectores
Em geral, se os ID HTML estiverem disponíveis, únicos e consistentemente previsíveis, são o método preferido para a localização de um elemento numa página. Tendem a funcionar muito rapidamente, e renunciam a muito processamento que vem com complicadas travessias de DOM.
Se os IDs únicos não estiverem disponíveis, um selector CSS bem escrito é o método preferido de localização de um elemento. XPath funciona tão bem como os CSSselectores, mas a sintaxe é complicada e frequentemente difícil no momento da compra. Embora os seleccionadores XPath sejam muito flexíveis, normalmente não são testados por fornecedores de navegadores e tendem a ser bastante lentos.
Estratégias de selecção baseadas em linkText e partialLinkText tiveram retrocessos, na medida em que trabalham apenas com elementos de ligação. Além disso, a chamada para XPath selectors internamente em WebDriver.
Tag name pode ser uma forma perigosa de localizar elementos. Há frequentemente múltiplos elementos da mesma tag presentes na página. Isto é mais útil quando se chama o método findElements(By) que devolve uma colecção de elementos.
A recomendação é manter os seus localizadores tão compactos e legíveis quanto possível. Pedir ao WebDriver para atravessar a estrutura do DOM é uma operação dispendiosa, e quanto mais conseguir restringir o âmbito da sua pesquisa, melhor.
Relative Locators
Selenium 4 traz Relative Locators que são previamente chamados Friendly Locators. Esta funcionalidade foi adicionada para o ajudar a localizar elementos que se encontram nas proximidades de outros elementos.Os Localizadores Relativos disponíveis são:
- sobre
- baixo
- àEsquerdaDe
- àDireitaOf
- near
método FindElement aceita agora um novo método withTagName()
que devolve um Localizador Relativo.
Como funciona
Selenium usa a função JavaScriptBoundingClientRect()para encontrar os elementos relativos. Esta função devolve as propriedades de um elemento como a direita, esquerda, fundo, e topo.
Deixe-nos considerar o exemplo abaixo para compreender os localizadores relativos.
p>
above()
Retorna o elemento WebElement, que aparece acima do elemento especificado
below()
Retorna o elemento WebElement, que parecem ser inferiores ao elemento especificado
toLeftOf()
Retorna o WebElement, que aparece à esquerda do elemento especificado
toRightOf()
Retorna o WebElement, que aparece à direita do elemento especificado
near()
Retorna o WebElement, que está no máximo 50px
longe do elemento especificado.