水豚,可以访问 Selenium 操作吗?

Capybara, possible to access Selenium actions?

答案:原来需要做的就是添加 .perform 操作。生成的代码如下所示:

start_x = 450
start_y = 450
offset = 50
page.driver.browser.action
  .move_to_location(start_x, start_y)
  .pointer_down(:left)
  .move_by(offset, offset)
  .pointer_up(:left)
  .perform

特别感谢@Thomas_Walpole的帮助! :)


更新:感谢@Thomas Walpole 的评论,这是我现在正在尝试的。我正在尝试访问测试中的 Selenium API 操作,将 Capybara 与 Selenium WebDriver 和 Apparition javascript_driver:

结合使用
start_x = 450
start_y = 450
offset = 50
page.driver.browser.action
  .move_to_location(start_x, start_y)
  .pointer_down(:left)
  .move_by(offset, offset)
  .pointer_up(:left)

并再次尝试使用 .find_element

target = page.driver.browser.find_element(:css, '.cropper-canvas')
puts "#{target}" 
  => #<Selenium::WebDriver::ELement:0x0000557b0ef5bf48
offset = 50
page.driver.browser.action
  .move_to(target)
  .pointer_down(:left)
  .move_by(offset, offset)
  .pointer_up(:left)

在任何一种情况下,测试似乎都已完成,但实际上什么也没有发生(一旦绘制了裁剪区域,就会在实时浏览器中触发一大堆事情)。

我做错了什么?


我正在尝试访问 Selenium 的一些操作,以尝试填补 Capybara 中未提供的一些内容的空白。这可能吗?

例如,我正在尝试测试点击并拖动操作以模拟用户在图像上选择裁剪区域,但据我所知,Capybara 中不存在此类功能.然而,它似乎存在于 Selenium Webdriver 本身 (as outlined here) 中,但我似乎找不到合适的 methods/syntax 结构来发挥它的作用。

注意:我目前正在使用 Rails 6 和 Capybara 以及 Apparition 驱动程序。 ~~据我所知,Apparition 被设计为 Selenium+Extras。所以这就是为什么我要专门询问Selenium,并且~~如果它对我的问题有帮助,我可以改回Selenium。

到目前为止,我的理解是可以在系统测试 *.rb 文件中使用 page.driver

访问驱动程序方法
cropper_canvas = find('.cropper-canvas')
x_offset = 20
y_offset = 20
page.driver.browser.drag_and_drop_by(cropper_canvas, x_offset, y_offset)

我还尝试使用

重新创建点击和拖动
page.driver.browser.click_and_hold(cropper_canvas).move_by_offset(x_offset, y_offset).release

但是这两种方法都没有通过。我怀疑这与以下事实有关:活动的 page.driver 不是 "true" Selenium::Webdriver,而是包含在水豚中,ala Capybara::Selenium::Driver

我可以做些什么来在我的 Rails 系统测试中使用这些与 Selenium 相关的 methods/actions 吗?如果不使用 Capybara,那么我可以尝试另一种方法吗?

在此先感谢您的帮助或见解!我刚刚开始学习系统测试,所以如果我没有正确提及事物或我的电线有点交叉,我深表歉意。

test_helper.rb

require_relative '../config/environment'
require 'rails/test_help'
...
require 'capybara/rails'
require 'capybara/minitest'
require 'capybara-screenshot/minitest'
require 'capybara/apparition'
...
Capybara.default_driver = :selenium_chrome
Capybara.javascript_driver = :apparition

Capybara.register_driver :apparition do |app|
  size = [1366,768]
  options = {
    headless: false,
    windows_size: size,
    screen_size: size,
    timeout: 10,
  }

  Capybara::Apparition::Driver.new(app, options)
end
...
Class ActionDispatch::IntegrationTest
  ...
  include Capybara::DSL
  include Capybara::Minitest::Assertions
end

Apparition 绝对不是 selenium + extras。事实上,它更像是 Poltergeist 和 capybara-webkit API 的组合。 Apparition 实现了 Capybara 所需的驱动程序 API 但没有实现任何其他 Seleniums API 所以简短的回答是如果您使用 Apparition 则无法访问 Selenium 操作。

您也许可以通过

等方法做您想做的事
page.driver.browser.current_page.mouse.<xxxx>

其中可用的鼠标方法在 https://github.com/twalpole/apparition/blob/master/lib/capybara/apparition/page/mouse.rb 中定义,但您将使用私有 APIs,这可能会在任何版本中中断