Локатор селена для <label for = "x"> - PullRequest
11 голосов
/ 09 января 2010

В 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");

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

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

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

Ответы [ 4 ]

10 голосов
/ 25 ноября 2011

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

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

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

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

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

//label[text()="Username"]/@for
7 голосов
/ 09 января 2010

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

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

Бит text () = «Имя пользователя» получает нужную метку по ее внутреннему HTML, а затем / @ for возвращает значение его атрибута «for».

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

3 голосов
/ 11 февраля 2011

Хорошо, это может быть год, но что они, эй? Это выберет первый вход под меткой, содержащей текст «Имя пользователя».

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

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

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

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

1 голос
/ 09 января 2010

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

...