我在div标签中重复了这段代码,想要编写一个XPath表达式来查找dsd链接,以便我可以根据h4标签中的文本点击它。更改HTML不是一个选项。
<div>
<h4>Test Block</h4>
<br/>
<div>
<a href="/dsd/<generic unpredicatable text>">Option 1</a>
<a href="otherlink/<generic unpredicatable text>">Option 2</a>
</div>
</div>
目前,我尝试过类似名称是h4标签名称的内容;
var findSubmitButton = Driver.FindElement(By.XPath("//div/h4[contains(text(), '" + name + "')]"));
var submitButton = findSubmitButton.FindElement(By.XPath("../div/a[contains(@href,'dsd')]"));
submitButton.Click();
但是我无法让它发挥作用。我们将非常感激地收到任何建议。
答案 0 :(得分:1)
我没有看到你的xpath问题。由于您的占位符,您提供的HTML无效,但您的xpath似乎适用于此:
void Main()
{
var xml = @"
<div>
<h4>Test Block</h4>
<br/>
<div>
<a href=""/dsd/generic unpredicatable text"">Option 1</a>
<a href=""otherlink/generic unpredicatable text"">Option 2</a>
</div>
</div>";
var xmldoc = new XmlDocument();
xmldoc.LoadXml(xml);
var node = xmldoc.DocumentElement.SelectSingleNode("//div/h4[contains(text(),'Test Block')]");
node = node.SelectSingleNode("../div/a[contains(@href,'dsd')]");
Console.WriteLine(node.InnerText);
}
答案 1 :(得分:0)
您可以使用//div[h4[contains(., 'Test Block')]]//a[contains(@href, 'dsd')]
。像//div[h4[contains(., 'Test Block')]]//a[contains(., 'Option 1')]
这样的东西也应该有用。
答案 2 :(得分:0)
我没有工作机器所以我无法对此进行测试,但是您说任何反馈都会很受欢迎,因此,我非常确定使用XPath您可以从中获取单个元素一个孩子。如果你确定这个HTML总是一样的话,你可以这样做:
../div[0] //(First element of the child)
答案 3 :(得分:0)
您为什么不使用兄弟姐妹
var findSubmitButton = Driver.FindElement(By.XPath("//div/h4[contains(text(), '" + name + "')]"));
var submitButton = findSubmitButton.FindElement(By.XPath("following-sibling::div/a[contains(@href,'dsd')]"));