需要一个基于兄弟

时间:2015-05-19 15:25:47

标签: c# selenium xpath

我在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();

但是我无法让它发挥作用。我们将非常感激地收到任何建议。

4 个答案:

答案 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')]"));