【问题标题】:Ruby fastest way to select button in large tableRuby在大表中选择按钮的最快方法
【发布时间】:2018-08-27 11:54:03
【问题描述】:

我正在尝试与一个网站进行交互,该网站有一个看起来像这样的大表:

    <table id="tblID" cellspacing="1" cellpadding="0" border="0" width="100%">
                        <tbody><tr valign="top" align="left">
                            <td colspan="6" height="10"></td>
                        </tr>

                            <tr><td bgcolor="#666666" height="1" colspan="6"><img src="img.gif" width="1" height="1" border="0"></td></tr>
                                <tr class="GridHeader" valign="top" align="left">
                                    <td width="60"><b>Select</b></td>
                                    <td width="210" colspan="2"><b>Account Type</b></td>                                        
                                    <td width="160" colspan="2"><b>Number</b></td>
                                    <td width="200"><b>Account known as</b></td>                                   
                                </tr>

                                <tr align="left" valign="middle">
                                    <td class="normal"><input type="radio" id="radButton" name="radButton" value="1233399,1515636"></td>
                                    <td class="normal">ACCTYPE</td>
                                    <td class="normal" width="10">&nbsp;</td>
                                    <td class="normal">ACCNUMBER</td>
                                    <td class="normal" width="10">&nbsp;</td>
                                    <td class="normal">ACCNAME</td>
                                </tr>

                                <tr align="left" valign="top">
                                    <td height="1" colspan="6" bgcolor="#cccccc"><img src=".img.gif" width="1" height="1" border="0"></td>
                                </tr>

                                <tr align="left" valign="middle">
                                    <td class="normal"><input type="radio" id="radButton" name="radButton" value="2263763,2777747"></td>
                                    <td class="normal">ACCTYPE</td>
                                    <td class="normal" width="10">&nbsp;</td>
                                    <td class="normal">ACCNUMBER</td>
                                    <td class="normal" width="10">&nbsp;</td>
                                    <td class="normal">ACCNAME</td>
                                </tr>

这持续了数百行。

我的代码的目的是根据 ACCNUMBER 搜索行,然后选择相关的单选按钮。我的代码做到了这一点,但需要很长时间才能做到。

到目前为止,我的 ruby​​ 代码是这样的:

require 'watir'
require 'nokogiri'
html = browser.html
doc = Nokogiri::HTML(html)
*csv import and loop stuff*
bkacc = CSV[0]

*nokogiri go fast!*

rows = doc.css("table[id='tblID'] tbody tr")
rows.each do |row|
    target = row.text[bkacc]
    if !target.nil?
        cells = row.css("td[class='normal']")
        @pushme = cells[0].css('input')[0]['value']
    end
end    

*watir goes slow*

browser.table(:id,"tblMaintenance").tbody.trs(:valign,"middle").find do |tr|
    temp = tr.td(index: 0).radio(:id => "radButton").attribute_value("value") 
    if temp == @pushme
        tr.td(index: 0).radio(:id => "radButton").set
        break
    end
end
*other commands and loop to next line in csv*

使用 nokogiri 找到我要按下的按钮的 :value 非常快,但是一旦找到,使用该 :value 查找和设置带有 watir 的按钮非常慢。

我的问题是;我怎样才能加快速度?我想也许通过使用 mechanize 我可以,但语法让我无法理解。我对 Ruby 还很陌生,所以可能缺少一些基本知识。

【问题讨论】:

    标签: ruby nokogiri mechanize watir


    【解决方案1】:

    假设 id 和 value 属性的组合对于每个单选按钮都是唯一的,您可以直接定位单选按钮。整个 Watir 循环可以替换为:

    browser.radio(:id => "radButton", :value => @pushme).set
    

    或者,我会尝试用以下内容替换两个循环。查找行会比 Nokogiri 方法慢一点,但代码会简单得多。

    row = browser.table(id: 'tblID').tr(text: /#{bkacc}/)
    row.radio.set
    

    【讨论】:

    • 第一个; browser.radio(:id => "radButton", :value => @pushme).set,效果很好,谢谢!第二个虽然比循环快,但每个 ACCNAME 仍然需要 2 分钟。 watir 还抱怨使用 'text:',它已被贬值,并建议使用 visible_text: 我试过但搜索时间更长。
    • 我得看看第二个。我们可能有一些方法可以将 Watir 的性能调整得更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2013-11-21
    • 2015-10-01
    相关资源
    最近更新 更多