【发布时间】:2011-07-15 21:23:48
【问题描述】:
使用 Java 使用 SeleniumRC 检测网页上的元素以进行自动化测试的最佳方法是什么?我知道有 XPath 元素和 CSS 元素,但是哪一个最好呢?
谢谢! 尼丁
【问题讨论】:
-
没有用例这个问题只会得到主观答案。
标签: java selenium css-selectors
使用 Java 使用 SeleniumRC 检测网页上的元素以进行自动化测试的最佳方法是什么?我知道有 XPath 元素和 CSS 元素,但是哪一个最好呢?
谢谢! 尼丁
【问题讨论】:
标签: java selenium css-selectors
X 路径确实是准确的。然而,它们也非常脆弱。对网站进行任何移动的更改都有可能破坏您的测试。到目前为止,ID 是最不脆弱的,因为无论您是否更改 a 都无关紧要,您的测试总能找到它。
【讨论】:
在我看来,最准确的方法是 XPath,因为您可以使用 XPath 来描述元素在 DOM 中的确切位置,但是在某些情况下 CSS 定位器比 XPath 更有效。
使用 selenium 的 ID 定位器是最简单的,但除非您要查找的元素有 ID,否则并不总是有用。
使用 XPath 时最大的不利因素是 Selenium RC 和带有糟糕 JavaScript 渲染引擎的浏览器的性能(想想 IE6/IE7)。已经做了相当多的工作来尝试纠正这个问题,所以如果你使用格式良好的 XPath,它只搜索 DOM 的特定部分,这个问题应该是最小的。 Selenium webdriver 实现要快得多。
总结是真的没有一个答案,这取决于你想从定位器中得到什么,以及你正在测试哪些浏览器。我个人在 99% 的实例中都使用 XPath。
我个人几乎完全将 XPath 与偶尔的 CSS 定位器一起使用。
【讨论】:
查找元素的最佳和最快方法是通过 id。在许多浏览器中,通过 id 查找元素的时间是线性的,甚至是恒定的。非常快。
例如,给定一个元素定义为:
<input type="text" name="passwd" id="passwd-id" />
你应该会发现它是这样的:
selenium.type("passwd-id", "test");
或者,如果您使用的是 webdriver API:
element = driver.findElement(By.id("passwd-id"));
如果您页面上的元素没有 ID,请添加它们!或要求开发者添加它们!
查找元素的下一个最佳方法是按名称。这也很快,特别是如果页面上的名称是唯一的。
例如:
selenium.type("passwd", "test");
或者,如果您使用的是 webdriver API:
element = driver.findElement(By.name("passwd"));
第三种查找元素的方法是使用 CSS 选择器。现代浏览器非常擅长以这种方式定位元素。
定位元素最糟糕的方法是使用 xpath。 xpath 又慢又脆弱,难以阅读。
Selenium 的主要贡献者 Simon Stewart 在这里回答了这个问题: http://www.youtube.com/watch?v=oX-0Mt5zju0&feature=related 查找时间戳 39:00
这里也有很好的信息: http://seleniumhq.org/docs/02_selenium_ide.html#locating-elements
【讨论】:
Xpath 是我使用的方式。如果您的节点具有唯一的 ID,这将有所帮助。
【讨论】:
CSS 选择器更快,但并不总是可用;您始终可以依赖 XPath,但可能会影响性能。
【讨论】: