抱歉,我是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,然后选择第二场比赛。
然而我需要的是能够通过文本选择运动(作为//a[text()= 'Sports2']
)然后选择第二场地然后选择第二场比赛...(我希望通过位置来做这些,因为名称每天都在变化)
我正在尝试//a[text()= 'Sports2']/li[2]/ul/li[2]/a
(并且不起作用)
有什么想法吗?
答案 0 :(得分:0)
直到可以清楚,轻松地看到html代码,我只能给你一般的建议:
如果您正在使用WebDriver
(Selenium 2),您可以找到一个元素,然后在其上调用findElement() - 这将只搜索底层节点,而不是整个文档:
WebElement elem = driver.findElement(By.xpath("//a[text()='Sport2']"));
elem.findElement(By.xpath("./something[something()]"));
如果你不是,那么也许(来自XPath 1.0 spec)会有所帮助:
位置路径
//para[1]
与位置的含义不同 路径/descendant::para[1]
。后者选择第一个后代para
元素;前者选择所有后代para
元素 他们父母的第一个para
孩子。
答案 1 :(得分:0)
一种方法是完全使用与 FindElement 或 By.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会促进更有效的答案。