我正在使用 selenium 和 java 测试一个 web 应用程序。我一直避免使用 xpath,就像它是一种疾病一样。不幸的是,我被困在一个深埋在桌子深处的顽固的网络元素上,不幸的是没有 id 或 class。我尝试了一切,甚至邀请了我的曾曾祖父母,但不……没有任何效果,除了 xpath……见下文。我试过:className, name, cssSelector etc with egdriver.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专业吗?
2 回答
侃侃无极
TA贡献2051条经验 获得超10个赞
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 添加到该对象。
尚方宝剑之说
TA贡献1788条经验 获得超4个赞
这取决于具体情况。最终目标是找到唯一的选择器,并且在发生重大变化之前永远不会改变。
首先,您可以尝试使用唯一的 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()
很少有只有 XPath在 selenium 中才有可能的情况
查找元素的父元素
查找元素的前一个兄弟
使用 innerText 查找元素
查找定位器的第 n 个元素
上述情况对于 css 选择器是不可能的,而 xpath 是找到这些元素的唯一直接方法。您也可以使用 jquery 选择器和 javascript 执行器间接实现这些。
添加回答
举报
0/150
提交
取消