testcentricity_web 4.1.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +202 -385
- data/lib/testcentricity_web/version.rb +1 -1
- data/lib/testcentricity_web/web_core/page_object.rb +12 -12
- data/lib/testcentricity_web/web_core/page_section.rb +14 -14
- data/lib/testcentricity_web/web_core/webdriver_helper.rb +194 -237
- data/testcentricity_web.gemspec +4 -5
- metadata +13 -8
| @@ -11,14 +11,18 @@ module TestCentricity | |
| 11 11 |  | 
| 12 12 | 
             
                attr_accessor :bs_local
         | 
| 13 13 | 
             
                attr_accessor :downloads_path
         | 
| 14 | 
            +
                attr_accessor :endpoint
         | 
| 15 | 
            +
                attr_accessor :capabilities
         | 
| 14 16 |  | 
| 15 17 | 
             
                def self.initialize_web_driver(options = nil)
         | 
| 16 | 
            -
                   | 
| 18 | 
            +
                  @endpoint = nil
         | 
| 19 | 
            +
                  @capabilities = nil
         | 
| 17 20 | 
             
                  if options.is_a?(String)
         | 
| 18 21 | 
             
                    Capybara.app_host = options
         | 
| 19 22 | 
             
                  elsif options.is_a?(Hash)
         | 
| 20 23 | 
             
                    Capybara.app_host = options[:app_host] if options.key?(:app_host)
         | 
| 21 | 
            -
                     | 
| 24 | 
            +
                    @endpoint = options[:endpoint] if options.key?(:endpoint)
         | 
| 25 | 
            +
                    @capabilities = options[:desired_capabilities] if options.key?(:desired_capabilities)
         | 
| 22 26 | 
             
                  end
         | 
| 23 27 |  | 
| 24 28 | 
             
                  browser = ENV['WEB_BROWSER']
         | 
| @@ -44,25 +48,19 @@ module TestCentricity | |
| 44 48 |  | 
| 45 49 | 
             
                  context = case browser.downcase.to_sym
         | 
| 46 50 | 
             
                            when :appium
         | 
| 47 | 
            -
                              initialize_appium | 
| 51 | 
            +
                              initialize_appium
         | 
| 48 52 | 
             
                              'mobile device emulator'
         | 
| 49 53 | 
             
                            when :browserstack
         | 
| 50 | 
            -
                              initialize_browserstack | 
| 54 | 
            +
                              initialize_browserstack
         | 
| 51 55 | 
             
                              'Browserstack cloud service'
         | 
| 52 | 
            -
                            when :crossbrowser
         | 
| 53 | 
            -
                              initialize_crossbrowser(desired_caps)
         | 
| 54 | 
            -
                              'CrossBrowserTesting cloud service'
         | 
| 55 | 
            -
                            when :gridlastic
         | 
| 56 | 
            -
                              initialize_gridlastic(desired_caps)
         | 
| 57 | 
            -
                              'Gridlastic cloud service'
         | 
| 58 56 | 
             
                            when :lambdatest
         | 
| 59 | 
            -
                              initialize_lambdatest | 
| 57 | 
            +
                              initialize_lambdatest
         | 
| 60 58 | 
             
                              'LambdaTest cloud service'
         | 
| 61 59 | 
             
                            when :saucelabs
         | 
| 62 | 
            -
                              initialize_saucelabs | 
| 60 | 
            +
                              initialize_saucelabs
         | 
| 63 61 | 
             
                              'Sauce Labs cloud service'
         | 
| 64 62 | 
             
                            when :testingbot
         | 
| 65 | 
            -
                              initialize_testingbot | 
| 63 | 
            +
                              initialize_testingbot
         | 
| 66 64 | 
             
                              'TestingBot cloud service'
         | 
| 67 65 | 
             
                            else
         | 
| 68 66 | 
             
                              if ENV['SELENIUM'] == 'remote'
         | 
| @@ -75,7 +73,7 @@ module TestCentricity | |
| 75 73 | 
             
                            end
         | 
| 76 74 |  | 
| 77 75 | 
             
                  # set browser window size only if testing with a desktop web browser
         | 
| 78 | 
            -
                  unless Environ.is_device? || Capybara.current_driver == :appium
         | 
| 76 | 
            +
                  unless Environ.is_device? || Environ.is_simulator? || Capybara.current_driver == :appium
         | 
| 79 77 | 
             
                    initialize_browser_size
         | 
| 80 78 | 
             
                  end
         | 
| 81 79 |  | 
| @@ -131,7 +129,7 @@ module TestCentricity | |
| 131 129 |  | 
| 132 130 | 
             
                private
         | 
| 133 131 |  | 
| 134 | 
            -
                def self.initialize_appium | 
| 132 | 
            +
                def self.initialize_appium
         | 
| 135 133 | 
             
                  Environ.platform    = :mobile
         | 
| 136 134 | 
             
                  Environ.device_name = ENV['APP_DEVICE']
         | 
| 137 135 | 
             
                  Environ.device_os   = ENV['APP_PLATFORM_NAME'].downcase.to_sym
         | 
| @@ -139,7 +137,7 @@ module TestCentricity | |
| 139 137 | 
             
                  Environ.device_os_version = ENV['APP_VERSION']
         | 
| 140 138 | 
             
                  Environ.device_orientation = ENV['ORIENTATION'] if ENV['ORIENTATION']
         | 
| 141 139 | 
             
                  Capybara.default_driver = :appium
         | 
| 142 | 
            -
                  endpoint = 'http://localhost:4723/wd/hub'
         | 
| 140 | 
            +
                  @endpoint = 'http://localhost:4723/wd/hub' if @endpoint.nil?
         | 
| 143 141 | 
             
                  desired_capabilities = {
         | 
| 144 142 | 
             
                      platformName:    Environ.device_os,
         | 
| 145 143 | 
             
                      platformVersion: Environ.device_os_version,
         | 
| @@ -191,12 +189,12 @@ module TestCentricity | |
| 191 189 | 
             
                    desired_capabilities[:systemPort]   = ENV['SYSTEM_PORT'] if ENV['SYSTEM_PORT']
         | 
| 192 190 | 
             
                  end
         | 
| 193 191 |  | 
| 194 | 
            -
                  unless  | 
| 195 | 
            -
                    desired_capabilities =  | 
| 192 | 
            +
                  unless @capabilities.nil?
         | 
| 193 | 
            +
                    desired_capabilities = @capabilities
         | 
| 196 194 | 
             
                  end
         | 
| 197 195 |  | 
| 198 196 | 
             
                  Capybara.register_driver :appium do |app|
         | 
| 199 | 
            -
                    appium_lib_options = { server_url: endpoint }
         | 
| 197 | 
            +
                    appium_lib_options = { server_url: @endpoint }
         | 
| 200 198 | 
             
                    all_options = {
         | 
| 201 199 | 
             
                      appium_lib: appium_lib_options,
         | 
| 202 200 | 
             
                      caps:       desired_capabilities
         | 
| @@ -231,9 +229,7 @@ module TestCentricity | |
| 231 229 |  | 
| 232 230 | 
             
                  Capybara.register_driver :selenium do |app|
         | 
| 233 231 | 
             
                    case browser
         | 
| 234 | 
            -
                    when :safari
         | 
| 235 | 
            -
                      Capybara::Selenium::Driver.new(app, browser: browser)
         | 
| 236 | 
            -
                    when :ie
         | 
| 232 | 
            +
                    when :safari, :ie
         | 
| 237 233 | 
             
                      Capybara::Selenium::Driver.new(app, browser: browser)
         | 
| 238 234 | 
             
                    when :firefox, :firefox_headless
         | 
| 239 235 | 
             
                      profile = Selenium::WebDriver::Firefox::Profile.new
         | 
| @@ -291,7 +287,7 @@ module TestCentricity | |
| 291 287 | 
             
                    else
         | 
| 292 288 | 
             
                      if ENV['HOST_BROWSER'] && ENV['HOST_BROWSER'].downcase.to_sym == :chrome
         | 
| 293 289 | 
             
                        user_agent = Browsers.mobile_device_agent(ENV['WEB_BROWSER'])
         | 
| 294 | 
            -
                        options = Selenium::WebDriver::Chrome::Options.new
         | 
| 290 | 
            +
                        options = Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
         | 
| 295 291 | 
             
                        options.add_argument('--disable-infobars')
         | 
| 296 292 | 
             
                        options.add_argument('--disable-dev-shm-usage')
         | 
| 297 293 | 
             
                        options.add_argument("--user-agent='#{user_agent}'")
         | 
| @@ -305,7 +301,7 @@ module TestCentricity | |
| 305 301 | 
             
                  Capybara.default_driver = :selenium
         | 
| 306 302 | 
             
                end
         | 
| 307 303 |  | 
| 308 | 
            -
                def self.initialize_browserstack | 
| 304 | 
            +
                def self.initialize_browserstack
         | 
| 309 305 | 
             
                  browser = ENV['BS_BROWSER']
         | 
| 310 306 | 
             
                  Environ.grid = :browserstack
         | 
| 311 307 |  | 
| @@ -323,7 +319,7 @@ module TestCentricity | |
| 323 319 | 
             
                    Environ.os = "#{ENV['BS_OS']} #{ENV['BS_OS_VERSION']}"
         | 
| 324 320 | 
             
                  end
         | 
| 325 321 | 
             
                  # specify endpoint url
         | 
| 326 | 
            -
                  endpoint = "http://#{ENV['BS_USERNAME']}:#{ENV['BS_AUTHKEY']}@hub-cloud.browserstack.com/wd/hub"
         | 
| 322 | 
            +
                  @endpoint = "http://#{ENV['BS_USERNAME']}:#{ENV['BS_AUTHKEY']}@hub-cloud.browserstack.com/wd/hub" if @endpoint.nil?
         | 
| 327 323 | 
             
                  # enable tunneling if specified
         | 
| 328 324 | 
             
                  if ENV['TUNNELING']
         | 
| 329 325 | 
             
                    @bs_local = BrowserStack::Local.new
         | 
| @@ -336,7 +332,7 @@ module TestCentricity | |
| 336 332 | 
             
                    end
         | 
| 337 333 | 
             
                  end
         | 
| 338 334 | 
             
                  # define BrowserStack options
         | 
| 339 | 
            -
                  options = if  | 
| 335 | 
            +
                  options = if @capabilities.nil?
         | 
| 340 336 | 
             
                              browser_options = {}
         | 
| 341 337 | 
             
                              # define the required set of BrowserStack options
         | 
| 342 338 | 
             
                              bs_options = {
         | 
| @@ -372,6 +368,7 @@ module TestCentricity | |
| 372 368 | 
             
                              bs_options[:deviceOrientation] = ENV['ORIENTATION'] if ENV['ORIENTATION']
         | 
| 373 369 | 
             
                              bs_options[:appiumLogs] = ENV['APPIUM_LOGS'] if ENV['APPIUM_LOGS']
         | 
| 374 370 | 
             
                              bs_options[:realMobile] = ENV['BS_REAL_MOBILE'] if ENV['BS_REAL_MOBILE']
         | 
| 371 | 
            +
                              # define mobile device options
         | 
| 375 372 | 
             
                              if ENV['BS_DEVICE']
         | 
| 376 373 | 
             
                                bs_options[:deviceName] = ENV['BS_DEVICE']
         | 
| 377 374 | 
             
                                bs_options[:appiumVersion] = '1.22.0'
         | 
| @@ -380,6 +377,7 @@ module TestCentricity | |
| 380 377 | 
             
                                  'bstack:options': bs_options
         | 
| 381 378 | 
             
                                }
         | 
| 382 379 | 
             
                              else
         | 
| 380 | 
            +
                                # define desktop browser options
         | 
| 383 381 | 
             
                                bs_options[:resolution] = ENV['RESOLUTION'] if ENV['RESOLUTION']
         | 
| 384 382 | 
             
                                bs_options[:seleniumVersion] = '4.1.0'
         | 
| 385 383 | 
             
                                {
         | 
| @@ -389,123 +387,25 @@ module TestCentricity | |
| 389 387 | 
             
                                }
         | 
| 390 388 | 
             
                              end
         | 
| 391 389 | 
             
                            else
         | 
| 392 | 
            -
                               | 
| 390 | 
            +
                              @capabilities
         | 
| 393 391 | 
             
                            end
         | 
| 394 | 
            -
                   | 
| 395 | 
            -
             | 
| 396 | 
            -
             | 
| 397 | 
            -
                  end
         | 
| 398 | 
            -
             | 
| 399 | 
            -
                  Environ.browser = browser
         | 
| 392 | 
            +
                  register_remote_driver(:browserstack, browser, options)
         | 
| 393 | 
            +
                  # configure file_detector for remote uploads
         | 
| 394 | 
            +
                  config_file_uploads
         | 
| 400 395 | 
             
                  Environ.tunneling = ENV['TUNNELING'] if ENV['TUNNELING']
         | 
| 401 396 | 
             
                  Environ.device_type = ENV['DEVICE_TYPE'] if ENV['DEVICE_TYPE']
         | 
| 402 | 
            -
             | 
| 403 | 
            -
                  Capybara.default_driver = :browserstack
         | 
| 404 | 
            -
                  Capybara.run_server = false
         | 
| 405 | 
            -
                  # configure file_detector for remote uploads
         | 
| 406 | 
            -
                  selenium = Capybara.page.driver.browser
         | 
| 407 | 
            -
                  selenium.file_detector = lambda do |args|
         | 
| 408 | 
            -
                    str = args.first.to_s
         | 
| 409 | 
            -
                    str if File.exist?(str)
         | 
| 410 | 
            -
                  end
         | 
| 411 | 
            -
                end
         | 
| 412 | 
            -
             | 
| 413 | 
            -
                def self.initialize_crossbrowser(desired_caps = nil)
         | 
| 414 | 
            -
                  browser = ENV['CB_BROWSER']
         | 
| 415 | 
            -
                  Environ.grid = :crossbrowser
         | 
| 416 | 
            -
             | 
| 417 | 
            -
                  if ENV['CB_OS']
         | 
| 418 | 
            -
                    Environ.os = ENV['CB_OS']
         | 
| 419 | 
            -
                    Environ.platform = :desktop
         | 
| 420 | 
            -
                  elsif ENV['CB_PLATFORM']
         | 
| 421 | 
            -
                    Environ.device_name = ENV['CB_PLATFORM']
         | 
| 422 | 
            -
                    Environ.device      = :device
         | 
| 423 | 
            -
                    Environ.platform    = :mobile
         | 
| 424 | 
            -
                    Environ.device_type = ENV['DEVICE_TYPE'] if ENV['DEVICE_TYPE']
         | 
| 425 | 
            -
                  end
         | 
| 426 | 
            -
             | 
| 427 | 
            -
                  endpoint = "http://#{ENV['CB_USERNAME']}:#{ENV['CB_AUTHKEY']}@hub.crossbrowsertesting.com:80/wd/hub"
         | 
| 428 | 
            -
                  Capybara.register_driver :crossbrowser do |app|
         | 
| 429 | 
            -
                    capabilities = Selenium::WebDriver::Remote::Capabilities.new
         | 
| 430 | 
            -
                    capabilities['name'] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
         | 
| 431 | 
            -
                    capabilities['build'] = ENV['AUTOMATE_BUILD'] if ENV['AUTOMATE_BUILD']
         | 
| 432 | 
            -
                    capabilities['browser_api_name'] = browser
         | 
| 433 | 
            -
                    capabilities['screen_resolution'] = ENV['RESOLUTION'] if ENV['RESOLUTION']
         | 
| 434 | 
            -
                    if ENV['CB_OS']
         | 
| 435 | 
            -
                      capabilities['os_api_name'] = ENV['CB_OS']
         | 
| 436 | 
            -
                      Environ.platform = :desktop
         | 
| 437 | 
            -
                    elsif ENV['CB_PLATFORM']
         | 
| 438 | 
            -
                      capabilities['os_api_name'] = ENV['CB_PLATFORM']
         | 
| 439 | 
            -
                    end
         | 
| 440 | 
            -
             | 
| 441 | 
            -
                    unless desired_caps.nil?
         | 
| 442 | 
            -
                      capabilities = desired_caps
         | 
| 443 | 
            -
                    end
         | 
| 444 | 
            -
             | 
| 445 | 
            -
                    Capybara::Selenium::Driver.new(app, browser: :remote, url: endpoint, desired_capabilities: capabilities)
         | 
| 446 | 
            -
                  end
         | 
| 447 | 
            -
             | 
| 448 | 
            -
                  Environ.browser = browser
         | 
| 449 | 
            -
             | 
| 450 | 
            -
                  Capybara.default_driver = :crossbrowser
         | 
| 451 | 
            -
                  Capybara.run_server = false
         | 
| 452 | 
            -
                  # configure file_detector for remote uploads
         | 
| 453 | 
            -
                  selenium = Capybara.page.driver.browser
         | 
| 454 | 
            -
                  selenium.file_detector = lambda do |args|
         | 
| 455 | 
            -
                    str = args.first.to_s
         | 
| 456 | 
            -
                    str if File.exist?(str)
         | 
| 457 | 
            -
                  end
         | 
| 458 | 
            -
                end
         | 
| 459 | 
            -
             | 
| 460 | 
            -
                def self.initialize_gridlastic(desired_caps = nil)
         | 
| 461 | 
            -
                  browser = ENV['GL_BROWSER']
         | 
| 462 | 
            -
                  Environ.grid = :gridlastic
         | 
| 463 | 
            -
                  Environ.os = ENV['GL_OS']
         | 
| 464 | 
            -
                  endpoint = "http://#{ENV['GL_USERNAME']}:#{ENV['GL_AUTHKEY']}@#{ENV['GL_SUBDOMAIN']}.gridlastic.com:80/wd/hub"
         | 
| 465 | 
            -
                  capabilities = Selenium::WebDriver::Remote::Capabilities.new
         | 
| 466 | 
            -
                  capabilities['browserName']  = browser
         | 
| 467 | 
            -
                  capabilities['version']      = ENV['GL_VERSION'] if ENV['GL_VERSION']
         | 
| 468 | 
            -
                  capabilities['platform']     = ENV['GL_OS']
         | 
| 469 | 
            -
                  capabilities['platformName'] = ENV['GL_PLATFORM']
         | 
| 470 | 
            -
                  capabilities['video']        = ENV['RECORD_VIDEO'].capitalize if ENV['RECORD_VIDEO']
         | 
| 471 | 
            -
             | 
| 472 | 
            -
                  unless desired_caps.nil?
         | 
| 473 | 
            -
                    capabilities = desired_caps
         | 
| 474 | 
            -
                  end
         | 
| 475 | 
            -
             | 
| 476 | 
            -
                  Capybara.register_driver :selenium do |app|
         | 
| 477 | 
            -
                    client = Selenium::WebDriver::Remote::Http::Default.new
         | 
| 478 | 
            -
                    client.timeout = 1200
         | 
| 479 | 
            -
                    Capybara::Selenium::Driver.new(app, http_client: client, browser: :remote, url: endpoint, desired_capabilities: capabilities)
         | 
| 480 | 
            -
                  end
         | 
| 481 | 
            -
             | 
| 482 | 
            -
                  Environ.browser = browser
         | 
| 483 | 
            -
             | 
| 484 | 
            -
                  Capybara.default_driver = :selenium
         | 
| 485 | 
            -
                  Capybara.run_server = false
         | 
| 486 | 
            -
             | 
| 487 | 
            -
                  if ENV['RECORD_VIDEO']
         | 
| 488 | 
            -
                    session_id = Capybara.current_session.driver.browser.instance_variable_get(:@bridge).session_id
         | 
| 489 | 
            -
                    puts "TEST VIDEO URL: #{ENV['VIDEO_URL']}#{session_id}"
         | 
| 490 | 
            -
                  end
         | 
| 491 | 
            -
                  # configure file_detector for remote uploads
         | 
| 492 | 
            -
                  selenium = Capybara.page.driver.browser
         | 
| 493 | 
            -
                  selenium.file_detector = lambda do |args|
         | 
| 494 | 
            -
                    str = args.first.to_s
         | 
| 495 | 
            -
                    str if File.exist?(str)
         | 
| 496 | 
            -
                  end
         | 
| 497 397 | 
             
                end
         | 
| 498 398 |  | 
| 499 | 
            -
                def self.initialize_lambdatest | 
| 399 | 
            +
                def self.initialize_lambdatest
         | 
| 500 400 | 
             
                  browser = ENV['LT_BROWSER']
         | 
| 501 401 | 
             
                  Environ.grid = :lambdatest
         | 
| 502 402 | 
             
                  Environ.os = ENV['LT_OS']
         | 
| 503 403 | 
             
                  Environ.platform = :desktop
         | 
| 504 404 | 
             
                  Environ.tunneling = ENV['TUNNELING'] if ENV['TUNNELING']
         | 
| 505 405 | 
             
                  # specify endpoint url
         | 
| 506 | 
            -
                  endpoint = "https://#{ENV['LT_USERNAME']}:#{ENV['LT_AUTHKEY']}@hub.lambdatest.com/wd/hub"
         | 
| 406 | 
            +
                  @endpoint = "https://#{ENV['LT_USERNAME']}:#{ENV['LT_AUTHKEY']}@hub.lambdatest.com/wd/hub" if @endpoint.nil?
         | 
| 507 407 | 
             
                  # define LambdaTest options
         | 
| 508 | 
            -
                  options = if  | 
| 408 | 
            +
                  options = if @capabilities.nil?
         | 
| 509 409 | 
             
                              # define the required set of LambdaTest options
         | 
| 510 410 | 
             
                              lt_options = {
         | 
| 511 411 | 
             
                                user: ENV['LT_USERNAME'],
         | 
| @@ -540,62 +440,89 @@ module TestCentricity | |
| 540 440 | 
             
                                'LT:Options': lt_options
         | 
| 541 441 | 
             
                              }
         | 
| 542 442 | 
             
                            else
         | 
| 543 | 
            -
                               | 
| 443 | 
            +
                              @capabilities
         | 
| 544 444 | 
             
                            end
         | 
| 545 | 
            -
                   | 
| 546 | 
            -
                    capabilities = Selenium::WebDriver::Remote::Capabilities.send(browser.gsub(/\s+/, '_').downcase.to_sym, options)
         | 
| 547 | 
            -
                    Capybara::Selenium::Driver.new(app, browser: :remote, url: endpoint, capabilities: capabilities)
         | 
| 548 | 
            -
                  end
         | 
| 549 | 
            -
             | 
| 550 | 
            -
                  Environ.browser = browser
         | 
| 551 | 
            -
             | 
| 552 | 
            -
                  Capybara.default_driver = :lambdatest
         | 
| 553 | 
            -
                  Capybara.run_server = false
         | 
| 445 | 
            +
                  register_remote_driver(:lambdatest, browser, options)
         | 
| 554 446 | 
             
                  # configure file_detector for remote uploads
         | 
| 555 | 
            -
                   | 
| 556 | 
            -
                  selenium.file_detector = lambda do |args|
         | 
| 557 | 
            -
                    str = args.first.to_s
         | 
| 558 | 
            -
                    str if File.exist?(str)
         | 
| 559 | 
            -
                  end
         | 
| 447 | 
            +
                  config_file_uploads
         | 
| 560 448 | 
             
                end
         | 
| 561 449 |  | 
| 562 450 | 
             
                def self.initialize_remote
         | 
| 563 451 | 
             
                  Environ.grid = :selenium_grid
         | 
| 564 452 | 
             
                  browser  = ENV['WEB_BROWSER'].downcase.to_sym
         | 
| 565 | 
            -
                  endpoint = ENV['REMOTE_ENDPOINT'] || 'http://127.0.0.1:4444/wd/hub'
         | 
| 453 | 
            +
                  @endpoint = ENV['REMOTE_ENDPOINT'] || 'http://127.0.0.1:4444/wd/hub' if @endpoint.nil?
         | 
| 566 454 | 
             
                  Capybara.register_driver :remote_browser do |app|
         | 
| 567 455 | 
             
                    case browser
         | 
| 568 | 
            -
                    when : | 
| 569 | 
            -
                       | 
| 456 | 
            +
                    when :safari
         | 
| 457 | 
            +
                      options = Selenium::WebDriver::Safari::Options.new
         | 
| 458 | 
            +
                    when :ie
         | 
| 459 | 
            +
                      options = Selenium::WebDriver::IE::Options.new
         | 
| 460 | 
            +
                    when :firefox, :firefox_headless
         | 
| 461 | 
            +
                      profile = Selenium::WebDriver::Firefox::Profile.new
         | 
| 462 | 
            +
                      profile['browser.download.dir'] = @downloads_path
         | 
| 463 | 
            +
                      profile['browser.download.folderList'] = 2
         | 
| 464 | 
            +
                      profile['browser.download.manager.showWhenStarting'] = false
         | 
| 465 | 
            +
                      profile['browser.download.manager.closeWhenDone'] = true
         | 
| 466 | 
            +
                      profile['browser.download.manager.showAlertOnComplete'] = false
         | 
| 467 | 
            +
                      profile['browser.download.manager.alertOnEXEOpen'] = false
         | 
| 468 | 
            +
                      profile['browser.download.manager.useWindow'] = false
         | 
| 469 | 
            +
                      profile['browser.helperApps.alwaysAsk.force'] = false
         | 
| 470 | 
            +
                      profile['pdfjs.disabled'] = true
         | 
| 471 | 
            +
             | 
| 472 | 
            +
                      mime_types = ENV['MIME_TYPES'] || 'images/jpeg, application/pdf, application/octet-stream'
         | 
| 473 | 
            +
                      profile['browser.helperApps.neverAsk.saveToDisk'] = mime_types
         | 
| 474 | 
            +
             | 
| 475 | 
            +
                      profile['intl.accept_languages'] = ENV['LOCALE'] if ENV['LOCALE']
         | 
| 476 | 
            +
                      options = Selenium::WebDriver::Firefox::Options.new(profile: profile)
         | 
| 477 | 
            +
                      options.args << '--headless' if browser == :firefox_headless
         | 
| 570 478 | 
             
                    when :chrome, :chrome_headless
         | 
| 571 | 
            -
                      options =  | 
| 572 | 
            -
                       | 
| 573 | 
            -
             | 
| 479 | 
            +
                      options = Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
         | 
| 480 | 
            +
                      prefs = {
         | 
| 481 | 
            +
                        prompt_for_download: false,
         | 
| 482 | 
            +
                        directory_upgrade:   true,
         | 
| 483 | 
            +
                        default_directory:   @downloads_path
         | 
| 484 | 
            +
                      }
         | 
| 485 | 
            +
                      options.add_preference(:download, prefs)
         | 
| 486 | 
            +
                      options.add_argument('--disable-dev-shm-usage')
         | 
| 487 | 
            +
                      options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
         | 
| 574 488 | 
             
                      if browser == :chrome_headless
         | 
| 575 | 
            -
                         | 
| 576 | 
            -
                        options. | 
| 577 | 
            -
                        options. | 
| 578 | 
            -
             | 
| 489 | 
            +
                        options.add_argument('--headless')
         | 
| 490 | 
            +
                        options.add_argument('--disable-gpu')
         | 
| 491 | 
            +
                        options.add_argument('--no-sandbox')
         | 
| 492 | 
            +
                      end
         | 
| 493 | 
            +
                    when :edge, :edge_headless
         | 
| 494 | 
            +
                      options = Selenium::WebDriver::Edge::Options.new(options: {'excludeSwitches' => ['enable-automation']})
         | 
| 495 | 
            +
                      prefs = {
         | 
| 496 | 
            +
                        prompt_for_download: false,
         | 
| 497 | 
            +
                        directory_upgrade:   true,
         | 
| 498 | 
            +
                        default_directory:   @downloads_path
         | 
| 499 | 
            +
                      }
         | 
| 500 | 
            +
                      options.add_preference(:download, prefs)
         | 
| 501 | 
            +
                      options.add_argument('--disable-dev-shm-usage')
         | 
| 502 | 
            +
                      options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
         | 
| 503 | 
            +
                      if browser == :edge_headless
         | 
| 504 | 
            +
                        options.add_argument('--headless')
         | 
| 505 | 
            +
                        options.add_argument('--disable-gpu')
         | 
| 506 | 
            +
                        options.add_argument('--no-sandbox')
         | 
| 579 507 | 
             
                      end
         | 
| 580 | 
            -
                      capabilities = Selenium::WebDriver::Remote::Capabilities.chrome('goog:chromeOptions' => { args: options })
         | 
| 581 508 | 
             
                    else
         | 
| 582 509 | 
             
                      if ENV['HOST_BROWSER'] && ENV['HOST_BROWSER'].downcase.to_sym == :chrome
         | 
| 583 510 | 
             
                        Environ.platform = :mobile
         | 
| 584 511 | 
             
                        Environ.device_name = Browsers.mobile_device_name(ENV['WEB_BROWSER'])
         | 
| 585 512 | 
             
                        user_agent = Browsers.mobile_device_agent(ENV['WEB_BROWSER'])
         | 
| 586 | 
            -
                        options =  | 
| 587 | 
            -
                        options. | 
| 588 | 
            -
                        options. | 
| 589 | 
            -
                        options. | 
| 590 | 
            -
                         | 
| 513 | 
            +
                        options = Selenium::WebDriver::Chrome::Options.new(options: {'excludeSwitches' => ['enable-automation']})
         | 
| 514 | 
            +
                        options.add_argument('--disable-infobars')
         | 
| 515 | 
            +
                        options.add_argument('--disable-dev-shm-usage')
         | 
| 516 | 
            +
                        options.add_argument("--user-agent='#{user_agent}'")
         | 
| 517 | 
            +
                        options.add_argument("--lang=#{ENV['LOCALE']}") if ENV['LOCALE']
         | 
| 591 518 | 
             
                      else
         | 
| 592 519 | 
             
                        raise "Requested browser '#{browser}' is not supported on Selenium Grid"
         | 
| 593 520 | 
             
                      end
         | 
| 594 521 | 
             
                    end
         | 
| 595 522 | 
             
                    Capybara::Selenium::Driver.new(app,
         | 
| 596 523 | 
             
                                                   browser: :remote,
         | 
| 597 | 
            -
                                                   url: endpoint,
         | 
| 598 | 
            -
                                                    | 
| 524 | 
            +
                                                   url: @endpoint,
         | 
| 525 | 
            +
                                                   capabilities: [options]).tap do |driver|
         | 
| 599 526 | 
             
                      # configure file_detector for remote uploads
         | 
| 600 527 | 
             
                      driver.browser.file_detector = lambda do |args|
         | 
| 601 528 | 
             
                        str = args.first.to_s
         | 
| @@ -607,7 +534,7 @@ module TestCentricity | |
| 607 534 | 
             
                  Capybara.default_driver = :remote_browser
         | 
| 608 535 | 
             
                end
         | 
| 609 536 |  | 
| 610 | 
            -
                def self.initialize_saucelabs | 
| 537 | 
            +
                def self.initialize_saucelabs
         | 
| 611 538 | 
             
                  browser = ENV['SL_BROWSER']
         | 
| 612 539 | 
             
                  Environ.grid = :saucelabs
         | 
| 613 540 |  | 
| @@ -616,47 +543,54 @@ module TestCentricity | |
| 616 543 | 
             
                    Environ.os = ENV['SL_OS']
         | 
| 617 544 | 
             
                  elsif ENV['SL_PLATFORM']
         | 
| 618 545 | 
             
                    Environ.device_name = ENV['SL_DEVICE']
         | 
| 619 | 
            -
                    Environ.platform | 
| 620 | 
            -
             | 
| 621 | 
            -
             | 
| 622 | 
            -
                  endpoint = "http://#{ENV['SL_USERNAME']}:#{ENV['SL_AUTHKEY']}@ondemand.saucelabs.com:80/wd/hub"
         | 
| 623 | 
            -
                  Capybara.register_driver :saucelabs do |app|
         | 
| 624 | 
            -
                    capabilities = Selenium::WebDriver::Remote::Capabilities.new
         | 
| 625 | 
            -
                    capabilities['name'] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
         | 
| 626 | 
            -
                    capabilities['build'] = ENV['AUTOMATE_BUILD'] if ENV['AUTOMATE_BUILD']
         | 
| 627 | 
            -
                    capabilities['browserName'] = browser
         | 
| 628 | 
            -
                    capabilities['version'] = ENV['SL_VERSION'] if ENV['SL_VERSION']
         | 
| 629 | 
            -
                    capabilities['screenResolution'] = ENV['RESOLUTION'] if ENV['RESOLUTION']
         | 
| 630 | 
            -
                    capabilities['recordVideo'] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
         | 
| 631 | 
            -
                    if ENV['SL_OS']
         | 
| 632 | 
            -
                      capabilities['platform'] = ENV['SL_OS']
         | 
| 633 | 
            -
                    elsif ENV['SL_PLATFORM']
         | 
| 634 | 
            -
                      capabilities['platform'] = ENV['SL_PLATFORM']
         | 
| 635 | 
            -
                      capabilities['deviceName'] = ENV['SL_DEVICE']
         | 
| 636 | 
            -
                      capabilities['deviceType'] = ENV['SL_DEVICE_TYPE'] if ENV['SL_DEVICE_TYPE']
         | 
| 637 | 
            -
                      capabilities['deviceOrientation'] = ENV['ORIENTATION'] if ENV['ORIENTATION']
         | 
| 638 | 
            -
                    end
         | 
| 639 | 
            -
             | 
| 640 | 
            -
                    unless desired_caps.nil?
         | 
| 641 | 
            -
                      capabilities = desired_caps
         | 
| 642 | 
            -
                    end
         | 
| 643 | 
            -
             | 
| 644 | 
            -
                    Capybara::Selenium::Driver.new(app, browser: :remote, url: endpoint, desired_capabilities: capabilities)
         | 
| 546 | 
            +
                    Environ.platform = :mobile
         | 
| 547 | 
            +
                    Environ.device_orientation = ENV['ORIENTATION'] if ENV['ORIENTATION']
         | 
| 548 | 
            +
                    Environ.device = :simulator
         | 
| 645 549 | 
             
                  end
         | 
| 646 | 
            -
             | 
| 647 | 
            -
                   | 
| 648 | 
            -
             | 
| 649 | 
            -
                   | 
| 650 | 
            -
             | 
| 550 | 
            +
                  # specify endpoint url
         | 
| 551 | 
            +
                  @endpoint = "https://#{ENV['SL_USERNAME']}:#{ENV['SL_AUTHKEY']}@ondemand.#{ENV['DATA_CENTER']}.saucelabs.com/wd/hub" if @endpoint.nil?
         | 
| 552 | 
            +
                  # define SauceLab options
         | 
| 553 | 
            +
                  options = if @capabilities.nil?
         | 
| 554 | 
            +
                              # define the required set of SauceLab options
         | 
| 555 | 
            +
                              sl_options = {
         | 
| 556 | 
            +
                                userName: ENV['SL_USERNAME'],
         | 
| 557 | 
            +
                                accessKey: ENV['SL_AUTHKEY'],
         | 
| 558 | 
            +
                                build: test_context_message
         | 
| 559 | 
            +
                              }
         | 
| 560 | 
            +
                              # define the optional SauceLab options
         | 
| 561 | 
            +
                              sl_options[:name] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
         | 
| 562 | 
            +
                              sl_options[:recordVideo] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
         | 
| 563 | 
            +
                              sl_options[:recordScreenshots] = ENV['SCREENSHOTS'] if ENV['SCREENSHOTS']
         | 
| 564 | 
            +
                              # define mobile device options
         | 
| 565 | 
            +
                              if ENV['SL_PLATFORM']
         | 
| 566 | 
            +
                                sl_options[:deviceOrientation] = ENV['ORIENTATION'].upcase if ENV['ORIENTATION']
         | 
| 567 | 
            +
                                sl_options[:appiumVersion] = '1.22.0'
         | 
| 568 | 
            +
                                {
         | 
| 569 | 
            +
                                  browserName: browser,
         | 
| 570 | 
            +
                                  platformName: ENV['SL_PLATFORM'],
         | 
| 571 | 
            +
                                  'appium:deviceName': ENV['SL_DEVICE'],
         | 
| 572 | 
            +
                                  'appium:platformVersion': ENV['SL_VERSION'],
         | 
| 573 | 
            +
                                  'sauce:options': sl_options
         | 
| 574 | 
            +
                                }
         | 
| 575 | 
            +
                              else
         | 
| 576 | 
            +
                                # define desktop browser options
         | 
| 577 | 
            +
                                sl_options[:screenResolution] = ENV['RESOLUTION'] if ENV['RESOLUTION']
         | 
| 578 | 
            +
                                {
         | 
| 579 | 
            +
                                  browserName: browser,
         | 
| 580 | 
            +
                                  browserVersion: ENV['SL_VERSION'],
         | 
| 581 | 
            +
                                  platformName: ENV['SL_OS'],
         | 
| 582 | 
            +
                                  'sauce:options': sl_options
         | 
| 583 | 
            +
                                }
         | 
| 584 | 
            +
                              end
         | 
| 585 | 
            +
                            else
         | 
| 586 | 
            +
                              @capabilities
         | 
| 587 | 
            +
                            end
         | 
| 588 | 
            +
                  register_remote_driver(:saucelabs, browser, options)
         | 
| 651 589 | 
             
                  # configure file_detector for remote uploads
         | 
| 652 | 
            -
                   | 
| 653 | 
            -
                  selenium.file_detector = lambda do |args|
         | 
| 654 | 
            -
                    str = args.first.to_s
         | 
| 655 | 
            -
                    str if File.exist?(str)
         | 
| 656 | 
            -
                  end
         | 
| 590 | 
            +
                  config_file_uploads
         | 
| 657 591 | 
             
                end
         | 
| 658 592 |  | 
| 659 | 
            -
                def self.initialize_testingbot | 
| 593 | 
            +
                def self.initialize_testingbot
         | 
| 660 594 | 
             
                  browser = ENV['TB_BROWSER']
         | 
| 661 595 | 
             
                  Environ.grid = :testingbot
         | 
| 662 596 |  | 
| @@ -671,41 +605,43 @@ module TestCentricity | |
| 671 605 | 
             
                  else
         | 
| 672 606 | 
             
                    Environ.platform = :desktop
         | 
| 673 607 | 
             
                  end
         | 
| 674 | 
            -
             | 
| 675 | 
            -
                   | 
| 676 | 
            -
             | 
| 677 | 
            -
             | 
| 678 | 
            -
             | 
| 679 | 
            -
             | 
| 680 | 
            -
             | 
| 681 | 
            -
             | 
| 682 | 
            -
             | 
| 683 | 
            -
             | 
| 684 | 
            -
             | 
| 685 | 
            -
             | 
| 686 | 
            -
             | 
| 687 | 
            -
             | 
| 688 | 
            -
             | 
| 689 | 
            -
             | 
| 690 | 
            -
             | 
| 691 | 
            -
             | 
| 692 | 
            -
             | 
| 693 | 
            -
             | 
| 694 | 
            -
             | 
| 695 | 
            -
             | 
| 696 | 
            -
             | 
| 697 | 
            -
             | 
| 698 | 
            -
             | 
| 699 | 
            -
             | 
| 700 | 
            -
             | 
| 701 | 
            -
             | 
| 702 | 
            -
             | 
| 703 | 
            -
             | 
| 704 | 
            -
             | 
| 705 | 
            -
             | 
| 706 | 
            -
             | 
| 707 | 
            -
             | 
| 708 | 
            -
                   | 
| 608 | 
            +
                  # specify endpoint url
         | 
| 609 | 
            +
                  if @endpoint.nil?
         | 
| 610 | 
            +
                    url = ENV['TUNNELING'] ? '@localhost:4445/wd/hub' : '@hub.testingbot.com/wd/hub'
         | 
| 611 | 
            +
                    @endpoint = "http://#{ENV['TB_USERNAME']}:#{ENV['TB_AUTHKEY']}#{url}"
         | 
| 612 | 
            +
                  end
         | 
| 613 | 
            +
                  # define TestingBot options
         | 
| 614 | 
            +
                  options = if @capabilities.nil?
         | 
| 615 | 
            +
                              # define the required set of TestingBot options
         | 
| 616 | 
            +
                              tb_options = { build: test_context_message }
         | 
| 617 | 
            +
                              # define the optional TestingBot options
         | 
| 618 | 
            +
                              tb_options[:name] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
         | 
| 619 | 
            +
                              tb_options[:timeZone] = ENV['TIME_ZONE'] if ENV['TIME_ZONE']
         | 
| 620 | 
            +
                              tb_options['testingbot.geoCountryCode'] = ENV['GEO_LOCATION'] if ENV['GEO_LOCATION']
         | 
| 621 | 
            +
                              tb_options[:screenrecorder] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
         | 
| 622 | 
            +
                              tb_options[:screenshot] = ENV['SCREENSHOTS'] if ENV['SCREENSHOTS']
         | 
| 623 | 
            +
                              # define mobile device options
         | 
| 624 | 
            +
                              if ENV['TB_PLATFORM']
         | 
| 625 | 
            +
                                tb_options[:platform] = ENV['TB_PLATFORM']
         | 
| 626 | 
            +
                                tb_options[:orientation] = ENV['ORIENTATION'].upcase if ENV['ORIENTATION']
         | 
| 627 | 
            +
                                tb_options[:deviceName] = ENV['TB_DEVICE'] if ENV['TB_DEVICE']
         | 
| 628 | 
            +
                              else
         | 
| 629 | 
            +
                                # define desktop browser options
         | 
| 630 | 
            +
                                tb_options['screen-resolution'] = ENV['RESOLUTION'] if ENV['RESOLUTION']
         | 
| 631 | 
            +
                                tb_options['selenium-version'] = '4.1.0'
         | 
| 632 | 
            +
                              end
         | 
| 633 | 
            +
                              {
         | 
| 634 | 
            +
                                browserName: browser,
         | 
| 635 | 
            +
                                browserVersion: ENV['TB_VERSION'],
         | 
| 636 | 
            +
                                platformName: ENV['TB_OS'],
         | 
| 637 | 
            +
                                'tb:options': tb_options
         | 
| 638 | 
            +
                              }
         | 
| 639 | 
            +
                            else
         | 
| 640 | 
            +
                              @capabilities
         | 
| 641 | 
            +
                            end
         | 
| 642 | 
            +
                  register_remote_driver(:testingbot, browser, options)
         | 
| 643 | 
            +
                  # configure file_detector for remote uploads if target is desktop web browser
         | 
| 644 | 
            +
                  config_file_uploads unless ENV['TB_PLATFORM']
         | 
| 709 645 | 
             
                end
         | 
| 710 646 |  | 
| 711 647 | 
             
                def self.test_context_message
         | 
| @@ -721,5 +657,26 @@ module TestCentricity | |
| 721 657 | 
             
                  end
         | 
| 722 658 | 
             
                  context_message
         | 
| 723 659 | 
             
                end
         | 
| 660 | 
            +
             | 
| 661 | 
            +
                def self.register_remote_driver(driver, browser, options)
         | 
| 662 | 
            +
                  Capybara.register_driver driver do |app|
         | 
| 663 | 
            +
                    capabilities = Selenium::WebDriver::Remote::Capabilities.send(browser.gsub(/\s+/, '_').downcase.to_sym, options)
         | 
| 664 | 
            +
                    Capybara::Selenium::Driver.new(app, browser: :remote, url: @endpoint, capabilities: capabilities)
         | 
| 665 | 
            +
                  end
         | 
| 666 | 
            +
             | 
| 667 | 
            +
                  Environ.browser = browser
         | 
| 668 | 
            +
             | 
| 669 | 
            +
                  Capybara.default_driver = driver
         | 
| 670 | 
            +
                  Capybara.run_server = false
         | 
| 671 | 
            +
                end
         | 
| 672 | 
            +
             | 
| 673 | 
            +
                def self.config_file_uploads
         | 
| 674 | 
            +
                  # configure file_detector for remote uploads
         | 
| 675 | 
            +
                  selenium = Capybara.page.driver.browser
         | 
| 676 | 
            +
                  selenium.file_detector = lambda do |args|
         | 
| 677 | 
            +
                    str = args.first.to_s
         | 
| 678 | 
            +
                    str if File.exist?(str)
         | 
| 679 | 
            +
                  end
         | 
| 680 | 
            +
                end
         | 
| 724 681 | 
             
              end
         | 
| 725 682 | 
             
            end
         | 
    
        data/testcentricity_web.gemspec
    CHANGED
    
    | @@ -13,12 +13,11 @@ Gem::Specification.new do |spec| | |
| 13 13 | 
             
              spec.summary       = 'A Page Object and Data Object Model Framework for desktop and mobile web testing'
         | 
| 14 14 | 
             
              spec.description   = '
         | 
| 15 15 | 
             
                The TestCentricity™ Web core generic framework for desktop and mobile web browser-based app testing implements
         | 
| 16 | 
            -
                a Page Object Model DSL for use with Cucumber, Capybara, and Selenium-Webdriver. The gem provides support for running
         | 
| 16 | 
            +
                a Page Object Model DSL for use with Cucumber, Capybara, and Selenium-Webdriver v4.x. The gem provides support for running
         | 
| 17 17 | 
             
                automated tests against locally hosted desktop browsers, locally hosted emulated mobile browsers (iOS, Android, Windows
         | 
| 18 18 | 
             
                Phone, Blackberry, Kindle Fire) running within a local instance of Chrome, mobile Safari browsers on iOS device simulators
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                 | 
| 21 | 
            -
                BrowserStack, Sauce Labs, CrossBrowserTesting, TestingBot, Gridlastic, or LambdaTest services).'
         | 
| 19 | 
            +
                or physical iOS devices, mobile Chrome or Android browsers on Android Studio virtual device emulators, or cloud hosted
         | 
| 20 | 
            +
                desktop or mobile web browsers (using the BrowserStack, Sauce Labs, TestingBot, or LambdaTest services).'
         | 
| 22 21 | 
             
              spec.homepage      = ''
         | 
| 23 22 | 
             
              spec.license       = 'BSD-3-Clause'
         | 
| 24 23 |  | 
| @@ -39,7 +38,7 @@ Gem::Specification.new do |spec| | |
| 39 38 | 
             
              spec.add_runtime_dependency 'faker'
         | 
| 40 39 | 
             
              spec.add_runtime_dependency 'i18n'
         | 
| 41 40 | 
             
              spec.add_runtime_dependency 'os', '~> 1.0'
         | 
| 42 | 
            -
              spec.add_runtime_dependency 'selenium-webdriver'
         | 
| 41 | 
            +
              spec.add_runtime_dependency 'selenium-webdriver', '>= 4.0', '< 5'
         | 
| 43 42 | 
             
              spec.add_runtime_dependency 'spreadsheet', '1.1.7'
         | 
| 44 43 | 
             
              spec.add_runtime_dependency 'test-unit'
         | 
| 45 44 | 
             
              spec.add_runtime_dependency 'webdrivers', '~> 5.0'
         |