0

テーブルから複数の行を選択し、それらの行にいくつかの設定を適用するテストを自動化するスクリプトを作成しています(グループで選択することにより)。そのためには、テーブルから複数の行を選択する必要がありますが、Selenium を使用してそれらの行を選択することはできません。

次のコードを使用して試しました(CTRL +行を選択)が、機能しません-

$driver.action.key_down(:control).perform
$driver.find_element(:xpath, ".//*[@id='1']/div/div/table/tbody/tr[1]").click
$driver.find_element(:xpath, ".//*[@id='2']/div/div/table/tbody/tr[2]").click
$driver.find_element(:xpath, ".//*[@id='3']/div/div/table/tbody/tr[3]").click

以下はウェブコンテンツです -

<div id="abc" class="unselectable dataTable" emptylineuptext="Lineup is Empty" ...>
  <div class="xyz">
    <div class="def" style="min-height: 3024px;">
      <table class="buffer" style="margin-top: 0px;">
       <tbody>
        <tr id="1" draggable="true">
        <td>
        <td>NA</td>
        </td>   
        </tr>

        <tr id="2" draggable="true">
        <td>
        <td>NA</td>
        </td>   
        </tr>

        <tr id="3" draggable="true">
        <td>
        <td>NA</td>
        </td>   
        </tr>

        <tr>
        .
        .
        .
        </tr>
    </tbody>
  </table>
</div>

手動で、テーブルから複数の行を選択できます。誰かが私に解決策を教えてもらえますか?

4

2 に答える 2

0

xpath式にエラーがあるようです。2つのdiv、次にテーブルなどを含む階層の最上位に、IDが「1」、「2」、または「3」の要素を期待しているように思われます。xpathとRubyコードの両方を構築する簡単な方法があると思います。

Xpath

まず、複数のテーブル行を選択するのに十分な堅牢性を備えた単一のxpathを取得する必要があります。<tr>数値位置とIDの両方で選択する必要があるかどうかはわかりませんが、どちらの方法でも機能させることができます。必要な範囲の種類はわかりませんが、次の2つのxpathのいずれかを変更して、必要な範囲を取得できます。

IDで選択

// div / div / table / tbody / tr[@id>0および@id<4]

位置で選択

// div / div / table / tbody / tr [position()> 0およびposition()<4]

Rubyコード

次に行う必要があるのは、必要なすべての要素を含む配列を作成することです。Seleniumでブラウザー要素として機能する値を宣言できるのと同じ方法で、ブラウザー要素にそれぞれ対応する複数の値を含む配列を宣言できます。あれは:

foo = $driver.find_element(:xpath, "//div/div/table/tbody/tr[1]/td[2]")
foo.text

配列の1つの要素barを使用するのと同じです。

bar[0] = $driver.find_element(:xpath, "//div/div/table/tbody/tr[1]/td[2]")
bar[0].text

これらは両方とも、上記のサンプルページを使用して「NA」を返します。

ここで、すべての要素をまとめて取得し、「各」イテレータで各要素を順番にクリックする必要があります。これには.find_elementsを使用できます。これは.find_elementとまったく同じように機能しますが、ページから可能なすべての一致を配列として返します。このような:

foo = $driver.find_elements(:xpath, "//div/div/table/tbody/tr[@id>0 and @id<4]")
foo.each do |element|
  element.click
end

お役に立てれば!

于 2013-02-06T22:36:34.287 に答える
0

このようなことを試してみてください。

$driver.action.key_down(:control).click("1st row").click("2nd row")..key_up(:control).perform

PS : Python selenium バインディングについてはよくわかりません。上記のロジックでアイデアが得られることを願っています。

于 2012-12-28T10:04:05.537 に答える