所以我们的质量保证人员今天来到我这里,让我把ID放在我们的HTML中的项目上,这样他就可以使用watir来自动化。
我不太了解它,所以我试着看看我们是否可以使用类名,但那是一个完整的废话。
我只是想知道为什么像
link(:item, :id => 'save-btn')
在watir中设置时有效,但你不能做像
这样的事情links(:item, :class => 'save-btn')[0]
我也尝试过使用browser.links调用,但我们会一直得到
element not visible errors
我只是想知道为什么这么困难,哪里使用ids似乎是推荐的一切方式?有没有办法在watir中使用类名,或者只是按照事情的方式使用?
答案 0 :(得分:2)
CSS类属性是使用Watir访问元素的常用方法。就像是id。
对于类属性,您通常必须指定要搜索的上下文,因为可能有多个元素具有相同的类而不是id属性,该属性必须对整个页面唯一。< / p>
我不确定你在示例中使用的是什么框架,但如果保存按钮位于某个容器元素中,这就是我在普通旧方法中所做的:
browser.div(id: "container").span(class: "save-btn")
上面的代码会在容器元素中按预期找到第一个带有“save-btn”类的span。
另外,请不要使用xpath
或css
定位器,如此处的其他答案所示。为什么?因为它们非常脆弱,使得您的测试难以阅读/维护。
答案 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很慢,应该被认为是最后一个选项)