0

抱歉,我是 XPath 和 XML 的新手,但是当我在 Selenium 工作时,我需要一些帮助来通过 XPath 识别元素。由于我正在处理的页面内容更改位置,我首先需要按名称选择顶级 - 然后按位置选择后续子菜单...(隐藏子菜单,直到单击顶级)

示例菜单

Sport1
  场地 1
    比赛 1
    比赛 2
    比赛 3
  场地 2
    比赛 1
    比赛 2
    比赛 3
Sport2
  场地 1
    比赛 1
    比赛 2
  场地 2
    比赛 1
    比赛 2

到目前为止//a[text()='Sport2'] ,将选择(并扩展)sports2 - 它位于菜单中的任何位置。

并将//li[2]/ul/li[2]/ul/li[2]/a 选择 2nd Sport、2nd Venue 然后 2nd Race。

但是我需要的是能够通过文本(如//a[text()= 'Sports2'])选择运动,然后选择第二个场地,然后选择第二场比赛......(我想按位置来做这些,因为名字每天都在变化)

我正在尝试的//a[text()= 'Sports2']/li[2]/ul/li[2]/a(并且不起作用)

有任何想法吗?

4

2 回答 2

0

在可以清晰、轻松地看到 html 代码之前,我只能给您一般建议:

如果您使用的是WebDriver(Selenium 2),您可以找到一个元素,然后在其上调用findElement() - 这只会搜索底层节点,而不是整个文档:

WebElement elem = driver.findElement(By.xpath("//a[text()='Sport2']"));
elem.findElement(By.xpath("./something[something()]"));

如果你不是,那么也许这(来自XPath 1.0 规范)会有所帮助:

位置路径与位置路径//para[1]的含义不同/descendant::para[1]。后者选择第一个后代 para元素;前者选择作为其父母para的第一个孩子的所有后代元素。para

于 2012-04-19T18:56:09.813 回答
0

一种方法是完全利用与FindElementBy.XPath 相对FindElements 。你可以做到这一点的方式(我决不建议它作为最好的方式,因为它相当凌乱和过度)是首先关注你想要的元素,然后将它们全部抓住。为此,请运行您的代码,如下所示:

IWebElement sport2 = driver.FindElement(By.XPath("//a[text()= 'Sports2']"));
ReadOnlyCollection<IWebElement> Venues = driver.FindElements(By.XPath("//a[text()= 'Venue']"));
ReadOnlyCollection<IWebElement> Races = Venues[1].FindElements(By.XPath("//a[text()= 'Race']"));
// now you want Races[1]

希望这可以帮助!尽管正如其他人所说,html 将有助于获得更有效的答案。

于 2012-04-20T01:45:55.657 回答