Ruby 使用Watir自动扩展树和选择复选框

Ruby 使用Watir自动扩展树和选择复选框,ruby,checkbox,tree,watir,treenode,Ruby,Checkbox,Tree,Watir,Treenode,在站点上,有一个节点树,每个节点都与一个复选框关联。然后,这些节点将进一步展开为更多复选框。 它看起来类似于以下内容,其中[]表示复选框: + [] All + [] Fruit + [] Vegetables 然后像这样展开: + [] All - [] Fruit [] apple - [] Vegetables [] potato [] cucumber <td onmouseover="TreeView_H

在站点上,有一个节点树,每个节点都与一个复选框关联。然后,这些节点将进一步展开为更多复选框。 它看起来类似于以下内容,其中[]表示复选框:

+ [] All
   + [] Fruit
   + [] Vegetables
然后像这样展开:

+ [] All
   - [] Fruit
        [] apple
   - [] Vegetables
        [] potato
        [] cucumber
<td onmouseover="TreeView_HoverNode(ContentPlaceHolder1_tvPartners_Data, this)" onmouseout="TreeView_UnhoverNode(this)" style="white-space:nowrap;" class="">
  <input type="checkbox" name="ContentPlaceHolder1_tvPartnersn2CheckBox" id="ContentPlaceHolder1_tvPartnersn2CheckBox">
  <a class="ContentPlaceHolder1_tvPartners_0" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$tvPartners','s0\\0\\189')" onclick="TreeView_SelectNode(ContentPlaceHolder1_tvPartners_Data, this,'ContentPlaceHolder1_tvPartnerst2');" id="ContentPlaceHolder1_tvPartnerst2">
  <font style="color:#FF0000;">apple</font>
</td>
然后在屏幕底部有一个按钮,按下该按钮时,会显示所选项目的价格

我想在Watir中编写一个脚本,执行以下事件序列:

1) Expands the node Fruit
2) Checks apple
3) Clicks the run button
4) Unchecks apple
5) Expands the node Vegetables
6) Checks potato
7) Clicks the run button
8) Unchecks potato
etc.. for all checkboxes and nodes
apple复选框的标记如下所示:

+ [] All
   - [] Fruit
        [] apple
   - [] Vegetables
        [] potato
        [] cucumber
<td onmouseover="TreeView_HoverNode(ContentPlaceHolder1_tvPartners_Data, this)" onmouseout="TreeView_UnhoverNode(this)" style="white-space:nowrap;" class="">
  <input type="checkbox" name="ContentPlaceHolder1_tvPartnersn2CheckBox" id="ContentPlaceHolder1_tvPartnersn2CheckBox">
  <a class="ContentPlaceHolder1_tvPartners_0" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$tvPartners','s0\\0\\189')" onclick="TreeView_SelectNode(ContentPlaceHolder1_tvPartners_Data, this,'ContentPlaceHolder1_tvPartnerst2');" id="ContentPlaceHolder1_tvPartnerst2">
  <font style="color:#FF0000;">apple</font>
</td>

更新:这里是更多的HTML。实际上,我有一个哈希设置为itemlist[[n,item]]=item,例如itemlist[[1,item]]=apple,其中包含我需要检查价格的所有项目。是否有一种方法/更容易查看每个复选框的文本,然后查看if itemlist.has_value?checkbox_text然后选中该框并将该文本分配给另一个哈希?基本上,是否有方法根据文本而不是复选框的id来选中复选框

<td><a id="ContentPlaceHolder1_tvPartnersn0" href="javascript:TreeView_ToggleNode(ContentPlaceHolder1_tvPartners_Data,0,document.getElementById(&#39;ContentPlaceHolder1_tvPartnersn0&#39;),&#39;-&#39;,document.getElementById(&#39;ContentPlaceHolder1_tvPartnersn0Nodes&#39;))"><img src="/WebResource.axd?d=VNrMPzAA2o87avzl3UgiY8OisS6wrOp46COe6QqNhDQHCsy9zX-GTuzHAKk7njulOEns3hNoLIxbv9x1bv530iY_Shsd9ZHlF3pm4jNQi6u0zB6atkT0-K9kirzHDQNHYxlY8Q2&amp;t=634963835619397560" alt="Collapse All (133,060)" style="border-width:0;" /></a></td><td onmouseover="TreeView_HoverNode(ContentPlaceHolder1_tvPartners_Data, this)" onmouseout="TreeView_UnhoverNode(this)" style="white-space:nowrap;"><input type="checkbox" name="ContentPlaceHolder1_tvPartnersn0CheckBox" id="ContentPlaceHolder1_tvPartnersn0CheckBox" /><a class="ContentPlaceHolder1_tvPartners_0" href="javascript:__doPostBack(&#39;ctl00$ContentPlaceHolder1$tvPartners&#39;,&#39;s0&#39;)" onclick="TreeView_SelectNode(ContentPlaceHolder1_tvPartners_Data, this,&#39;ContentPlaceHolder1_tvPartnerst0&#39;);" id="ContentPlaceHolder1_tvPartnerst0">All (133,060)</a></td>
                </tr>
            </table><div id="ContentPlaceHolder1_tvPartnersn0Nodes" style="display:block;">
                <table cellpadding="0" cellspacing="0" style="border-width:0;">
                    <tr>
                        <td><div style="width:20px;height:1px"></div></td><td><a id="ContentPlaceHolder1_tvPartnersn1" href="javascript:TreeView_ToggleNode(ContentPlaceHolder1_tvPartners_Data,1,document.getElementById(&#39;ContentPlaceHolder1_tvPartnersn1&#39;),&#39;t&#39;,document.getElementById(&#39;ContentPlaceHolder1_tvPartnersn1Nodes&#39;))"><img src="/WebResource.axd?d=D2aGfOHUjBmg4quHNr-mKkyc5juoGHdurzZqtoCU3qo2d457eKX9x0d2AS3LrrQULzPjC-9wC6hLlMxSFEvU6c9r8LmzgOeKWAi6ouEEkShvclKr0&amp;t=634963835619397560" alt="Expand Ace Communications Group (0) &lt;img src=&#39;images/emergency.png&#39; alt=&#39;alert&#39; />" style="border-width:0;" /></a></td><td onmouseover="TreeView_HoverNode(ContentPlaceHolder1_tvPartners_Data, this)" onmouseout="TreeView_UnhoverNode(this)" style="white-space:nowrap;"><input type="checkbox" name="ContentPlaceHolder1_tvPartnersn1CheckBox" id="ContentPlaceHolder1_tvPartnersn1CheckBox" /><a class="ContentPlaceHolder1_tvPartners_0" href="javascript:__doPostBack(&#39;ctl00$ContentPlaceHolder1$tvPartners&#39;,&#39;s0\\0&#39;)" onclick="TreeView_SelectNode(ContentPlaceHolder1_tvPartners_Data, this,&#39;ContentPlaceHolder1_tvPartnerst1&#39;);" id="ContentPlaceHolder1_tvPartnerst1">Fruit </a></td>
                    </tr>
                </table><div id="ContentPlaceHolder1_tvPartnersn1Nodes" style="display:none;">
                    <table cellpadding="0" cellspacing="0" style="border-width:0;">
                        <tr>
                            <td><div style="width:20px;height:1px"></div></td><td><div style="width:20px;height:1px"><img src="/WebResource.axd?d=UZyrk961AUQRa1Dg14aXeNUU3AZcfF9PiakU0o_cO8MfbyWz58k50vr47p2ICDOjgAqF5UX_lVIhbj_y2BqKRU5Xwhic3cBNooK1CBd_cGP6COn60&amp;t=634963835619397560" alt="" /></div></td><td><img src="/WebResource.axd?d=OftTkmJCEf6tGohvvdo_cbMxdnyHMLxScANk1YxbAhfKKp3_gvqoKFAIbK4gGFAKMagH78cKVSIS61WrK5fGcCaHWVUMPjXLTtDZIJISdqqtXFNI0&amp;t=634963835619397560" alt="" /></td><td onmouseover="TreeView_HoverNode(ContentPlaceHolder1_tvPartners_Data, this)" onmouseout="TreeView_UnhoverNode(this)" style="white-space:nowrap;"><input type="checkbox" name="ContentPlaceHolder1_tvPartnersn2CheckBox" id="ContentPlaceHolder1_tvPartnersn2CheckBox" /><a class="ContentPlaceHolder1_tvPartners_0" href="javascript:__doPostBack(&#39;ctl00$ContentPlaceHolder1$tvPartners&#39;,&#39;s0\\0\\189&#39;)" onclick="TreeView_SelectNode(ContentPlaceHolder1_tvPartners_Data, this,&#39;ContentPlaceHolder1_tvPartnerst2&#39;);" id="ContentPlaceHolder1_tvPartnerst2"><font style='color:#FF0000;'>apple</font>  </a></td>
                        </tr>
                    </table>
                </div><table cellpadding="0" cellspacing="0" style="border-width:0;">
                    <tr>
                        <td><div style="width:20px;height:1px"></div></td><td><a id="ContentPlaceHolder1_tvPartnersn3" href="javascript:TreeView_ToggleNode(ContentPlaceHolder1_tvPartners_Data,3,document.getElementById(&#39;ContentPlaceHolder1_tvPartnersn3&#39;),&#39;t&#39;,document.getElementById(&#39;ContentPlaceHolder1_tvPartnersn3Nodes&#39;))"><img src="/WebResource.axd?d=D2aGfOHUjBmg4quHNr-mKkyc5juoGHdurzZqtoCU3qo2d457eKX9x0d2AS3LrrQULzPjC-9wC6hLlMxSFEvU6c9r8LmzgOeKWAi6ouEEkShvclKr0&amp;t=634963835619397560" alt="Expand Advantage (0)" style="border-width:0;" /></a></td><td onmouseover="TreeView_HoverNode(ContentPlaceHolder1_tvPartners_Data, this)" onmouseout="TreeView_UnhoverNode(this)" style="white-space:nowrap;"><input type="checkbox" name="ContentPlaceHolder1_tvPartnersn3CheckBox" id="ContentPlaceHolder1_tvPartnersn3CheckBox" /><a class="ContentPlaceHolder1_tvPartners_0" href="javascript:__doPostBack(&#39;ctl00$ContentPlaceHolder1$tvPartners&#39;,&#39;s0\\0&#39;)" onclick="TreeView_SelectNode(ContentPlaceHolder1_tvPartners_Data, this,&#39;ContentPlaceHolder1_tvPartnerst3&#39;);" id="ContentPlaceHolder1_tvPartnerst3">Vegetable</a></td>
                    </tr>
                </table><div id="ContentPlaceHolder1_tvPartnersn3Nodes" style="display:none;">
                    <table cellpadding="0" cellspacing="0" style="border-width:0;">
                        <tr>
                            <td><div style="width:20px;height:1px"></div></td><td><div style="width:20px;height:1px"><img src="/WebResource.axd?d=UZyrk961AUQRa1Dg14aXeNUU3AZcfF9PiakU0o_cO8MfbyWz58k50vr47p2ICDOjgAqF5UX_lVIhbj_y2BqKRU5Xwhic3cBNooK1CBd_cGP6COn60&amp;t=634963835619397560" alt="" /></div></td><td><img src="/WebResource.axd?d=yCq0KCcfK0lqwrgCU1UxuFJ0bJHMKjxD6S5t8OvIWXwTUBOYh1ZiQA4lD3ZpRuMNI-itrPIn3_rFzvZtrMP5g7PyyensT-Z003WldrY9pIgMSY5p0&amp;t=634963835619397560" alt="" /></td><td onmouseover="TreeView_HoverNode(ContentPlaceHolder1_tvPartners_Data, this)" onmouseout="TreeView_UnhoverNode(this)" style="white-space:nowrap;"><input type="checkbox" name="ContentPlaceHolder1_tvPartnersn4CheckBox" id="ContentPlaceHolder1_tvPartnersn4CheckBox" /><a class="ContentPlaceHolder1_tvPartners_0" href="javascript:__doPostBack(&#39;ctl00$ContentPlaceHolder1$tvPartners&#39;,&#39;s0\\0\\119&#39;)" onclick="TreeView_SelectNode(ContentPlaceHolder1_tvPartners_Data, this,&#39;ContentPlaceHolder1_tvPartnerst4&#39;);" id="ContentPlaceHolder1_tvPartnerst4">potato</a></td>
                        </tr>
                    </table><table cellpadding="0" cellspacing="0" style="border-width:0;">
                        <tr>
                            <td><div style="width:20px;height:1px"></div></td><td><div style="width:20px;height:1px"><img src="/WebResource.axd?d=UZyrk961AUQRa1Dg14aXeNUU3AZcfF9PiakU0o_cO8MfbyWz58k50vr47p2ICDOjgAqF5UX_lVIhbj_y2BqKRU5Xwhic3cBNooK1CBd_cGP6COn60&amp;t=634963835619397560" alt="" /></div></td><td><img src="/WebResource.axd?d=yCq0KCcfK0lqwrgCU1UxuFJ0bJHMKjxD6S5t8OvIWXwTUBOYh1ZiQA4lD3ZpRuMNI-itrPIn3_rFzvZtrMP5g7PyyensT-Z003WldrY9pIgMSY5p0&amp;t=634963835619397560" alt="" /></td><td onmouseover="TreeView_HoverNode(ContentPlaceHolder1_tvPartners_Data, this)" onmouseout="TreeView_UnhoverNode(this)" style="white-space:nowrap;"><input type="checkbox" name="ContentPlaceHolder1_tvPartnersn5CheckBox" id="ContentPlaceHolder1_tvPartnersn5CheckBox" /><a class="ContentPlaceHolder1_tvPartners_0" href="javascript:__doPostBack(&#39;ctl00$ContentPlaceHolder1$tvPartners&#39;,&#39;s0\\0\\1&#39;)" onclick="TreeView_SelectNode(ContentPlaceHolder1_tvPartners_Data, this,&#39;ContentPlaceHolder1_tvPartnerst5&#39;);" id="ContentPlaceHolder1_tvPartnerst5">cucumber</a></td>
                        </tr>

与硬编码1到250的循环不同,您应该使用集合来查找符合特定条件的所有元素

所以不是

for n in (1...250)
  nodename = "ContentPlaceHolder1_tvPartnersn" + n.to_s
  if ie.a(:id => nodename).exists?
    ie.link(:id, nodename).click
  end
end
应该是

ie.links(:id => /ContentPlaceHolder1_tvPartnersn/).each do |link|
  link.click
end
也可以写成

ie.links(:id => /ContentPlaceHolder1_tvPartnersn/).each(&:click)
这里的关键是ie.links:id=>/contentplaceholder 1\u tvPartnersn/返回与条件或定位器匹配的所有链接。正则表达式正则表达式用于检查id,因为这允许id的部分匹配,即包含文本ContentPlaceholder 1\u tvPartnersn的任何链接id

同样的逻辑也适用于脚本的其余部分请注意,如果没有完整的html示例,我会猜测代码的功能:

#Expand the entire tree
ie.links(:id => /ContentPlaceHolder1_tvPartnersn/).each(&:click)

#Clear the first checkbox
ie.checkbox(:id => "ContentPlaceHolder1_tvPartnersn0CheckBox").clear

#Set and clear each checkbox
checkbox_id = /ContentPlaceHolder1_tvPartnersn/
ie.checkboxes(:id => checkbox_id).each do |checkbox|
  checkbox.set
  puts checkbox.id
  checkbox.clear
end
根据“水果”和“蔬菜”节点的html,它们可能已经被此代码忽略。否则,您可能需要更改复选框id或添加条件检查

更新

如果要根据文本设置复选框,可以执行以下操作:

ie.td(:text => 'apple').checkbox.set

请提供迄今为止您尝试过的代码以及您需要帮助的具体位置,即请限制范围,而不是要求为您编写整个脚本。感谢您的所有帮助Justin Ko!:您能提供更多页面的html吗?理想情况下是像您最初描述的那样完整的树?到目前为止,html示例只包括苹果,但我们对水果的html一无所知。是的,我将包括一个更大的示例。谢谢非常感谢你!不幸的是,所有复选框都是按连续顺序编号的,无法区分节点复选框和其他复选框。此外,All节点编号为0,以便展开树的行从开始折叠整个树:p这可能是它们之间的区别。如果你用整个树的html更新这个问题,我可以给你一个更好的答案。我实际上有一个哈希设置为itemlist[[n,item]]=item,例如itemlist[[1,item]]=apple,其中包含我需要检查价格的所有项目。是否有一种方法/更容易查看每个复选框的文本,然后查看if itemlist.has_value?checkbox_text然后选中该框并将该文本分配给另一个哈希?基本上,是否有方法根据文本而不是复选框的id来选中复选框?再次感谢你!假设您已经知道如何遍历散列,我已经更新了答案,包含了一种基于文本获取复选框的方法。太好了!最后,散列中的值可能并不总是100%匹配复选框的文本,因此我想使用RegExp搜索部分匹配,但如何使用变量执行RegExp?类似于ie.td:text=>/itemlist[[n,item]]]/.checkbox.set的内容,而我正在遍历散列