我试图创建一个给定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()
答案 0 :(得分:4)
尝试在xpath中使用.//
,因为这是相对路径,您使用的是绝对路径,因此它无法按预期工作。
答案 1 :(得分:2)
在xpath中你不需要双斜杠,这实际上意味着当前上下文的任何后代(这不是你想要的)。您可以通过无所作为来指定当前上下文,即
following-sibling::ul[@class='some-class']
答案 2 :(得分:1)
我看到的最好的,也可能是唯一的解决方案是使用javascript(element.nextSibling;
),正如我在问题的最后提到的那样。在我发现这一点之前,我甚至从未考虑过我可以使用IJavaScriptExecutor
返回IWebElement
:https://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));