我刚刚开始使用 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
),这对我来说似乎有点脆弱?
编辑: 跨度的类别为“close”。 它是菜单的一部分,其中有 19 个带有“close”类的跨度,因此不幸的是它不是一个唯一的选择器......
最佳答案
这会起作用:
//*[@id=\"Navigation\"]/descendant::span[text()='Matrices']
请注意,如果可以的话,请在 XPath 查询中具体化,主要是为了提高可读性并提高性能...即查询中的 *
将查询全部页面中的元素。我不知道 Navigation 元素是什么类型的元素,但你应该输入它的确切元素类型,例如,如果它是 div,则将其设置为:
//div[@id=\"Navigation\"]/descendant::span[text()='Matrices']
对此 XPath 的一个简单解释是,它将获取 Navigation
元素,并简单地查找内部任何位置来查找 span
元素其中包含Matrices
文本。如果 XPath 中没有 descendant
位,它只会搜索直接子级。这意味着元素是 Navigation
的子元素,仅此而已 - 因此,如果元素是 TestDiv
的子元素,而 TestDiv
又是 Navigation
的子元素,descendant
会捕获它,没有它你将不会返回任何结果。
至于为什么By.PartialLinkText
不起作用,这只会搜索 anchor 链接。正如您所看到的, anchor 链接内部有一个 span
元素,或者有时它本身就是一个 span
元素,这是很常见的。
By.PartialLinkText
和类似的 By.LinkText
不会“看到”此元素,因为它不是 anchor 元素。
关于selenium - 我如何选择这个跨度元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14768491/