Java 使用绝对XPath定位元素是一种好的做法吗?如果没有,是否有其他有效的方法来定位元素?
我正在使用SeleniumWebDriver和Java实现自动化。为了定位元素,我使用XPath。这是一个好的实践吗?XPath选择器的使用与否取决于文档结构的具体程度Java 使用绝对XPath定位元素是一种好的做法吗?如果没有,是否有其他有效的方法来定位元素?,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我正在使用SeleniumWebDriver和Java实现自动化。为了定位元素,我使用XPath。这是一个好的实践吗?XPath选择器的使用与否取决于文档结构的具体程度 例如,如果您想单击表单上的“提交”按钮,但并不真正关心“提交”按钮在哪里,那么通过其id或名称引用元素是一个好主意和常见做法。另一方面,如果您正在测试页面中需要作为其他元素的子元素的元素,那么使用Xpath是完全可以的。是否使用Xpath选择器取决于您需要文档结构的具体程度 例如,如果您想单击表单上的“提交”按钮,但并不真正关心
例如,如果您想单击表单上的“提交”按钮,但并不真正关心“提交”按钮在哪里,那么通过其id或名称引用元素是一个好主意和常见做法。另一方面,如果您正在测试页面中需要作为其他元素的子元素的元素,那么使用Xpath是完全可以的。是否使用Xpath选择器取决于您需要文档结构的具体程度
例如,如果您想单击表单上的“提交”按钮,但并不真正关心“提交”按钮在哪里,那么通过其id或名称引用元素是一个好主意和常见做法。另一方面,如果您正在测试页面中需要作为其他元素的子元素的元素,那么使用Xpath是完全可以的。没有一般规则。它总是取决于被测试的站点 查找元素的最佳方法是通过Id。这并不总是可能的,尤其是当测试中的站点不在您的控制之下,并且您不能自己将id添加到html中时。按名称定位也不错,但根据您测试的站点,它在每个页面/框架上可能不是唯一的。(注意,“Name”是指HTML中的
Name
属性,而不是标记名!)
对于
和
元素,通过LinkText或PartialLinkText进行搜索可能是一个不错的选择,但前提是您的测试站点无法切换到其他语言,因为这通常也会更改所有链接文本
CSS选择器定位功能几乎与XPath一样强大,但通常更短、更紧凑,尤其是在处理类名时
示例(CSS与XPath表达完全相同的内容):
只有当您将文本作为HTML元素的内容进行搜索时,CSS才能做到这一点(Selenium中没有可用的XQuery!),您必须使用XPath
例如:
//button[@type='button']//span[text()='Close']
element.findElement(By.xpath("following-sibling::p[1]/strong"));
对于沿着XPath轴搜索相对于已经定位的web元素,有时使用XPath可能会很有用
例如:
//button[@type='button']//span[text()='Close']
element.findElement(By.xpath("following-sibling::p[1]/strong"));
可能还有其他无法避免XPath的情况,但我没有遇到过。因此,只有在必要时才使用XPath!通常有更好的方法。没有一般规则。它总是取决于被测试的站点 查找元素的最佳方法是通过Id。这并不总是可能的,尤其是当测试中的站点不在您的控制之下,并且您不能自己将id添加到html中时。按名称定位也不错,但根据您测试的站点,它在每个页面/框架上可能不是唯一的。(注意,“Name”是指HTML中的
Name
属性,而不是标记名!)
对于
和
元素,通过LinkText或PartialLinkText进行搜索可能是一个不错的选择,但前提是您的测试站点无法切换到其他语言,因为这通常也会更改所有链接文本
CSS选择器定位功能几乎与XPath一样强大,但通常更短、更紧凑,尤其是在处理类名时
示例(CSS与XPath表达完全相同的内容):
只有当您将文本作为HTML元素的内容进行搜索时,CSS才能做到这一点(Selenium中没有可用的XQuery!),您必须使用XPath
例如:
//button[@type='button']//span[text()='Close']
element.findElement(By.xpath("following-sibling::p[1]/strong"));
对于沿着XPath轴搜索相对于已经定位的web元素,有时使用XPath可能会很有用
例如:
//button[@type='button']//span[text()='Close']
element.findElement(By.xpath("following-sibling::p[1]/strong"));
可能还有其他无法避免XPath的情况,但我没有遇到过。因此,只有在必要时才使用XPath!通常有更好的方法。绝对XPath 绝对XPath以根节点或正斜杠(/)开头。 使用绝对值的优点是,它可以非常快速地识别元素。 这里的缺点是,如果任何事情出错或在两者之间添加了其他标记,则此路径将不再有效 例如: 如果我们定义的路径是 html/head/body/table/tbody/tr/th 相对Xpath 相对xpath是一种路径从您选择的节点开始的xpath,它不需要从根节点开始 它以双正斜杠(//)开头 语法: //表/t正文/tr/th 使用相对xpath的优点是,您不需要提及长xpath,您可以从中间或中间开始
缺点是,当我们指定部分路径而不是(精确路径)时,识别元素将花费更多的时间。绝对XPath 绝对XPath以根节点或正斜杠(/)开头。 使用绝对值的优点是,它可以非常快速地识别元素。 这里的缺点是,如果任何事情出错或在两者之间添加了其他标记,则此路径将不再有效 例如: 如果我们定义的路径是 html/head/body/table/tbody/tr/th 相对Xpath 相对xpath是一种路径从您选择的节点开始的xpath,它不需要从根节点开始 它以双正斜杠(//)开头 语法: //表/t正文/tr/th 使用相对xpath的优点是,您不需要提及长xpath,您可以从中间或中间开始
缺点是,由于我们指定的是部分路径而不是(精确路径),识别元素将花费更多的时间。是的,每个人都是这样做的。@DavidWallace No,