我正在使用Selenium Webdriver和Java进行自动化。对于定位元素,我使用XPath。这是一个好习惯吗?
答案 0 :(得分:2)
绝对XPath
绝对XPath以根节点或正斜杠(/)开头。 使用绝对的优点是,它可以非常快速地识别元素。 这里的缺点是,如果出现任何问题或者其间添加了其他标记,则此路径将不再有效。
实施例: 如果路径我们定义为
的HTML /头/体/表/ tbody的/ TR /日
相对Xpath
相对xpath是路径从您选择的节点开始的路径 - 它不需要从根节点开始。
以Double forward slash(//)
开头语法:
//表/ tbody的/ TR /日
使用相对xpath的优点是,你不需要提及长xpath,你可以从中间或中间开始。
这里的缺点是,识别元素需要更多时间,因为我们指定的是部分路径(精确路径)。
答案 1 :(得分:1)
没有一般规则。它总是取决于被测试的网站。
找到元素的最佳方式是 ID 。这并非总是可行,尤其是当受测试的网站不在您的控制之下且您无法自己将id添加到html中时。通过名称定位也不错,但根据您测试的网站,它可能在每个页面/框架上都不是唯一的。 (请注意,“名称”表示HTML中的name
属性,而不是标记名称!)
对于<a>
和<button>
元素,通过 LinkText 或 PartialLinkText 进行搜索可能是一个不错的选择,但前提是您的网站不能切换到另一种语言,因为这通常会改变所有链接文本。
通过 CSS选择器定位几乎与XPath一样强大,但通常更短更紧凑,尤其是在处理类名时。
示例(CSS与XPath表达完全相同的事情):
driver.findElement(By.cssSelector(".ecp-cartItemText"));
driver.findElement(By.xpath("//*[@class='ecp-cartItemText' or contains(@class,' ecp-cartItemText ') or substring(@class,1,17)='ecp-cartItemText ' or substring(@class,string-length(@class)-16)=' ecp-cartItemText']"));
只有当您搜索文本作为HTML元素的内容时,CSS才能执行此操作(Selenium中没有XQuery!)并且您必须使用XPath。
示例:
//button[@type='button']//span[text()='Close']
此外,对于沿XPath轴相对于已定位的Web元素进行搜索,有时使用XPath可能很有用。
示例:
element.findElement(By.xpath("following-sibling::p[1]/strong"));
可能还有其他无法避免XPath的情况,但我没有遇到任何问题。所以只在必要时才使用XPath!通常有更好的方法。
答案 2 :(得分:0)
您是否使用XPath选择器取决于您需要文档结构的具体程度。
例如,如果要单击表单上的“提交”按钮,但不关心提交按钮的位置,则通过其ID或名称引用元素是一个好主意和常见做法。另一方面,如果您正在测试页面中需要作为其他元素的子元素的元素,那么使用Xpath就完全没问题了。