Selenium locator для <label for = "x" >

С ASP.NET идентификаторы тегов довольно нестабильны, поэтому чтобы мои тесты были более надежными, я хочу найти элементы по их текстам ярлыков. Я играл с WatiN, и он делает это отлично, но этот проект кажется мертвым в наши дни, поэтому я подумал, что я тоже посмотрю в Selenium, прежде чем решиться на рамки.

У меня есть html, который выглядит примерно так.

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

Я не хочу набирать:

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

Это слишком зависит от идентификатора. В WatiN я бы написал:

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

Есть ли способ сделать это в Selenium?

Ответ 1

Я считаю, что вы можете сделать это со следующим:

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

Бит text() = 'Username' получает метку, которую вы хотите, по ее innerHTML, затем/@для возвращает значение своего атрибута "для".

Heads up:, это не проверено (извинения за это!), но я думаю, что это сработает, основываясь на некоторых инструментах в плагине IDE

Ответ 2

Это работает:

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

Объяснение: Поскольку вы ищете ввод:

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

замените "ctl00_content_loginForm_ctl01_username" на значение атрибута метки:

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

Ответ 3

Хорошо, это может быть год, но то, что они эй. Это выберет первый вход под меткой, содержащей текст "Username".

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

Обычно я предпочитаю использовать contains(), поскольку обнаруживаю, что некоторые браузеры добавляют раздражающие пробелы в случайный элемент:

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

Обратите внимание, что одиночная косая черта перед входом означает, что она будет выглядеть только на одном уровне, где двойная косая черта будет проверять все уровни под меткой. Используйте XPather для Firefox для создания и проверки XPaths, это очень полезно.

Ответ 4

Да, вы можете использовать локаторы XPath, CSS или DOM для идентификации вашего элемента. В этом примере ваш XPath может выглядеть как //lable [@for = 'ctl00_content_loginForm_ctl01_username'], чтобы идентифицировать эту конкретную метку.