使用 CSS 以适合 Selenium 的样式定位元素?

Using CSS to locate elements in Selenium- appropriate style?

我目前正在学习 Selenium WebDriver 作为实习的一部分。我的主管希望我学习它,建立一个概念证明并展示它,以便他们在测试他们的网络应用程序时可以开始使用它(我们使用 JSF,但它与问题并不真正相关)。

我遇到的最大问题是定位具有动态 ID 属性的元素。由于 ID 可以更改,因此没有一致的方法来标识元素。我要么使用 XPath,要么提取所有输入元素并进行进一步过滤以创建所需元素的映射。

我和一个从事自动化工作的朋友谈过,他提出创建空 CSS 类 来识别元素。例如,给定标签:

<input id = "name"... class="... qa_name">

我可以调用 driver.findElement.(By.cssSelector(".qa_name")) 来定位它。这对测试人员来说非常方便,因为他们有确定性的方法来定位页面上的元素。

这有什么问题吗?我知道它会奏效,我想推荐这种做法,但我担心的是:

1) 由于额外的 CSS 没有对页面做任何适当的事情,页面将需要更长的时间来加载。

2) 这在风格上不合适 CSS,因为它对页面的外观没有任何影响。

我在 Programmers Whosebug 上问了一个类似的问题,但运气不好,所以我希望能在这里得到答案。谢谢!

我感受到你的痛苦。将 类 添加到测试元素可能不是最佳做法。您可以添加 name 吗?

动态 ID 的另一个选项...ID 中是否有一部分是稳定的?您可以使用 CSS 选择器来查找字符串的开头、字符串的结尾或字符串的某个部分。

假设您有一个带有动态 ID 的 DIV,例如<div id="ct100_Text1_12345_Text2"> 其中 12345 是一个动态数字。

您可以使用 CSS 选择器使用

定位 ID 的第一部分
driver.findElements(By.cssSelector("div[id^='ct100_Text1_']"));

您可以使用 CSS 选择器使用

定位 ID 的最后部分
driver.findElements(By.cssSelector("div[id$='_Text2']"));

或者...您可以使用 CSS 选择器使用

定位 ID 的中间部分
driver.findElements(By.cssSelector("div[id*='_Text1_']"));

CSS 选择器是我最近才开始学习和使用的强大工具。他们值得花时间学习。

CSS Selectors reference