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

尝试这样的事情。

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

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

于 2012-12-28T10:04:05.537 回答
0

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

Xpath

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

按 ID 选择

//div/div/table/tbody/tr[@id>0 和@id<4]

按位置选择

//div/div/table/tbody/tr[position()>0 and position()<4]

红宝石代码

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

希望这可以帮助!

于 2013-02-06T22:36:34.287 回答