2013-03-12 4 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

(당신이 지금까지 시도 코드와 정확히 어디에 도움이 필요을 제공하십시오 즉, 전체 스크립트를 요구하는 대신 범위를 제한하십시오). –

+0

저스틴 코의 모든 도움에 감사드립니다! :) – walterfaye

+0

페이지의 html을 더 많이 제공 할 수 있습니까? 이상적으로 원래 설명한 것과 같은 전체 트리입니까? 지금까지 html 샘플에는 "apple"만 포함되어 있지만 "fruit"에 대해서는 html에 대해 알지 못합니다. –

답변

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(&:click) 

로 기록 될 수

ie.links(:id => /ContentPlaceHolder1_tvPartnersn/).each do |link| 
    link.click 
end 

열쇠는 여기입니다 ie.links(:id => /ContentPlaceHolder1_tvPartnersn/) 반환 기준과 일치하는 모든 링크 또는 로케이터. 정규 표현식 (정규 표현식)은 id를 부분적으로 일치시킬 수 있도록 id를 검사하는 데 사용됩니다 (즉, 텍스트가 들어있는 모든 링크 ID ContentPlaceHolder1_tvPartnersn).

#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에 따라 :

동일한 논리는 스크립트의 나머지 부분에 적용 할 수있는 (완전한 HTML 샘플없이 점에 유의, 당신의 코드가하는 일에 조금 추측 오전) '과일'및 '채소'노드가 있으면이 코드에서 이미 무시할 수 있습니다. 그렇지 않으면 checkbox_id를 변경하거나 조건부 검사를 추가해야 할 수도 있습니다.

업데이트

당신이 텍스트를 기반으로 체크 박스를 설정하려면, 당신은 할 수 있습니다 :

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

정말 고마워요! 불행히도 모든 체크 박스는 연속 된 순서로 번호가 매겨지며 노드 체크 박스와 다른 체크 박스를 구별 할 방법이 없습니다. 또한 "All"노드의 번호가 0이므로 트리를 확장하는 줄이 전체 트리를 축소합니다. : P – walterfaye

+0

차이점을 구분할 가능성이 있습니다. 전체 트리에 대한 html로 질문을 업데이트하면 더 나은 대답을 줄 수 있습니다. –

+0

실제로 itemlist [[n, "item"]] = item으로 설정 한 해시를 가지고 있습니다. itemlist [[1, "item"]] = apple, 가격을 확인해야하는 항목이 모두 들어 있습니다. 방법이 있습니까/각 체크 박스에 텍스트가 있는지 쉽게 확인한 다음 itemlist.has_value? (checkbox_text) 상자를 선택하고 해당 텍스트를 다른 해시에 할당하면 어떻게됩니까? 기본적으로 체크 박스의 ID 대신 텍스트를 기준으로 상자를 확인하는 방법이 있습니까? 다시 감사합니다! – walterfaye