我正在编写脚本来自动化测试,我要从表格和表格中选择多行。将一些设置应用于这些行(通过在组中选择它们)。为此,我将不得不从表中选择多行,但我无法使用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>
手动,我可以从表中选择多行。 有人可以告诉我解决方案吗?
答案 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来选择多个表行。我不确定是否有必要通过数字位置和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]
接下来您需要做的是创建一个包含所需元素的数组。与在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
希望这有帮助!