2013-03-12 62 views
1

在一個網站上,有一個節點樹,每個節點樹都與一個複選框關聯。那些節點然後進一步擴展到更多複選框。 它看起來類似於以下,其中[]代表一個複選框:自動擴展樹並選擇與Watir複選框

+ [] All 
    + [] Fruit 
    + [] Vegetables 

再擴展這個樣子的:

+ [] All 
    - [] Fruit 
     [] apple 
    - [] Vegetables 
     [] potato 
     [] cucumber 

有那麼在按下時,屏幕底部的按鈕,使你選擇的項目的價格。

我想寫的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 

爲蘋果複選框的標籤是這樣的:

<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> 

此外,還有更多節點和將在稍後添加到列表中的項目,因此我需要腳本將其考慮在內,並按順序通過複選框,而無需調用複選框的特定ID。

任何幫助解決這個問題將不勝感激。非常感謝你!

更新: 我想出了這段代碼,但我想檢查最後一個複選框/節點,而不是硬編碼for循環。我還想跳過節點(如水果和蔬菜)的複選框。

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.checkbox(:id => "ContentPlaceHolder1_tvPartnersn0CheckBox").clear 

x = 1 
for r in (1...250) 
    checkboxname = "ContentPlaceHolder1_tvPartnersn" + x.to_s + "CheckBox" 
    nodename = "ContentPlaceHolder1_tvPartnersn" + r.to_s 

    if ie.a(:id => nodename).exists? 
    x = x+1 
    checkboxname = "ContentPlaceHolder1_tvPartnersn" + x.to_s + "CheckBox" 
    end 

    if ie.checkbox(:id => checkboxname).exists? 
    ie.checkbox(:id => checkboxname).set 
    puts x 
    ie.checkbox(:id => checkboxname).clear  
    end 

    x = x + 1 
end 

更新:這裏是更多的HTML。我實際上有一個散列設置爲itemlist [[n,「item」]] = item,例如itemlist [[1,「item」]] = apple,它包含我需要檢查價格的所有項目。有沒有辦法/更容易看到每個複選框的文本是什麼,然後如果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> 
+2

請提供您迄今爲止嘗試過的代碼,並在那裏正是你需要幫助(即請限制範圍,而不是要求爲您編寫完整的腳本)。 – 2013-03-13 02:25:32

+0

感謝您的幫助Justin Ko! :) – walterfaye 2013-03-13 19:21:14

+0

你可以提供更多的頁面的HTML - 理想情況下,像你最初描述的完整的樹?到目前爲止,html樣本只包含「apple」,但我們對「水果」的html一無所知。 – 2013-03-13 20:42:30

回答

0

您應該使用集合來查找與特定條件相匹配的所有元素,而不是將循環硬編碼爲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 => /ContentPlaceHolder1_tvPartnersn/)返回符合條件的所有鏈接或定位器。正則表達式(正則表達式)用於檢查id,因爲這允許部分匹配id(即包含文本ContentPlaceHolder1_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的'水果'和'蔬菜'節點,他們可能已經被這段代碼忽略了。否則,您可能需要更改checkbox_id或添加條件檢查。

更新

如果你想設置基於文本的複選框,你可以這樣做:

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

非常感謝!不幸的是,所有的複選框都按連續順序編號,並且無法區分節點複選框和其他複選框。另外,「全部」節點編號爲0,因此用於展開樹的線從起點摺疊整個樹。 :P – walterfaye 2013-03-14 17:30:57

+0

區別它們可能有區別。如果你用整個樹的html更新問題,我可以給你一個更好的答案。 – 2013-03-14 17:32:10

+0

我實際上有一個散列設置爲itemlist [[n,「item」]] = item,例如itemlist [[1,「item」]] = apple,它包含我需要檢查價格的所有項目。有沒有辦法/更容易看到每個複選框的文本是什麼,然後如果itemlist.has_value?(checkbox_text)然後選中該框並將該文本分配給另一個散列?基本上,有沒有辦法根據文本而不是複選框的ID來檢查框?再次感謝你! – walterfaye 2013-03-14 17:36:06