user
user

Reputation: 1381

Capybara drivers for different layouts

I have two drivers

Mobile:

Capybara.register_driver :selenium do |app|
  args = []
  args << "-user-agent='Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'"
  Capybara::Selenium::Driver.new(app, :browser => :chrome, :args => args)

end

Desktop:

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

and currently i add it for each test and it's a bit inconvenient.

I want to set it up in my spec_helper,but how i can do it?

The result should look like this:

if folder.mobile?
 use mobile driver 
else 
 desktop driver
end 

Upvotes: 1

Views: 865

Answers (2)

user
user

Reputation: 1381

i have done it

inside spec_helper

config.before(:each) do
  mobile = config.instance_variable_get(:@files_or_directories_to_run)[0].include?('mobile')
  if mobile
    Capybara.register_driver :selenium do |app|
      args = []
      args << "-user-agent='Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'"
      Capybara::Selenium::Driver.new(app, :browser => :chrome, :args => args)
    end
  else
    Capybara.register_driver :selenium do |app|
      Capybara::Selenium::Driver.new(app, :browser => :chrome)
    end
  end
end

upd:

it works only if you run tests separatly

for example

rspec spec/mobile/... etc 

but if run just rspec it wan't work

Upvotes: 0

Thomas Walpole
Thomas Walpole

Reputation: 49890

There are multiple ways to switch drivers per test but the first step is to define your drivers with different names so you can switch between them rather than continuously redefining them

Capybara.register_driver :selenium_mobile do |app|
  args = []
  args << "-user-agent='Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'"
  Capybara::Selenium::Driver.new(app, :browser => :chrome, :args => args)
end

Capybara.register_driver :selenium do |app|
  Capybara::Selenium::Driver.new(app, :browser => :chrome)
end

Then assuming you are using the normal capybara/rspec config you can tag your mobile features with driver: :selenium_mobile

feature "do something mobile", driver: :selenium_mobile do
  ...
end

or if you want to base it on the directory you can do something like

RSpec.before(:each) do |example|
  if self.class.include?(Capybara::DSL) and example.file_path.include?('mobile')
    Capybara.current_driver = :selenium_mobile
  end
end

The exact config needed would depend on how exactly you're configuring drivers for your non-mobile tests.

Upvotes: 4

Related Questions