From b731dd63e82212c9ff8c6b72895ad7d69d163b15 Mon Sep 17 00:00:00 2001 From: Alvaro Laserna Date: Tue, 14 Nov 2023 16:19:49 +0000 Subject: [PATCH 1/7] add 4. selenium version to get compatibility with Selenium Grid 4. --- lib/core/device_drivers.rb | 2 +- testray.gemspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/device_drivers.rb b/lib/core/device_drivers.rb index 0b517e1d..47bd97c6 100644 --- a/lib/core/device_drivers.rb +++ b/lib/core/device_drivers.rb @@ -194,7 +194,7 @@ def build_chrome_driver(chrome_ops) "goog:chromeOptions": chrome_ops, ) driver = Selenium::WebDriver.for( - :remote, url: @url, desired_capabilities: remoteChromeOptions, + :remote, url: @url, options: remoteChromeOptions, ) end return driver diff --git a/testray.gemspec b/testray.gemspec index 110715cd..8ce69cb7 100644 --- a/testray.gemspec +++ b/testray.gemspec @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| spec.add_runtime_dependency "httparty" spec.add_runtime_dependency "json" spec.add_runtime_dependency "rest-client" - spec.add_runtime_dependency "selenium-webdriver", "3.142.7" + spec.add_runtime_dependency "selenium-webdriver", "4.4.0" spec.add_runtime_dependency 'screen-recorder', "1.4.0" spec.add_runtime_dependency "colorize" spec.add_runtime_dependency "keisan" From d62689b24c15e624e0d09e2a8847f0bc409b2f4e Mon Sep 17 00:00:00 2001 From: Alvaro Laserna Date: Thu, 16 Nov 2023 08:36:56 +0000 Subject: [PATCH 2/7] fix the code to comply with the new ways of creating browser from caps --- lib/core/device_drivers.rb | 67 +++++++++++++++----------------------- 1 file changed, 27 insertions(+), 40 deletions(-) diff --git a/lib/core/device_drivers.rb b/lib/core/device_drivers.rb index 47bd97c6..6caf8aae 100644 --- a/lib/core/device_drivers.rb +++ b/lib/core/device_drivers.rb @@ -179,22 +179,19 @@ def merge_chrome_ops(config_caps, case_caps) # build the Chrome driver, given a set of options def build_chrome_driver(chrome_ops) + # local selenium instance + chromeOptions = Selenium::WebDriver::Remote::Capabilities.chrome( + "goog:chromeOptions": chrome_ops, + ) if @url.nil? - # local selenium instance - localChromeOptions = Selenium::WebDriver::Chrome::Options.new( - options: chrome_ops, - ) driver = Selenium::WebDriver.for( - :chrome, options: localChromeOptions + :chrome, capabilities: chromeOptions ) else # remote selenium grid log_debug("Selenium Server URL: #{@url}") - remoteChromeOptions = Selenium::WebDriver::Remote::Capabilities.chrome( - "goog:chromeOptions": chrome_ops, - ) driver = Selenium::WebDriver.for( - :remote, url: @url, options: remoteChromeOptions, + :remote, url: @url, options: chromeOptions, ) end return driver @@ -207,21 +204,18 @@ def merge_firefox_ops(config_caps, case_caps) # build the Firefox driver, given a set of options def build_firefox_driver(firefox_ops) + firefoxOptions = Selenium::WebDriver::Remote::Capabilities.firefox( + "moz:firefoxOptions" => firefox_ops, + ) if @url.nil? - localFirefoxOptions = Selenium::WebDriver::Firefox::Options.new( - options: firefox_ops, - ) driver = Selenium::WebDriver.for( - :firefox, options: localFirefoxOptions + :firefox, options: firefoxOptions ) else # remote selenium grid log_debug("Selenium Server URL: #{@url}") - remoteFirefoxOptions = Selenium::WebDriver::Remote::Capabilities.firefox( - "moz:firefoxOptions" => firefox_ops, - ) driver = Selenium::WebDriver.for( - :remote, url: @url, desired_capabilities: remoteFirefoxOptions, + :remote, url: @url, options: firefoxOptions, ) end return driver @@ -232,21 +226,20 @@ def merge_safari_ops(config_caps, case_caps) end def build_safari_driver(safari_ops) + # TODO: Check how to add safari options, this code does not work + # But it does not break the creation of safari webdriver + safariOptions = Selenium::WebDriver::Remote::Capabilities.safari( + "apple:safariOptions": safari_ops, + ) if @url.nil? - localSafariOptions = Selenium::WebDriver::Safari::Options.new( - options: safari_ops, - ) driver = Selenium::WebDriver.for( - :safari, options: localSafariOptions + :safari, options: safariOptions ) else # remote selenium grid log_debug("Selenium Server URL: #{@url}") - remoteSafariOptions = Selenium::WebDriver::Remote::Capabilities.safari( - safari_ops, - ) driver = Selenium::WebDriver.for( - :remote, url: @url, desired_capabilities: remoteSafariOptions, + :remote, url: @url, options: safariOptions, ) end return driver @@ -257,21 +250,18 @@ def merge_ie_ops(config_caps, case_caps) end def build_ie_driver(ie_ops) + iEOptions = Selenium::WebDriver::Remote::Capabilities.ie( + "se:ieOptions" => ie_ops, + ) if @url.nil? - localIEOptions = Selenium::WebDriver::IE::Options.new( - options: ie_ops, - ) driver = Selenium::WebDriver.for( - :ie, options: localIEOptions + :ie, options: iEOptions ) else # remote selenium grid log_debug("Selenium Server URL: #{@url}") - remoteIEOptions = Selenium::WebDriver::Remote::Capabilities.ie( - "se:ieOptions" => ie_ops, - ) driver = Selenium::WebDriver.for( - :remote, url: @url, desired_capabilities: remoteIEOptions, + :remote, url: @url, desired_capabilities: iEOptions, ) end return driver @@ -282,19 +272,16 @@ def merge_edge_ops(config_caps, case_caps) end def build_edge_driver(edge_ops) + edgeOptions = Selenium::WebDriver::Remote::Capabilities.edge( + "ms:edgeOptions" => edge_ops, + ) if @url.nil? - localEdgeOptions = Selenium::WebDriver::Edge::Options.new( - options: edge_ops, - ) driver = Selenium::WebDriver.for( - :edge, options: localEdgeOptions + :edge, options: edgeOptions ) else # remote selenium grid log_debug("Selenium Server URL: #{@url}") - remoteEdgeOptions = Selenium::WebDriver::Remote::Capabilities.edge( - "ms:edgeOptions" => edge_ops, - ) driver = Selenium::WebDriver.for( :remote, url: @url, desired_capabilities: remoteEdgeOptions, ) From 8835cbc5ad5c857229feb2ac60e47c6e9e13638d Mon Sep 17 00:00:00 2001 From: Alvaro Laserna Date: Thu, 16 Nov 2023 12:26:32 +0000 Subject: [PATCH 3/7] new way of adding caps --- examples/tests/cases/case_av_example.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/tests/cases/case_av_example.yaml b/examples/tests/cases/case_av_example.yaml index 9a33c219..3d29cecd 100644 --- a/examples/tests/cases/case_av_example.yaml +++ b/examples/tests/cases/case_av_example.yaml @@ -48,7 +48,6 @@ TestBrowserSafariAV: - Role: desktopSafari Capabilities: safariOptions: - prefs: media.navigator.streams.fake: true media.navigator.permission.disabled: true App: desktop From fb2d9f4bd7aca42de4e97d1ce2ed2834b1709f07 Mon Sep 17 00:00:00 2001 From: Alvaro Laserna Date: Thu, 16 Nov 2023 12:26:48 +0000 Subject: [PATCH 4/7] new way of adding caps --- lib/core/device_drivers.rb | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/lib/core/device_drivers.rb b/lib/core/device_drivers.rb index 6caf8aae..1198a3bd 100644 --- a/lib/core/device_drivers.rb +++ b/lib/core/device_drivers.rb @@ -180,18 +180,20 @@ def merge_chrome_ops(config_caps, case_caps) # build the Chrome driver, given a set of options def build_chrome_driver(chrome_ops) # local selenium instance - chromeOptions = Selenium::WebDriver::Remote::Capabilities.chrome( - "goog:chromeOptions": chrome_ops, + args = chrome_ops['args'] + prefs = chrome_ops['prefs'] + ops = Selenium::WebDriver::Chrome::Options.new( + args: args, prefs: prefs ) if @url.nil? driver = Selenium::WebDriver.for( - :chrome, capabilities: chromeOptions + :chrome, options: ops ) else # remote selenium grid log_debug("Selenium Server URL: #{@url}") driver = Selenium::WebDriver.for( - :remote, url: @url, options: chromeOptions, + :remote, url: @url, options: ops, ) end return driver @@ -204,8 +206,11 @@ def merge_firefox_ops(config_caps, case_caps) # build the Firefox driver, given a set of options def build_firefox_driver(firefox_ops) - firefoxOptions = Selenium::WebDriver::Remote::Capabilities.firefox( - "moz:firefoxOptions" => firefox_ops, + args = firefox_ops['args'] + prefs = firefox_ops['prefs'] + profile = firefox_ops['profile'] + firefoxOptions = Selenium::WebDriver::Firefox::Options.new( + args: args, prefs: prefs, profile: profile ) if @url.nil? driver = Selenium::WebDriver.for( @@ -228,9 +233,10 @@ def merge_safari_ops(config_caps, case_caps) def build_safari_driver(safari_ops) # TODO: Check how to add safari options, this code does not work # But it does not break the creation of safari webdriver - safariOptions = Selenium::WebDriver::Remote::Capabilities.safari( - "apple:safariOptions": safari_ops, - ) + safariOptions = Selenium::WebDriver::Safari::Options.new() + safari_ops.each do |name, value| + safariOptions.add_option(name + ":" + value.to_s) + end if @url.nil? driver = Selenium::WebDriver.for( :safari, options: safariOptions @@ -250,8 +256,9 @@ def merge_ie_ops(config_caps, case_caps) end def build_ie_driver(ie_ops) - iEOptions = Selenium::WebDriver::Remote::Capabilities.ie( - "se:ieOptions" => ie_ops, + args = ie_ops['args'] + iEOptions = Selenium::WebDriver::IE::Options.new( + args: args ) if @url.nil? driver = Selenium::WebDriver.for( @@ -272,8 +279,10 @@ def merge_edge_ops(config_caps, case_caps) end def build_edge_driver(edge_ops) - edgeOptions = Selenium::WebDriver::Remote::Capabilities.edge( - "ms:edgeOptions" => edge_ops, + args = edge_ops['args'] + prefs = edge_ops['prefs'] + edgeOptions = Selenium::WebDriver::Edge::Options.new( + args: args, prefs: prefs ) if @url.nil? driver = Selenium::WebDriver.for( From 4b46e86d7bfe2121facea7056381d12f2517141b Mon Sep 17 00:00:00 2001 From: Alvaro Laserna Date: Thu, 16 Nov 2023 12:28:29 +0000 Subject: [PATCH 5/7] fix remote options --- lib/core/device_drivers.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/core/device_drivers.rb b/lib/core/device_drivers.rb index 1198a3bd..4592ab76 100644 --- a/lib/core/device_drivers.rb +++ b/lib/core/device_drivers.rb @@ -268,7 +268,7 @@ def build_ie_driver(ie_ops) # remote selenium grid log_debug("Selenium Server URL: #{@url}") driver = Selenium::WebDriver.for( - :remote, url: @url, desired_capabilities: iEOptions, + :remote, url: @url, options: iEOptions, ) end return driver @@ -292,7 +292,7 @@ def build_edge_driver(edge_ops) # remote selenium grid log_debug("Selenium Server URL: #{@url}") driver = Selenium::WebDriver.for( - :remote, url: @url, desired_capabilities: remoteEdgeOptions, + :remote, url: @url, options: remoteEdgeOptions, ) end return driver From dafd77df726ec09d583f0e009f222936b6abfcd9 Mon Sep 17 00:00:00 2001 From: Alvaro Laserna Date: Thu, 16 Nov 2023 14:36:09 +0000 Subject: [PATCH 6/7] better the parsing caps and remote driver creation --- lib/core/device_drivers.rb | 58 +++++++++++--------------------------- 1 file changed, 17 insertions(+), 41 deletions(-) diff --git a/lib/core/device_drivers.rb b/lib/core/device_drivers.rb index 4592ab76..ead8cf24 100644 --- a/lib/core/device_drivers.rb +++ b/lib/core/device_drivers.rb @@ -180,21 +180,13 @@ def merge_chrome_ops(config_caps, case_caps) # build the Chrome driver, given a set of options def build_chrome_driver(chrome_ops) # local selenium instance - args = chrome_ops['args'] - prefs = chrome_ops['prefs'] - ops = Selenium::WebDriver::Chrome::Options.new( - args: args, prefs: prefs - ) + ops = Selenium::WebDriver::Chrome::Options.new(**chrome_ops) if @url.nil? driver = Selenium::WebDriver.for( :chrome, options: ops ) else - # remote selenium grid - log_debug("Selenium Server URL: #{@url}") - driver = Selenium::WebDriver.for( - :remote, url: @url, options: ops, - ) + driver = build_remote_driver(ops) end return driver end @@ -206,22 +198,15 @@ def merge_firefox_ops(config_caps, case_caps) # build the Firefox driver, given a set of options def build_firefox_driver(firefox_ops) - args = firefox_ops['args'] - prefs = firefox_ops['prefs'] - profile = firefox_ops['profile'] firefoxOptions = Selenium::WebDriver::Firefox::Options.new( - args: args, prefs: prefs, profile: profile + **firefox_ops ) if @url.nil? driver = Selenium::WebDriver.for( :firefox, options: firefoxOptions ) else - # remote selenium grid - log_debug("Selenium Server URL: #{@url}") - driver = Selenium::WebDriver.for( - :remote, url: @url, options: firefoxOptions, - ) + driver = build_remote_driver(firefoxOptions) end return driver end @@ -242,11 +227,7 @@ def build_safari_driver(safari_ops) :safari, options: safariOptions ) else - # remote selenium grid - log_debug("Selenium Server URL: #{@url}") - driver = Selenium::WebDriver.for( - :remote, url: @url, options: safariOptions, - ) + driver = build_remote_driver(safariOptions) end return driver end @@ -256,20 +237,13 @@ def merge_ie_ops(config_caps, case_caps) end def build_ie_driver(ie_ops) - args = ie_ops['args'] - iEOptions = Selenium::WebDriver::IE::Options.new( - args: args - ) + iEOptions = Selenium::WebDriver::IE::Options.new(**ie_ops) if @url.nil? driver = Selenium::WebDriver.for( :ie, options: iEOptions ) else - # remote selenium grid - log_debug("Selenium Server URL: #{@url}") - driver = Selenium::WebDriver.for( - :remote, url: @url, options: iEOptions, - ) + driver = build_remote_driver(iEOptions) end return driver end @@ -279,22 +253,24 @@ def merge_edge_ops(config_caps, case_caps) end def build_edge_driver(edge_ops) - args = edge_ops['args'] - prefs = edge_ops['prefs'] edgeOptions = Selenium::WebDriver::Edge::Options.new( - args: args, prefs: prefs + **edge_ops ) if @url.nil? driver = Selenium::WebDriver.for( :edge, options: edgeOptions ) else - # remote selenium grid - log_debug("Selenium Server URL: #{@url}") - driver = Selenium::WebDriver.for( - :remote, url: @url, options: remoteEdgeOptions, - ) + driver = build_remote_driver(edgeOptions) end return driver end + + def build_remote_driver(options) + # remote selenium grid + log_debug("Selenium Server URL: #{@url}") + return Selenium::WebDriver.for( + :remote, url: @url, options: options, + ) + end end \ No newline at end of file From bd802204dae55547eef0c2a8d25641c40755dff3 Mon Sep 17 00:00:00 2001 From: Alvaro Laserna Date: Mon, 20 Nov 2023 09:30:27 +0100 Subject: [PATCH 7/7] add safari same builder as the rest of browsers --- examples/tests/cases/case_av_example.yaml | 9 +++++---- lib/core/device_drivers.rb | 7 +++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/tests/cases/case_av_example.yaml b/examples/tests/cases/case_av_example.yaml index 3d29cecd..febaf643 100644 --- a/examples/tests/cases/case_av_example.yaml +++ b/examples/tests/cases/case_av_example.yaml @@ -46,10 +46,11 @@ TestBrowserChromeAV: TestBrowserSafariAV: Roles: - Role: desktopSafari - Capabilities: - safariOptions: - media.navigator.streams.fake: true - media.navigator.permission.disabled: true + # TODO: Safari options are not yet implemented in selenium + # Capabilities: + # safariOptions: + # media.navigator.streams.fake: true + # media.navigator.permission.disabled: true App: desktop Actions: - Type: navigate diff --git a/lib/core/device_drivers.rb b/lib/core/device_drivers.rb index ead8cf24..2ca9c767 100644 --- a/lib/core/device_drivers.rb +++ b/lib/core/device_drivers.rb @@ -218,10 +218,9 @@ def merge_safari_ops(config_caps, case_caps) def build_safari_driver(safari_ops) # TODO: Check how to add safari options, this code does not work # But it does not break the creation of safari webdriver - safariOptions = Selenium::WebDriver::Safari::Options.new() - safari_ops.each do |name, value| - safariOptions.add_option(name + ":" + value.to_s) - end + safariOptions = Selenium::WebDriver::Safari::Options.new( + **safari_ops + ) if @url.nil? driver = Selenium::WebDriver.for( :safari, options: safariOptions