Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SeleniumWebDriver:使用xpath是一种专业实践吗?_Java_Selenium - Fatal编程技术网

Java SeleniumWebDriver:使用xpath是一种专业实践吗?

Java SeleniumWebDriver:使用xpath是一种专业实践吗?,java,selenium,Java,Selenium,我正在使用selenium和java测试一个web应用程序。我总是避免xpath,就像它是一种疾病一样。不幸的是,我被一个顽固的web元素深深地埋在一个表中,不幸的是没有id或类。我尝试了一切,甚至邀请了我的曾祖父母,但不……除了xpath,什么都没用……见下文 我试过了:className,name,cssSelector,e.t.c.和e.g driver.findElement(By.className("kujes")).click(); 这就是成功的原因 driver.findEle

我正在使用selenium和java测试一个web应用程序。我总是避免xpath,就像它是一种疾病一样。不幸的是,我被一个顽固的web元素深深地埋在一个表中,不幸的是没有id或类。我尝试了一切,甚至邀请了我的曾祖父母,但不……除了xpath,什么都没用……见下文

我试过了:className,name,cssSelector,e.t.c.和e.g

driver.findElement(By.className("kujes")).click();
这就是成功的原因

driver.findElement(By.xpath("/html/body/div[7]/div[3]/div/div[2]/div[1]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div/div[6]/div/div[2]/div[2]/div/table/tbody/tr[1]/td[3]")).click();
我不希望我的工作不专业。 那么,我的问题是xpath是否可靠和良好的实践? 使用xpath专业吗

driver.findElement(By.xpath("/html/body/div[7]/div[3]/div/div[2]/div[1]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div/div[6]/div/div[2]/div[2]/div/table/tbody/tr[1]/td[3]")).click();
上述方法是非常糟糕的做法


永远不要在xpath中使用索引。它变得非常脆弱,即使在目标应用程序中有一个小的更改时,每次都会中断。尝试要求开发人员向该对象添加ID

这取决于具体情况。最终的目标是找到一个独一无二的选择器,在发生重大变化之前,它永远不会改变

首先,您可以尝试使用唯一的id或类名

然后我们可以使用css选择器来查找

  • 具有属性、类名、id和组合的元素
  • 元素,该元素是另一个元素的子元素
  • 元素,它是另一个元素的下一个同级元素
您使用的是绝对xpath,它不可读,并且正在更改。使用绝对xpath是完全不专业的

driver.findElement(By.xpath("/html/body/div[7]/div[3]/div/div[2]/div[1]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div/div[6]/div/div[2]/div[2]/div/table/tbody/tr[1]/td[3]")).click()
可以使用相对xpath

driver.findElement(By.xpath("//table[@id='somevalue']//td[text() = 'Name']]/preceding-sibling::td")).click()
在selenium中,只有XPath才有可能

  • 查找元素的父元素
  • 查找元素的前一个同级
  • 查找具有innerText的元素
  • 查找定位器的第n个元素

使用css选择器无法实现上述情况,而xpath是查找这些元素的唯一直接方法。您也可以使用jquery选择器和javascript executor间接实现这些功能。

根据我的经验,这取决于您所在的公司使用这两种功能的专业程度。我工作过的一个地方说“绝对没有XPath”,因为他们发现它们跨浏览器/设备不可靠。他们坚持使用CSS选择器。另一家公司只会使用XPath。就个人而言,在使用了两者之后,我更喜欢使用CSS选择器。简单。清洁的完成任务,并且在我使用过的任何浏览器/设备上都100%可靠。谢谢AJC24,但我想知道……即使没有id或类名,css选择器也能工作吗?因为我也尝试了一下,结果失败了。当然可以,但是如果元素具有
id
class
属性,这会有很大帮助。如果你是开发人员,也许你应该考虑添加它们。如果您没有,您应该请求添加它们。例如,您可以执行以下操作:
div[id=“parent”]>div>p>h2
使用CSS选择器向下遍历DOM元素,到达所需的选择器。“[…]查找[…]永不更改的选择器”-dream on:)哈哈!更新了句子