1

サイトには、チェックボックスに関連付けられたノードのツリーがあります。これらのノードは、さらに多くのチェックボックスに展開されます。次のようになります。ここで[]、はチェックボックスを表します。

+ [] 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ループをハードコーディングするのではなく、最後のチェックボックス/ノードをチェックしたいと思います。また、FruitやVegetableなどのノードのチェックボックスをスキップしたいと思います。

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

1 に答える 1

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/)、基準またはロケーターに一致するすべてのリンクを返すことです。正規表現(regex)は、ID(つまり、テキストを含む任意のリンクID)の部分的な一致を可能にするため、IDのチェックに使用されますContentPlaceHolder1_tvPartnersn

同じロジックをスクリプトの残りの部分に適用することもできます(完全な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

'fruit'および'vegetable'ノードのhtmlによっては、これらはこのコードによってすでに無視されている可能性があります。それ以外の場合は、checkbox_idを変更するか、条件付きチェックを追加する必要があります。

アップデート

テキストに基づいてチェックボックスを設定する場合は、次の操作を実行できます。

ie.td(:text => 'apple').checkbox.set
于 2013-03-14T13:24:09.360 に答える