-2

因此,我们的 QA 人员今天过来让我将 id 放在我们 html 中的项目上,这样他就可以使用 watir 自动执行操作。

我对此了解不多,所以我试着看看我们是否可以使用类名来代替,但这完全是废话。

我只是想知道为什么像

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

当你在 watir 中设置它时工作,但你不能做类似的事情

links(:item, :class => 'save-btn')[0] 

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

element not visible errors

我只是想知道为什么这如此困难,在所有东西上使用 ids 似乎是推荐的方法?有没有办法将类名与 watir 一起使用,或者这就是事情的完成方式?

4

2 回答 2

2

CSS 类属性是使用 Watir 访问元素的正常方式。和身份证一样。

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

我不确定您在示例中使用的是什么框架,但如果保存按钮位于某个容器元素中,这就是我将在普通的旧 watir 中执行此操作的方式:

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

上面的代码将按预期在容器元素中找到类“save-btn”的第一个跨度。

此外,不要按照此处另一个答案的建议使用xpath或定位器。css为什么?因为它们真的很脆弱,使您的测试难以阅读/维护。

于 2013-09-17T20:00:27.987 回答
1

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

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

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

在这里,您的错误消息意味着您可能有多个带有 class的元素save-btn,第一个元素不可见,无法与之交互。

Selenium WebDriver 或 Watir WebDriver 都支持 XPath 和 CssSelector,所以你应该在必要时使用:xpathor: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 很慢,应该被视为最后的选择)

于 2013-09-17T02:23:54.570 回答