用于<label for =“x”> </label>的Selenium定位器

时间:2010-01-08 21:00:52

标签: testing selenium watin selenium-rc web-testing

使用ASP.NET,标签ID非常不稳定,所以为了使我的测试更加健壮,我想通过标签文本定位元素。我已经和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 个答案:

答案 0 :(得分:10)

这有效:

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

说明:由于您正在寻找输入:

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

用标签的属性值替换“ctl00_content_loginForm_ctl01_username”:

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

答案 1 :(得分:7)

我相信你可以通过以下方式做到这一点:

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

text()='Username'位通过innerHTML获取所需的标签,然后/ @ for会返回其“for”属性的值。

抬头:这未经过测试(对此表示道歉!)但我认为它会起作用,基于IDE插件中的一些工具

答案 2 :(得分:3)

好的,这可能是一岁,但他们嘿。这将选择包含文本&#39;用户名&#39;的标签下的第一个输入。

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

我通常更喜欢使用contains(),因为我发现有些浏览器会在偶然元素中添加恼人的空格:

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

请注意,输入前的单斜杠表示它只会向下看一个级别,其中双斜杠将检查标签下的所有级别。使用XPather for Firefox创建和检查你的XPath,它非常有用。

答案 3 :(得分:1)

是的,您可以使用XPath,CSS或DOM定位器来识别您的元素。在此示例中,您的XPath看起来像// @ lable [@ for ='ctl00_content_loginForm_ctl01_username']以标识该特定标签。