Pergunta

Com o ASP.NET, os IDs de tags são bastante voláteis, para tornar meus testes mais robustos, quero localizar elementos pelos textos dos rótulos. Eu joguei um pouco com Watin e isso faz isso perfeitamente, mas esse projeto parece meio morto hoje em dia, então pensei em olhar para o selênio antes de decidir sobre uma estrutura.

Eu tenho html que se parece com isso

<label for="ctl00_content_loginForm_ctl01_username">Username</label>:
<input type="text" id="ctl00_content_loginForm_ctl01_username" />

Eu não quero digitar:

selenium.Type("ctl00_content_loginForm_ctl01_username", "xxx");

Isso depende muito do ID. Em Watin, eu escrevia:

browser.TextField(Find.ByLabelText("Username")).TypeText("xxx");

Existe uma maneira de fazer isso no selênio?

Foi útil?

Solução

Eu acredito que você pode fazer isso com o seguinte:

selenium.Type(selenium.getAttribute("//label[text()='Username']/@for"), "xxx");

O bit text () = 'nome de usuário' recebe o rótulo que você deseja pelo seu inerhtml, então o /@para devolver o valor do seu atributo "para".

Atenção: Isso não é testado (desculpas por isso!), Mas acho que funcionará, com base em algumas ferramentas no plugin IDE

Outras dicas

Isso funciona:

//input[@id=(//label[text()="Username"]/@for)]

Explicação: Como você está procurando a entrada:

//input[@id=("ctl00_content_loginForm_ctl01_username")]

Substitua o "ctl00_content_loginform_ctl01_username" pelo valor do atributo do rótulo:

//label[text()="Username"]/@for

Ok, isso pode ter um ano de idade, mas o que eles ei. Isso selecionará a primeira entrada em um rótulo que contém o texto 'nome de usuário'.

//label[text()='Username']/input

Geralmente prefiro usar contém (), pois acho que alguns navegadores estão adicionando espaços irritantes ao elemento ocasional:

//label[contains(., 'Username')]/input

Observe que a barra única antes da entrada denota que ele parecerá apenas um nível para baixo, onde a barra dupla verificaria todos os níveis no rótulo. Use Xpather para o Firefox para criar e verificar seus XPaths, é muito útil.

Sim, você pode usar os locadores XPath, CSS ou DOM para identificar seu elemento. Neste exemplo, seu XPath pode parecer // Lable [@for = 'ctl00_content_loginform_ctl01_username'] para identificar esse rótulo específico.

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