【问题标题】:How to select an option field inside a table with Mechanize?如何使用 Mechanize 在表格中选择选项字段?
【发布时间】:2013-12-12 20:04:36
【问题描述】:

我正在尝试使用 Mechanize 从以下 html 代码(由 OpenCart 生成)中选择 <option value="20">Betaling ontvangen via Bank</option>

<div class="vtabs-content" id="tab-history" style="display: block;">
  <div id="history">
  <table class="form">
    <tbody>
      <tr>
        <td>Bestelstatus:</td>

        <td><select name="order_status_id">
          <option value="23">Bestelling geannuleerd</option>

          <option value="17">Bestelling ontvangen</option>

          <option selected="selected" value="24">Bestelling verzonden</option>

          <option value="22">Betaling mislukt</option>

          <option value="20">Betaling ontvangen via Bank</option>

          <option value="19">Betaling ontvangen via PayPal</option>

          <option value="21">Betaling via Bank mislukt</option>

          <option value="18">Betaling via PayPal mislukt</option>

          <option value="25">Gereed voor afhalen (Delft)</option>

          <option value="26">Wachten op betaling</option>
        </select></td>
      </tr>

      <tr>
        <td>Mail naar klant:<span class="help">Wel zichtbaar voor klant bij
        de bestelinfo.</span></td>

        <td><input name="notify" type="checkbox" value="1"></td>
      </tr>

      <tr>
        <td>Opmerkingen</td>

        <td>
          <textarea cols="40" name="comment" rows="8" style="width: 99%"></textarea>

          <div style="margin-top: 10px; text-align: right;">
            <a class="button" id="button-history" name=
            "button-history">Geschiedenis bijwerken</a>
          </div>
        </td>
      </tr>
    </tbody>
  </table>
</div>

我现在正在做的是:

puts single_order_page.field_with(:name => 'order_status_id').options[0].select

打印出来:

exampleshop.rb:44:in `block in <main>': undefined method `field_with' for #<Mechanize::Page:0x007f8ea514abf0> (NoMethodError)
    from /Users/narekaramjan/.rvm/gems/ruby-2.0.0-p353@global/gems/mechanize-2.7.3/lib/mechanize.rb:442:in `get'
    from exampleshop.rb:7:in `<main>'

puts single_order_page 打印出页面的完整 HTML 代码。您可以在此处查看完整代码:http://pastebin.com/pe5pjMzB

pp single_order_page 打印出此代码:http://pastebin.com/ezSWWqi0

有什么想法吗?

更新

POST请求更新订单状态:

$('#button-history').live('click', function() {
    $.ajax({
        url: 'index.php?route=sale/order/history&token=545c8c415eb6641f29efc9e0b1180d2b&order_id=260',
        type: 'post',
        dataType: 'html',
        data: 'order_status_id=' + encodeURIComponent($('select[name=\'order_status_id\']').val()) + '&notify=' + encodeURIComponent($('input[name=\'notify\']').attr('checked') ? 1 : 0) + '&append=' + encodeURIComponent($('input[name=\'append\']').attr('checked') ? 1 : 0) + '&comment=' + encodeURIComponent($('textarea[name=\'comment\']').val()),
        beforeSend: function() {
            $('.success, .warning').remove();
            $('#button-history').attr('disabled', true);
            $('#history').prepend('<div class="attention"><img src="view/image/loading.gif" alt="" /> Even wachten a.u.b.</div>');
        },
        complete: function() {
            $('#button-history').attr('disabled', false);
            $('.attention').remove();
        },
        success: function(html) {
            $('#history').html(html);
            
            $('textarea[name=\'comment\']').val('');
            
            $('#order-status').html($('select[name=\'order_status_id\'] option:selected').text());
        }
    });
});

【问题讨论】:

    标签: html ruby opencart mechanize


    【解决方案1】:

    我会这样做:

    page = single_order_page.parser
    
    desired_element = page.search('//select[name="order_status_id"]/option[@value="20"]')
    

    之后就可以随心所欲了。

    【讨论】:

    • 我想选择该选项并单击一个按钮以发送通知邮件。我使用puts 来检查我是否选择了正确的选项。不要认为代码在这种情况下会起作用,还是我错了?
    • 如果我理解你是正确的,你只需要发送请求的值吗? “正确的选项”是匹配“Betaling ontvangen via Bank”的选项?
    • 值是通过 GET 还是 POST 请求发送的?如果是 GET 请求,您可以复制带有参数的 URL 吗?
    • 我发现了一段 JavaScript 代码,它通过 POST 请求发送值。看看更新的问题。代码由 OpenCart 生成。
    【解决方案2】:

    这是因为field_withForm 方法,而不是Page 方法。

    你想做这样的事情:

    page = agent.get url
    form = page.forms[0]
    form['order_status_id'] = 20
    next_page = form.submit
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多