首页 > 解决方案 > Capybara,可以访问 Selenium 操作吗?

问题描述

回答:原来需要做的就是添加.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 的评论。我正在尝试使用 Capybara 与 Selenium WebDriver 和 Apparition javascript_driver 在测试中访问 Selenium API 操作:

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 本身中(如此处所述),但我似乎无法找到正确的方法/语法结构来发挥它的作用。

注意:我目前正在使用带有幻影驱动程序的 Rails 6 和 Capybara。~~据我所知,幻影被设计为 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不是“真实”Selenium::Webdriver而是包含在 Capybara 中的事实有关,alaCapybara::Selenium::Driver

我可以做些什么来在我的 Rails 系统测试中使用这些与 Selenium 相关的方法/操作?如果不使用 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

标签: ruby-on-railsselenium-webdrivercapybaraapparition

解决方案


幻影绝对不是硒+附加物。事实上,它开始更多是作为 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中定义,但您将使用可能在任何版本上中断的私有 API


推荐阅读