我目前正在学习Selenium WebDriver作为我实习的一部分。我的导师希望我学习它,建立一个概念的证明并展示它,这样他们就可以在测试他们的web应用程序时开始使用它(我们使用JSF,但它与问题并不真正相关)。
我遇到的最大问题是定位具有动态ID属性的元素。由于ID可以更改,因此没有一致的方法来标识元素。我要么使用XPath,要么提取所有输入元素并进行进一步过滤,以创建所需元素的映射。
我和一个从事自动化工作的朋友聊过,他提出创建空CSS类来标识元素。例如,给定标签:
<input id = "name"... class="... qa_name">
我可以打电话给driver.findElement.(By.cssSelector(".qa_name"))
来定位它。这对于测试人员来说是非常方便的,因为他们有一种确定的方法来定位页面上的元素。
这有什么问题吗?我知道它会起作用,我想推荐这样做,但我担心的是:
1)由于额外的CSS没有做任何适合页面的事情,页面将需要更长的加载时间。
2)从样式上讲,这不是合适的CSS,因为它对页面的外观没有任何影响。
我在程序员StackOverflow上问了一个类似的问题,没有运气,所以我希望我能在这里得到答案。谢谢!
我能感受到你的痛苦。向测试元素添加类可能不是最佳实践。可以加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选择器参考