5

我刚从 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 个跨度为“关闭”类,因此不幸的是它不是唯一的选择器......

4

3 回答 3

8

这将起作用:

//*[@id=\"Navigation\"]/descendant::span[text()='Matrices']

请注意,如果可以,请在 XPath 查询中具体说明,主要是为了提高可读性和提高性能……也就是说,*在您的查询中将查询页面中的所有元素。我不知道Navigation元素是什么类型的元素,但你应该把它的确切元素类型放入,例如,如果它是一个 div,就让它:

//div[@id=\"Navigation\"]/descendant::span[text()='Matrices']

对此 XPath 的一个简单解释是,它将抓取Navigation元素,并简单地查看其中的任何位置以找到span具有Matrices. 如果没有descendantXPath 中的位,它只会搜索直接 children。这意味着元素是 的子元素Navigation,仅此而已 - 因此,如果元素是 的子元素的子元素TestDivNavigation则会descendant捕获它,没有它,您将不会返回任何结果。

至于为什么By.PartialLinkText不起作用,这只会搜索锚链接。如您所见,锚链接span内部有一个元素是很常见的,或者有时它只是一个span独立的元素。

By.PartialLinkText同样By.LinkText不会“看到”这个元素,因为它不是锚元素。

于 2013-02-08T09:43:20.593 回答
2

对于这些情况,我最喜欢的问题解决者:

  • 安装Selenium IDE
  • 点击你需要的链接
  • 在 Selenium IDE 的“目标”中,您将看到不同的 xpath 可能性

但我会使用这种方法,它的第 N 个元素具有“关闭”类(//span[7]或类似的东西)

于 2013-02-08T09:14:52.400 回答
2

您可以使用 //span[text()='Matrices'] 它将选择您的元素。

于 2013-02-08T11:37:59.777 回答