как использовать капибару и селен в обычном классе - PullRequest
0 голосов
/ 27 октября 2019

Наше приложение после определенной транзакции должно войти в стороннюю систему и ввести некоторые данные. Сделал системный тест с Capybara и селеном, и это прекрасно работает, однако это при запуске его на тесте. Я хотел бы создать класс / службу, которая будет работать в ActiveJob, чтобы делать то же самое, поэтому после сохранения транзакции я бы хотел вызвать ActiveJob.perform_later (params), и параметры должны передаваться в класс external_system_integration. и запустить без головы, чтобы войти на сторонний сайт и ввести данные, полученные в параметрах.

Как это сделать?

Мой класс

require 'capybara/dsl'
require 'capybara/rspec'
require "selenium/webdriver"

class OrderDeskService
    Capybara.default_driver = :webkit
    include Capybara::DSL


    def self.login
        Capybara.register_driver :chrome do |app|
            profile = Selenium::WebDriver::Chrome::Profile.new
            profile["download.default_directory"] = DOWNLOAD_PATH
            Capybara::Selenium::Driver.new(app, :browser => :chrome, :profile => profile)
        end

        Capybara.configure do |config|
            config.run_server = false
            config.app_host = 'https://app.orderdesk.me'
        end
        visit '/login'
        sleep 10
    end
end

РЕДАКТИРОВАТЬ после обратной связи:


Capybara.configure do |c|
    c.run_server = false
    c.app_host = 'https://app.orderdesk.me'
end

#Configure
Capybara.register_driver :selenium do |app|
    profile = Selenium::WebDriver::Chrome::Profile.new
    profile["download.default_directory"] = DOWNLOAD_PATH
    Capybara::Selenium::Driver.new(app, :browser => :chrome, :profile => profile)
end
#headless
Capybara.register_driver :headless_chrome do |app|
    capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
        chromeOptions: {
            args: %w[headless disable-gpu enable-features=NetworkService,NetworkServiceInProcess]
        }
    )
    Capybara::Selenium::Driver.new app,
                                                                 browser: :chrome,
                                                                 desired_capabilities: capabilities
end



#make it thread safe
Capybara.threadsafe = true

Capybara.default_driver = Capybara.javascript_driver = :headless_chrome


class OrderDeskService
    include Capybara::DSL

    def self.login
        session = Capybara::Session.new(:selenium)
        session.visit '/login'
        sleep 3
        session.quit
    end
end

Попытка запустить в режиме без головы, но он по-прежнему открывает браузер Chrome.

1 Ответ

1 голос
/ 27 октября 2019

Определенно возможно использовать Capybara в классе, но то, как вы пытаетесь (вызывая методы класса Capybaras), может вступить в конфликт с вашими системными тестами и вызвать всевозможные головные боли. Вместо этого вы хотите использовать ручное управление сеансом в своем классе и вызывать методы капибары в этом сеансе.

Capybara.register_driver :my_driver do |app|
  # Only needs to be done once
  ...
end

class OrderDeskService
  def self.login
    session = Capybara::Session.new(:my_driver)
    session.visit('https://app.orderdesk.me/login')
    ,,,
    session.quit
  end
end

Если вы хотите, чтобы сеанс длился дольше, чем один вызов метода, сохраните его в переменной классаи позвоните выйти в нужное время. Если вы хотите, чтобы более чем один сеанс мог быть активным одновременно, используйте вместо этого переменные / методы экземпляра. Более продвинутым было бы включение Capybaras в «потокобезопасном» режиме, который делает большинство настроек конфигурации специфичными для сессии / потока

Capybara.register_driver :my_driver do |app|
  # Only needs to be done once
  ...
end

Capybara.threadsafe = true

class OrderDeskService
  def self.login
    session = Capybara::Session.new(:my_driver) do |c|
      c.app_host = 'https://app.orderdesk.me'
      c.... # any other Capybara session configs that need to apply to this session
    end
    session.visit('/login')
    ,,,
    session.quit
  end
end    
...