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

私の勘では、ソリューションはこのための1つのXPath式のように単純であるため、ループを回避でき、コミュニティからフィードバックを得るのに役立ちます。

4

1 に答える 1

0

兄弟や親などで要素をフィルタリングする代わりに、基準に一致するTR要素を選択し、一致したTR内のA要素を取得する方が簡単です。

基準に適合するTR要素は、無効な入力が埋め込まれている要素です。

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

次に、一致した各TR内のA要素を取得する必要があるため、を追加します/td[2]/a

A要素を取得するための最後のXPath式は次のとおりです。

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

これから、最初に行ったのと同じ方法を使用してhref属性を取得できます。

[OPによる編集]今後の参考のために、実際のhref属性を取得するには、パラメーターとして「href」を指定したSelenium IWebElementのGetAttribute()メソッド、つまりGetAttribute( "href")を使用することを言及する価値があります。何らかの理由で、IE用のセレンドライバー(この場合はバージョン9でテスト済み)は、XPath式 "// tr [td [1] // input [@disabled]] / td [2] / a /@href"のときにエラーを出します。応答の1つに記載されているように使用されます。上記の方法は正常に機能し、元の問題を解決するため、この解決策は完了です。

于 2013-03-16T20:57:52.890 に答える