C# 如何找到给定IWebElement上方的第一个label元素

C# 如何找到给定IWebElement上方的第一个label元素,c#,selenium,selenium-webdriver,C#,Selenium,Selenium Webdriver,我正在创建一个名为GetTextboxLabel的函数,它完全按照它所说的做,获取POM框架中声明的给定IWebElement的标签 与其声明页面对象类中的每个textbox标签,我更希望能够调用如下内容: Textbox.GetTextboxLabel() 然后在断言中使用它,比如: Assert.That("Username:" == Username.GetTextboxLabel()); 在我的应用程序中,每个标签字段都直接位于textbox字段的上方,因此可以安全地假设DOM中te

我正在创建一个名为GetTextboxLabel的函数,它完全按照它所说的做,获取POM框架中声明的给定IWebElement的标签

与其声明页面对象类中的每个textbox标签,我更希望能够调用如下内容:

Textbox.GetTextboxLabel()
然后在断言中使用它,比如:

Assert.That("Username:" == Username.GetTextboxLabel());
在我的应用程序中,每个标签字段都直接位于textbox字段的上方,因此可以安全地假设DOM中textbox输入html元素上方标签类型的第一个html元素就是textbox标签。您可以在这里看到,我有一个id为='CUSIP'的输入,在它上面有一个带有'CUSIP'文本的标签。函数将返回标签文本

<div class="form-group">
    <label class="control-label col-md-3">CUSIP</label>
    <div class="col-md-9">
        <input class="form-control" data-val="true" data-val-length="CUSIP must be exactly 9 characters long" data-val-length-max="9" data-val-length-min="9" data-val-required="The Cusip field is required." id="Cusip" name="Cusip" type="text" value="">
        <span class="field-validation-valid" data-valmsg-for="Cusip" data-valmsg-replace="true"></span>
    </div>
</div>
有人能提供一些帮助吗?有没有办法用XPath做到这一点?如有任何建议,将不胜感激

编辑:
我正在查找上一个标签字段,而不是下一个。

有几种方法可以做到这一点。。。这里有几个例子。假设e是您传入或使用扩展方法的输入标记

这一个使用相对XPATH,以.。开始,上升两级..,然后下降到标签

e.FindElement(By.XPath("./../../label")).Text;
这一个还使用以开头的相对XPATH。并假定所需的标签是第一个祖先

e.FindElement(By.XPath("./ancestor::label")).Text;

正如JeffC指出的,如果有多个元素,我之前的答案就不起作用。因此,我复制了您的示例4次,并更改了每个输入元素的ID

<div class="form-group">
    <label class="control-label col-md-3">CUSIP</label>
    <div class="col-md-9">
        <input class="form-control" data-val="true" data-val-length="CUSIP must be exactly 9 characters long" data-val-length-max="9" data-val-length-min="9" data-val-required="The Cusip field is required." id="Cusip1" name="Cusip" type="text" value="">
        <span class="field-validation-valid" data-valmsg-for="Cusip" data-valmsg-replace="true"></span>
    </div>
</div>

<div class="form-group">
    <label class="control-label col-md-3">CUSIP</label>
    <div class="col-md-9">
        <input class="form-control" data-val="true" data-val-length="CUSIP must be exactly 9 characters long" data-val-length-max="9" data-val-length-min="9" data-val-required="The Cusip field is required." id="Cusip2" name="Cusip" type="text" value="">
        <span class="field-validation-valid" data-valmsg-for="Cusip" data-valmsg-replace="true"></span>
    </div>
</div>

<div class="form-group">
    <label class="control-label col-md-3">CUSIP</label>
    <div class="col-md-9">
        <input class="form-control" data-val="true" data-val-length="CUSIP must be exactly 9 characters long" data-val-length-max="9" data-val-length-min="9" data-val-required="The Cusip field is required." id="Cusip3" name="Cusip" type="text" value="">
        <span class="field-validation-valid" data-valmsg-for="Cusip" data-valmsg-replace="true"></span>
    </div>
</div>

<div class="form-group">
    <label class="control-label col-md-3">CUSIP</label>
    <div class="col-md-9">
        <input class="form-control" data-val="true" data-val-length="CUSIP must be exactly 9 characters long" data-val-length-max="9" data-val-length-min="9" data-val-required="The Cusip field is required." id="Cusip4" name="Cusip" type="text" value="">
        <span class="field-validation-valid" data-valmsg-for="Cusip" data-valmsg-replace="true"></span>
    </div>
</div>

希望一切顺利。和平

可能的重复,我正在寻找前一个,而不是下一个。另外,不是直接的同级记录,而是带有特定html标记的上一条记录。请随意组合该答案,它告诉您如何获取与当前元素相关的元素(这似乎是这个问题中最独特的部分),以及所有其他答案,它们将告诉您如何使用xpath轴获取祖先,如前所述,等等。如果我有时间,我可能会发表评论来帮助您定制xpath,但有答案可以帮助您找到正确的方向。这不起作用,因为OP使用的是找到的web元素文本框的扩展方法。此外,/previous::label xpath不正确。它不会返回紧靠它前面的标签,而是返回它前面的标签。这是OP想要的。好的,我会更新我的答案。天哪,这对我来说很好,但我只是用给出的例子来测试它。我刚刚创建了这个例子的4个实例,下一个答案是发现每个实例都很好。这很奇怪。。。当我使用xpathtester.com/xpath时,它会找到祖先,但当我在Chrome中使用$x时,它找不到祖先。当我阅读它时,previous表示文档中上下文节点之前的所有节点,除了任何**祖先**、属性和名称空间节点。因此不应包括祖先节点,因为标签是祖先节点。
//div[div[input[contains(@id, 'Cusip1')]]]//label

//div[div[input[contains(@id, 'Cusip2')]]]//label

//div[div[input[contains(@id, 'Cusip3')]]]//label

//div[div[input[contains(@id, 'Cusip4')]]]//label