1

我在 IE9 中使用 Selenium(.NET/语言为 C#)并具有以下 html 标记(相关部分)

    <tr>
        <td class="a" align="b">
            <span class="i"/>
            <input type="checkbox" class="checkboxClass" name="chkBox" value="100" disabled/>
            </td>
        <td>
            <a href="/links/items/100.img">Battery</a>
        </td>
            <td align="left">3/16/2016
            </td>
    </tr>
    <tr>
        <td class="a" align="b">
        <span class="i"/>
        <input type="checkbox" class="checkboxClass" name="chkBox" value="101"/>
        </td>
    <td>
        <a href="/links/items/101.img">Polish</a>
    </td>
        <td align="left">3/16/2016
        </td>
</tr>
<tr>
    <td class="a" align="b">
        <span class="i"/>
        <input type="checkbox" class="checkboxClass" name="chkBox" value="101" disabled/>
        </td>
    <td>
        <a href="/links/items/102.img">Polish</a>
    </td>
        <td align="left">3/16/2014
        </td>
</tr>

目标是仅当兄弟的复选框被禁用时才获得所有href 。我对 XPath 几乎没有经验,但我设法使用以下表达式获得所有href,但坚持如何将选择限制为仅禁用检查 -盒子。

var hrefs = driver.FindElements(By.XPath("//tr/td[2]/a")); 

我对“前兄弟”做了很多试验和错误,但没有走得更远。例如,我尝试硬编码 href 并查看是否可以访问复选框元素,以便稍后我可以在循环中对其进行概括并检查复选框的“已选择”属性。但是以下不起作用。

var checkbox = driver.FindElement(By.XPath("//tr/td[a[@href='links/items/100.img']]/preceding-sibling::td[1]"));

我的直觉是,解决方案可能很简单,就像一个 XPath 表达式一样,所以我可以避免循环,这将有助于从社区获得反馈。

4

1 回答 1

0

与其尝试按兄弟姐妹、父母等过滤元素,不如选择适合您条件的 TR 元素,然后在匹配的 TR 中获取 A 元素。

符合您标准的 TR 元素是那些具有嵌入式禁用输入的元素:

//tr[td[1]//input[@disabled]]

然后你想在每个匹配的 TR 中获取 A 元素,因此你 append /td[2]/a

获取 A 元素的最终 XPath 表达式是:

//tr[td[1]//input[@disabled]]/td[2]/a

从此,您可以使用与最初相同的方法来检索 href 属性。

[由 OP 编辑​​] 值得一提的是,要获取实际的 href 属性,请使用 selenium IWebElement 的 GetAttribute() 方法,并将 "href" 作为参数,即 GetAttribute("href") 。由于某种原因,当 XPath 表达式“//tr[td[1]//input[@disabled]]/td[2]/a/@href”时,IE 的 selenium 驱动程序(在这种情况下是在版本 9 上测试)给出错误如其中一个响应中所述使用。由于上述方法工作正常并解决了原始问题,因此该解决方案是完整的。

于 2013-03-16T20:57:52.890 回答