我刚开始使用Selenium,现在需要选择这个元素:
<span class=" close">Matrices</span>
这行代码返回零元素,所以我猜它不是正确的: - )
ReadOnlyCollection<IWebElement> matrixLink = driver.FindElements(By.PartialLinkText("Matrices"));
但除了Xpath之外我找不到另一个合适的,但看起来像这样(//*[@id=\"Navigation\"]/div[2]/div[2]/ul/li[7]/span
),这对我来说似乎有点脆弱?
修改: 跨度有“关闭”类。 这是一个菜单的一部分,其中有19个跨度的类'close'所以它不是一个独特的选择器,不幸的是....
答案 0 :(得分:8)
这将有效:
//*[@id=\"Navigation\"]/descendant::span[text()='Matrices']
请注意,如果可以,请在XPath查询中具体说明,主要是为了提高可读性并提高性能......您查询中的*
将查询所有元素。页。我不知道导航元素是什么类型的元素,但你应该把它的确切元素类型放入其中,例如,如果它是一个div,请使用它:
//div[@id=\"Navigation\"]/descendant::span[text()='Matrices']
对此XPath的一个轻微解释是,它将获取Navigation
元素,只需在其中的任何位置查看 即可找到文本为{的span
元素{1}}。如果没有XPath中的Matrices
位,它只会搜索直接子项。这意味着descendant
的孩子的元素,没有别的 - 所以如果一个元素是Navigation
的孩子,TestDiv
的孩子,Navigation
会抓住它,它不会返回任何结果。
至于为什么descendant
不起作用,这只会搜索锚链接。正如您所见,常见的是,锚链接在其中包含By.PartialLinkText
元素,或者有时它只是span
。
span
并且类似By.PartialLinkText
不会'看到'此元素,因为它不是锚元素。
答案 1 :(得分:2)
我最喜欢的问题解决方案:
但我会使用这种方法,它的第N个元素带有“close”类(//span[7]
或类似的东西)
答案 2 :(得分:2)
你可以使用// span [text()='Matrices'] 它会选择你的元素。