使用Selenium WebDriver查找任何给定元素的下一个兄弟

时间:2017-01-17 20:52:10

标签: c# selenium selenium-webdriver

我试图创建一个给定WebElement查找并返回下一个元素的方法。我找到了很多关于使用XPath和#34;以及"或者"跟随兄弟"但是我无法让它发挥作用。出于这个问题的目的,我将展示html,但是元素类型与我需要的东西无关,因为我想要一个给定任何类型的任何元素(a / ul / div / whatever)的泛型方法它将返回下一个兄弟姐妹,无论其类型如何。

<a id="blah" href="#" class="stuff">"My Label"</a>
<ul class="some-class">
    <li>...</li>
    <li>...</li>
</ul>

我的错误调试代码:

IWebElement element = driver.FindElement(By.Id("blah"));
IWebElement nextElement = element.FindElement(By.XPath("//following-sibling::ul[@class='some-class']"));

我怀疑我的xpath语法是错误的...我坦率地说是无能为力。是&#34; //&#34;是指相对于元素还是DOM本身?有没有办法在不知道下一个元素的标签是什么的情况下这样做?无论它是什么类型,我都想获得下一个元素。我想找出最简单,最通用的方法来做到这一点。我想拥有什么:

public IWebElement NextSibling(IWebElement element) 
{
    IWebElement nextSibling = element.FindElement(By.?("magical string to find next sibling"));
    return nextSibling;
}

...这正是您在element.nextSibling()

的javascript中已经可以做到的

4 个答案:

答案 0 :(得分:4)

尝试在xpath中使用.//,因为这是相对路径,您使用的是绝对路径,因此它无法按预期工作。

答案 1 :(得分:2)

在xpath中你不需要双斜杠,这实际上意味着当前上下文的任何后代(这不是你想要的)。您可以通过无所作为来指定当前上下文,即

following-sibling::ul[@class='some-class']

答案 2 :(得分:1)

我看到的最好的,也可能是唯一的解决方案是使用javascript(element.nextSibling;),正如我在问题的最后提到的那样。在我发现这一点之前,我甚至从未考虑过我可以使用IJavaScriptExecutor返回IWebElementhttps://stackoverflow.com/a/11320472/2246511

同样,我不想提供关于兄弟姐妹的任何信息,例如它是什么类型,类或任何东西。 js nextSibling正是我想要的。

答案 3 :(得分:0)

如果使用标签,请在属性“ 用于”链接中输入“ id ”。 因此,您可以尝试以下方法:

string nextElementId = driver.FindElement(By.Id("blah")).GetAttribute("for");
IWebElement nextElement = driver.FindElement(By.Id(nextElementId));