Search code examples
rubycucumbervpnautomated-testsbrowserstack

Automated testing with Cucumber on BrowserStack of site behind VPN


I am trying to get my Cucumber tests to work on BrowserStack. The problem is that our test environments are all behind a VPN. BrowserStack's docs say, just set up local testing and it will just work!. It doesn't. The tests start up, but they are not being rerouted through my local machine to pick up my vpn credentials. I downloaded the binary as instructed by BrowserStack. I started it up with the command

~ ./BrowserStackLocal <my BS key> -forcelocal

Then I run my test with (in a different terminal window):

bundle exec cucumber CURRENT_BROWSER=browserstack features/01_login.feature 

my env.rb looks like this:

require 'cucumber/rails'

Capybara.default_selector = :css

cb = ENV['CURRENT_BROWSER']
testbrowser = cb ? cb.downcase.to_sym : :firefox
puts "-------------- current browser: #{testbrowser}........."
Capybara.register_driver :selenium do |app|
  if RbConfig::CONFIG['host_os'][/linux/] && testbrowser.to_s.eql?("CHROME".downcase)
    Capybara::Selenium::Driver.new(app, {:browser => :remote, :url => "http://127.0.0.1:9515"})
  else
    if testbrowser.eql?(:chrome)
      prefs = {
          :download => {
              :prompt_for_download => false,
              :default_directory => DownloadHelpers::PATH.to_s
          }
      }
      Capybara::Selenium::Driver.new(app, :browser => :chrome, :prefs => prefs, :switches => %w[--test-type])
    elsif testbrowser.eql?(:browserstack)
      stackToUse = ENV['BS_STACK'] || 'ie_9'
      json = JSON.load(open(File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'browsers.json'))))
      config = json[stackToUse]
      unless config
        puts "invalid BS_STACK specified. Was '#{stackToUse}'"
        return
      end

      # Add default config
      config['name'] = "#{config['os']} #{config['os_version']} - #{Time.now.strftime '%Y-%m-%d %H:%M'}"
      config['acceptSslCert'] = true
      config['browserstack.debug'] = true
      Capybara::Selenium::Driver.new(app, :browser => :remote, :desired_capabilities => config, :url => "http://<BS_USERNAME>:<BS_PASSKEY>@hub.browserstack.com/wd/hub")
    elsif testbrowser.eql?(:internetexplorer)
      Capybara::Selenium::Driver.new(app, :browser => :internetexplorer, :switches => %w[--test-type])
    else
      profile = Selenium::WebDriver::Firefox::Profile.new
      profile
      profile["browser.download.dir"] = DownloadHelpers::PATH.to_s
      profile["browser.download.folderList"] = 2 # 2 - save to user defined location
      profile["browser.download.manager.alertOnEXEOpen"] = false
      profile["browser.helperApps.neverAsk.saveToDisk"] = "application/msword, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream, data:application/csv"
      profile["browser.helperApps.alwaysAsk.force"] = false
      profile["browser.download.manager.showWhenStarting"] = false
      profile["browser.download.manager.focusWhenStarting"] = false
      profile["browser.download.useDownloadDir"] = true
      profile["browser.download.manager.alertOnEXEOpen"] = false
      profile["browser.download.manager.closeWhenDone"] = true
      profile["browser.download.manager.showAlertOnComplete"] = false
      profile["browser.download.manager.useWindow"] = false

profile["services.sync.prefs.sync.browser.download.manager.showWhenStarting"] = false
      profile["pdfjs.disabled"] = true
      Capybara::Selenium::Driver.new(app, :browser => testbrowser, :profile => profile)
    end
  end
end

ActionController::Base.allow_rescue = false

# Remove/comment out the lines below if your app doesn't have a database.
# For some databases (like MongoDB and CouchDB) you may need to use :truncation instead.
begin
  DatabaseCleaner.strategy = :transaction
rescue NameError
  raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
end

# You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios.
# See the DatabaseCleaner documentation for details. Example:
#
#   Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do
#     # { :except => [:widgets] } may not do what you expect here
#     # as tCucumber::Rails::Database.javascript_strategy overrides
#     # this setting.
#     DatabaseCleaner.strategy = :truncation
#   end
#
#   Before('~@no-txn', '~@selenium', '~@culerity', '~@celerity', '~@javascript') do
#     DatabaseCleaner.strategy = :transaction
#   end
#

# Possible values are :truncation and :transaction
# The :transaction strategy is faster, but might give you threading problems.
# See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
Cucumber::Rails::Database.javascript_strategy = :truncation

Other people use these same tests and we have written dozens, so making sure that I can still run these tests locally is paramount. When I do run the tests, it begins to run on browserstack, but it can't reach any of the sites I have tried telling it to reach. Including http://localhost:3000/login I have contacted BrowserStack support and they asked if I had set up local testing. The only error I am getting is that the test can't find the CSS element to login. When I watched the automated test through browserstack I can see that it isn't reaching the page. It just says "Oops! This link appears to be broken." Any suggestions would be most appreciated.


Solution

  • The support at BrowserStack got back to me. I had to had another config property like so to the env.rb:

    config['browserstack.local'] = true
    

    Now my only problem is that none of the features that we wrote seem to work on IE. So I can test chrome or firefox on browserstack, but I already had that capability set up.