在Watir中使用类名

时间:2013-09-16 22:10:01

标签: watir

所以我们的质量保证人员今天来到我这里,让我把ID放在我们的HTML中的项目上,这样他就可以使用watir来自动化。

我不太了解它,所以我试着看看我们是否可以使用类名,但那是一个完整的废话。

我只是想知道为什么像

link(:item, :id => 'save-btn')

在watir中设置时有效,但你不能做像

这样的事情
links(:item, :class => 'save-btn')[0] 

我也尝试过使用browser.links调用,但我们会一直得到

element not visible errors

我只是想知道为什么这么困难,哪里使用ids似乎是推荐的一切方式?有没有办法在watir中使用类名,或者只是按照事情的方式使用?

2 个答案:

答案 0 :(得分:2)

CSS类属性是使用Watir访问元素的常用方法。就像是id。

对于类属性,您通常必须指定要搜索的上下文,因为可能有多个元素具有相同的类而不是id属性,该属性必须对整个页面唯一。< / p>

我不确定你在示例中使用的是什么框架,但如果保存按钮位于某个容器元素中,这就是我在普通旧方法中所做的:

browser.div(id: "container").span(class: "save-btn")

上面的代码会在容器元素中按预期找到第一个带有“save-btn”类的span。

另外,请不要使用xpathcss定位器,如此处的其他答案所示。为什么?因为它们非常脆弱,使得您的测试难以阅读/维护。

答案 1 :(得分:1)

简答:在源代码中添加类名是正确的方向,应该被认为是一种好的做法,但是,之后使用:class定位器在大多数情况下还不够好在这种情况下,请尝试使用:xpath:css。因此,作为开发人员,您可以继续添加类名,但是您需要确保您的QA人员知道如何使用Watir,不要只对所有定位器使用:id:class

答案很长:如果网站足够简单,添加ID将是最简单的,也是最好的。但是,如今,许多JavaScript框架(如ExtJS)都会创建动态ID,因此在这种情况下,将类名添加到源代码会更好。

添加类名后,例如在你的情况下,使用:class定位器是一个糟糕的选择,这可能比:id更糟糕,因为ID应该是唯一的。对于复杂的页面,:class定位器几乎没用,会发现不需要的元素。

在这里,您的错误消息表示您可能有多个具有类save-btn的元素,第一个元素与其进行交互是不可见的。

Selenium WebDriver或Watir WebDriver都支持XPath和CssSelector,因此您应该在必要时使用:xpath:css,而不是:id:class等。

例如:

links(:item, :css=> '.save-btn:not([style*='display:none'])')[0]

Jarmo Pertman 建议使用ID / Class支持XPath / Css选择器,这不完全正确。 ID / Class只是XPath / Css选择器的子集,如果它很容易,使用ID / Class,但是在他给出的示例中,不必要的链接不是一个好习惯,

browser.div(id: "container").span(class: "save-btn")

等同于CSS选择器div#container span.save-btn,因此CSS选择器没有脆弱或维护问题,因为它们是相同的。

XPath / CSS选择器是强大的工具,每个人都应该学习,但只有在真正需要时才使用它们。糟糕的XPath / Css选择器是脆弱的,尝试找到好的。 (但请记住,XPath很慢,应该被认为是最后一个选项)