jenkins-bot has submitted this change and it was merged.

Change subject: Support all SauceLabs provided browsers
......................................................................


Support all SauceLabs provided browsers

Refactored base browser factory to allow for instantiation of any
browser supported by the underlying implementation, Watir and SauceLabs.

Added additional support for configuring the iPhone/Android device name
and orientation.

Bug: T114362
Change-Id: I5e80b80a4bf65f738cac90a2216ae92256e28128
---
A features/saucelabs_browsers.feature
M features/step_definitions/saucelabs_steps.rb
M lib/mediawiki_selenium/browser_factory.rb
M lib/mediawiki_selenium/browser_factory/base.rb
M lib/mediawiki_selenium/remote_browser_factory.rb
M spec/browser_factory/base_spec.rb
A spec/browser_factory_spec.rb
M spec/remote_browser_factory_spec.rb
8 files changed, 87 insertions(+), 5 deletions(-)

Approvals:
  Zfilipin: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/features/saucelabs_browsers.feature 
b/features/saucelabs_browsers.feature
new file mode 100644
index 0000000..90edacf
--- /dev/null
+++ b/features/saucelabs_browsers.feature
@@ -0,0 +1,21 @@
+Feature: Support for entire suite of browsers provided by SauceLabs
+  Background:
+    Given I have configured my environment from `ENV`
+      And I have set "SAUCE_ONDEMAND_USERNAME" in my shell
+      And I have set "SAUCE_ONDEMAND_ACCESS_KEY" in my shell
+
+  Scenario Outline: All SauceLabs browsers are supported
+    Given I have configured my environment to use <browser> on <platform>
+    When I start interacting with the browser
+    Then the browser is open
+
+  Examples:
+    | browser           | platform   |
+    | firefox           | linux      |
+    | firefox           | windows    |
+    | chrome            | linux      |
+    | chrome            | windows    |
+    | internet_explorer | windows    |
+    | safari            | os x 10.11 |
+    | android           | linux      |
+    | iphone            | os x 10.11 |
diff --git a/features/step_definitions/saucelabs_steps.rb 
b/features/step_definitions/saucelabs_steps.rb
index 89900a1..d8814ea 100644
--- a/features/step_definitions/saucelabs_steps.rb
+++ b/features/step_definitions/saucelabs_steps.rb
@@ -1,5 +1,10 @@
 require 'net/https'
 
+Given(/^I have configured my environment to use (.*?) on (.*?)$/) do |browser, 
platform|
+  @configs = [ENV, { browser: browser, platform: platform, browser_timeout: 
120 }]
+  @env = MediawikiSelenium::Environment.new(*@configs)
+end
+
 Then(/^the SauceLabs job should be marked as failed$/) do
   job_id = @env.browser.driver.session_id
 
diff --git a/lib/mediawiki_selenium/browser_factory.rb 
b/lib/mediawiki_selenium/browser_factory.rb
index 143c40f..1b98a78 100644
--- a/lib/mediawiki_selenium/browser_factory.rb
+++ b/lib/mediawiki_selenium/browser_factory.rb
@@ -5,7 +5,9 @@
     autoload :Chrome, 'mediawiki_selenium/browser_factory/chrome'
     autoload :Phantomjs, 'mediawiki_selenium/browser_factory/phantomjs'
 
-    # Resolves and instantiates a new factory for the given browser name.
+    # Resolves and instantiates a new factory for the given browser name. If a
+    # specific implementation is not defined for the given browser, a `Base`
+    # factory will be returned.
     #
     # @example Create a new firefox factory
     #   factory = BrowserFactory.new(:firefox)
@@ -17,7 +19,14 @@
     # @return [BrowserFactory::Base]
     #
     def self.new(browser_name)
-      factory_class = 
const_get(browser_name.to_s.split('_').map(&:capitalize).join(''))
+      factory_class_name = 
browser_name.to_s.split('_').map(&:capitalize).join('')
+
+      if const_defined?(factory_class_name)
+        factory_class = const_get(factory_class_name)
+      else
+        factory_class = Base
+      end
+
       factory_class.new(browser_name)
     end
   end
diff --git a/lib/mediawiki_selenium/browser_factory/base.rb 
b/lib/mediawiki_selenium/browser_factory/base.rb
index 70a6815..372b339 100644
--- a/lib/mediawiki_selenium/browser_factory/base.rb
+++ b/lib/mediawiki_selenium/browser_factory/base.rb
@@ -227,7 +227,7 @@
       end
 
       def new_browser(options)
-        Watir::Browser.new(options[:desired_capabilities].browser_name, 
options)
+        Watir::Browser.new(browser_name, options)
       end
     end
   end
diff --git a/lib/mediawiki_selenium/remote_browser_factory.rb 
b/lib/mediawiki_selenium/remote_browser_factory.rb
index 341d0ed..66f27f4 100644
--- a/lib/mediawiki_selenium/remote_browser_factory.rb
+++ b/lib/mediawiki_selenium/remote_browser_factory.rb
@@ -9,6 +9,8 @@
   #  - sauce_ondemand_access_key
   #  - platform
   #  - version
+  #  - device_name
+  #  - device_orientation
   #
   module RemoteBrowserFactory
     REQUIRED_CONFIG = [:sauce_ondemand_username, :sauce_ondemand_access_key]
@@ -37,6 +39,14 @@
         base.configure(:version) do |version, options|
           options[:desired_capabilities].version = version
         end
+
+        base.configure(:device_name) do |device_name, options|
+          options[:desired_capabilities]['deviceName'] = device_name
+        end
+
+        base.configure(:device_orientation) do |device_orientation, options|
+          options[:desired_capabilities]['deviceOrientation'] = 
device_orientation
+        end
       end
     end
 
diff --git a/spec/browser_factory/base_spec.rb 
b/spec/browser_factory/base_spec.rb
index 18d4308..04038bc 100644
--- a/spec/browser_factory/base_spec.rb
+++ b/spec/browser_factory/base_spec.rb
@@ -97,8 +97,6 @@
       before do
         expect(Selenium::WebDriver::Remote::Capabilities).to 
receive(browser_name).
           at_least(:once).and_return(capabilities)
-        expect(capabilities).to receive(:browser_name).
-          at_least(:once).and_return(browser_name)
       end
 
       it 'creates a new Watir::Browser' do
diff --git a/spec/browser_factory_spec.rb b/spec/browser_factory_spec.rb
new file mode 100644
index 0000000..dad88b1
--- /dev/null
+++ b/spec/browser_factory_spec.rb
@@ -0,0 +1,21 @@
+require 'spec_helper'
+
+module MediawikiSelenium
+  describe BrowserFactory do
+    describe '.new' do
+      context 'given a browser that has a specific implementation' do
+        subject { BrowserFactory.new(:firefox) }
+
+        it 'instantiates the concrete factory class' do
+          expect(subject).to be_a(BrowserFactory::Firefox)
+        end
+      end
+
+      context 'given a browser that has no specific implementation' do
+        subject { BrowserFactory.new(:lynx) }
+
+        it { is_expected.to be_a(BrowserFactory::Base) }
+      end
+    end
+  end
+end
diff --git a/spec/remote_browser_factory_spec.rb 
b/spec/remote_browser_factory_spec.rb
index 4db3fc8..eeb0292 100644
--- a/spec/remote_browser_factory_spec.rb
+++ b/spec/remote_browser_factory_spec.rb
@@ -47,6 +47,24 @@
           subject
         end
       end
+
+      context 'given a device name' do
+        let(:config) { { device_name: 'tabliphone' } }
+
+        it 'configures the deviceName' do
+          expect(capabilities).to receive(:[]=).with('deviceName', 
'tabliphone')
+          subject
+        end
+      end
+
+      context 'given a device orientation' do
+        let(:config) { { device_orientation: 'portrait' } }
+
+        it 'configures the deviceOrientation' do
+          expect(capabilities).to receive(:[]=).with('deviceOrientation', 
'portrait')
+          subject
+        end
+      end
     end
 
     describe '#teardown' do

-- 
To view, visit https://gerrit.wikimedia.org/r/258394
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I5e80b80a4bf65f738cac90a2216ae92256e28128
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/selenium
Gerrit-Branch: master
Gerrit-Owner: Dduvall <dduv...@wikimedia.org>
Gerrit-Reviewer: Hashar <has...@free.fr>
Gerrit-Reviewer: Zfilipin <zfili...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to