检查和修改nokogiri中的元素

时间:2012-11-26 05:28:57

标签: ruby xpath capybara

假设我有以下代码的倍数(每个代码具有不同的表单名称,productForm_1,.._ 2 ... _等等):

<form id="productForm_7" name="productForm_3" method="post" action="/send/coded.cfm" style="width:110px; display:inline;">    
<div>
    <input type="hidden" value="24775643" name="productID">
    <input class="btn_addToCart" type="submit" value=" " style="cursor:pointer;">
</div>
</form>

如何更改capybara-webkit中的productID? 由于按钮没有名称/值,我该如何指定按钮?

我试过

page.find_field('productForm_7').find_field("productID").value

但这似乎根本不起作用。

*对不起,我是capybara / nokogiri的新手

2 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

  • 正如shioyama指出你不应该改变隐藏场的价值。如果它真的在页面上发生了变化 - 如果页面有一些脚本则很可能 - 你应该尝试以相同的方式从测试中触发更改。
  • find_field发现字段不是表单。你的第一个发现是错的,但你的第二个是正确的。请尝试:page.find('#productForm_7').find_field("productID").value。 Capybaras通用查找方法默认使用CSS选择器。以同样的方式,您可以使用按钮的CSS类找到按钮page.find('#productForm_7').find(".btn_addToCart").value

然而,更多的水豚风格是这样的:

within '#productForm_7' do
  # fill in values.... for example fill_in '#productID', :with => '123456'
  find('.btn_addToCart').click
end

答案 1 :(得分:0)

一种简单的方法,让你做你想做的事:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<form id="productForm_7" name="productForm_3" method="post" action="/send/coded.cfm" style="width:110px; display:inline;">    
<div>
    <input type="hidden" value="24775643" name="productID">
    <input class="btn_addToCart" type="submit" value=" " style="cursor:pointer;">
</div>
</form>
EOT

doc.search('form').select{ |form| form['id'][/productForm_\d+/] }.each do |form|
  hidden_input = form.at('input[name="productID"]')
  hidden_input['value'] = (hidden_input['value'].to_i + 1).to_s
  button = form.at('input.btn_addToCart')
  # do something with button...
end