是否有内置的Capybara方法多次单击元素?

时间:2017-04-20 18:44:39

标签: ruby-on-rails capybara integration-testing

我有一张带有' +'用于增加另一个标记内的数值的图标。

所以对于Capybara,我可以点击它:

all('.qty-input')[0].find('.more').click

但我希望能够通过变量设置点击量。我试过这样做,但它引发了一个错误,因为click不接受任何参数。

all('.qty-input')[0].find('.more').click(number_of_clicks)

我想我可以创建一个简单的方法,就像这样,但是有必要吗?没有任何内置的Capybara可以进行多次点击吗?

def multiple_clicks element, number_of_clicks
   number_of_clicks.times{|n| element.click}
end

编辑:

我放在那里的原始代码是

def multiple_clicks element, number_of_clicks
   number_of_clicks.map{|n| element.click}
end

哪个没有意义,所以我使用times而不是map方法对其进行了编辑。

2 个答案:

答案 0 :(得分:1)

不,Capybara没有像内置的那样

答案 1 :(得分:0)

您可以使用times循环迭代x次,具体取决于您为该变量指定的值,例如:

quantity = 10
element = browser.find(:xpath, '//*[@id="hej"]')
quantity.times do |index|
  element.click
end

点击hej内容为10次的元素。

以这种情况为例,每次点击都会增加一个计数器的input类型按钮,以及一个显示当前点击总数的p标签

<script>
  let countClicks = 0;
  document.querySelector('#hej').addEventListener('click', function() {
    countClicks++;
    document.querySelector('#total').innerHTML = countClicks;
  });
</script>

然后使用Capybara,您还可以在p标记内获得该总数:

puts browser.find(:xpath, '//*[@id="total"]').text

正如托马斯评论的那样,每次在块中找到元素以点击它都是很昂贵的。

element = browser.find(:xpath, '//*[@id="total"]')

Benchmark.bm do |x|
  x.report { 10.times { element.text } }
  x.report { 10.times { browser.find(:xpath, '//*[@id="total"]').text } }
end

user     system      total        real
0.000000   0.000000   0.000000 (  0.012083)
0.010000   0.000000   0.010000 (  0.042713)