11

使用 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

4 回答 4

13

这有效:

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

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

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

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

//label[text()="Username"]/@for
于 2011-11-25T09:18:20.637 回答
7

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

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

text()='Username' 位通过其 innerHTML 获取您想要的标签,然后 /@for 将其“for”属性的值返回给您。

注意:这没有经过测试(为此道歉!)但我认为它会起作用,基于 IDE 插件中的一些工具

于 2010-01-08T22:09:26.077 回答
3

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

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

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

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

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

于 2011-02-11T09:14:19.360 回答
1

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

于 2010-01-08T21:56:46.947 回答