2013-02-08 58 views
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个跨度的与类“关闭”,所以它不是唯一的选择。不幸的是一部分....

+0

所以跨度有一个空的类? –

+0

啊,好的一个,它没有,点击它时只有没有课,我会编辑这个问题。但是,这是一个菜单项,我检查了它:我有19个span(菜单项),class'close',点击的项目有'close'类。 – Michel

+0

'// @ [@ id = \“Navigation \”]/descendant :: span [text()='Matrices']'工作吗? – Arran

回答

8

第n个元素这将工作:

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

请注意,如果你能,具体在你的XPath查询,主要是帮助可读性和提高性能......即您的查询中的*将在页面中查询所有元素。我不知道导航元素是什么样的元素,但你应该把它的确切元素类型中,例如,如果它是一个div,使它:

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

对于这个XPath轻微的解释是它会抓住Navigation元素,只需在的任意位置查看即可找到span元素,其文字为Matrices。如果没有XPath中的descendant位,它只会搜索直接子项。这意味着Navigation的孩子,没有别的 - 所以如果一个元素是TestDiv的孩子,它是Navigation的孩子,descendant会捕获它,没有它你不会返回任何结果。

至于为什么By.PartialLinkText不起作用,这只会搜索锚链接。正如你所看到的那样,锚链接在它们内部有一个span元素是很常见的,或者有时它本身就是一个span

By.PartialLinkText和类似的By.LinkText不会“看到”这个元素,因为它不是一个锚元素。

2

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

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

但我会用方法,它与“亲潮”级(//span[7]或类似的东西)

+1

是的,第7个元素的xpath可以工作,但是看起来很脆弱,当菜单获得一个额外的项目时它不再是第7个项目... – Michel

+0

同意。在我的情况下,它的工作原理是完美的,因为Web GUI的变化并不是那么经常,也不是侵入式的 –

2

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

相关问题