【问题标题】:Select multiple rows from table using Selenium in ruby在 ruby​​ 中使用 Selenium 从表中选择多行
【发布时间】:2012-12-28 07:17:11
【问题描述】:

我正在编写脚本来自动化测试,我必须从表中选择多行并将一些设置应用于这些行(通过在组中选择它们)。为此,我必须从表中选择多行,但我无法使用 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>

手动,我可以从表中选择多行。 谁能告诉我解决办法?

【问题讨论】:

    标签: ruby selenium-webdriver


    【解决方案1】:

    尝试这样的事情。

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

    P.S:我对 python selenium 绑定了解不多。我希望上面的逻辑能给你一个想法。

    【讨论】:

      【解决方案2】:

      看起来您的 xpath 表达式可能存在错误。在我看来,他们期待一个 id 为“1”、“2”或“3”的元素,位于包含两个 div 的层次结构的顶部,然后是一个表,依此类推。我认为有一种更简单的方法来构建 xpath 和 Ruby 代码。

      Xpath

      首先,您需要获得一个足够健壮的 xpath,以选择多个表行。我不确定是否有必要同时通过数字位置和 ID 选择 &lt;tr&gt;,但您可以通过任何一种方式进行此操作。我不知道你想要什么样的范围,但是你可以修改这两个 xpath 中的任何一个来获得你想要的范围:

      按 ID 选择

      //div/div/table/tbody/tr[@id>0 和@id

      按位置选择

      //div/div/table/tbody/tr[position()>0 和 position()

      Ruby 代码

      接下来您需要做的是创建一个包含所有您想要的元素的数组。与您可以在 Selenium 中声明一个值以充当浏览器元素的方式相同,您可以声明一个数组以包含多个值,每个值对应于一个浏览器元素。那就是:

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

      与仅使用数组的一个元素 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
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2016-10-29
        • 1970-01-01
        • 2019-06-13
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        相关资源
        最近更新 更多