使用红宝石中的Selenium从表中选择多行

时间:2012-12-28 07:17:12

标签: ruby selenium-webdriver

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

 

手动,我可以从表中选择多行。 有人可以告诉我解决方案吗?

2 个答案:

答案 0 :(得分:0)

尝试这样的事情。

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

P.S:我对python selenium绑定知之甚少。我希望上面的逻辑会给你一个想法。

答案 1 :(得分:0)

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

Xpath的

首先,您需要获得足够强大的单个xpath来选择多个表行。我不确定是否有必要通过数字位置和ID来选择<tr>,但是你可以以任何方式使这个工作。我不知道你想要什么样的范围,但你可以修改这两个xpath中的任何一个来获得你想要的范围:

按ID选择

// div / div / table / tbody / tr [@ id&gt; 0和@ id&lt; 4]

按位置选择

// div / div / table / tbody / tr [position()&gt; 0和position()&lt; 4]

Ruby Code

接下来您需要做的是创建一个包含所需元素的数组。与在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

希望这有帮助!