Commit ef221506 authored by Markus Koller's avatar Markus Koller

Merge branch 'brodock/chrome-to-webdriver-refactor' into 'master'

Chrome to WebDriver refactor

See merge request gitlab-org/gitlab!55436
parents 74d83dec 8763f351
...@@ -135,7 +135,7 @@ starting GitLab. For example: ...@@ -135,7 +135,7 @@ starting GitLab. For example:
ENABLE_BULLET=true bundle exec rails s ENABLE_BULLET=true bundle exec rails s
``` ```
Bullet logs query problems to both the Rails log as well as the Chrome Bullet logs query problems to both the Rails log as well as the browser
console. console.
As a follow up to finding `N+1` queries with Bullet, consider writing a [QueryRecoder test](query_recorder.md) to prevent a regression. As a follow up to finding `N+1` queries with Bullet, consider writing a [QueryRecoder test](query_recorder.md) to prevent a regression.
......
...@@ -513,14 +513,14 @@ Finished in 34.51 seconds (files took 0.76702 seconds to load) ...@@ -513,14 +513,14 @@ Finished in 34.51 seconds (files took 0.76702 seconds to load)
#### Run `:js` spec in a visible browser #### Run `:js` spec in a visible browser
Run the spec with `CHROME_HEADLESS=0`, like this: Run the spec with `WEBDRIVER_HEADLESS=0`, like this:
```shell ```shell
CHROME_HEADLESS=0 bin/rspec some_spec.rb WEBDRIVER_HEADLESS=0 bin/rspec some_spec.rb
``` ```
The test completes quickly, but this gives you an idea of what's happening. The test completes quickly, but this gives you an idea of what's happening.
Using `live_debug` with `CHROME_HEADLESS=0` pauses the open browser, and does not Using `live_debug` with `WEBDRIVER_HEADLESS=0` pauses the open browser, and does not
open the page again. This can be used to debug and inspect elements. open the page again. This can be used to debug and inspect elements.
You can also add `byebug` or `binding.pry` to pause execution and [step through](../pry_debugging.md#stepping) You can also add `byebug` or `binding.pry` to pause execution and [step through](../pry_debugging.md#stepping)
......
...@@ -27,7 +27,7 @@ docker run \ ...@@ -27,7 +27,7 @@ docker run \
To run the tests from the `/qa` directory: To run the tests from the `/qa` directory:
```shell ```shell
CHROME_HEADLESS=false bin/qa Test::Instance::All http://localhost -- qa/specs/features/ee/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb WEBDRIVER_HEADLESS=false bin/qa Test::Instance::All http://localhost -- qa/specs/features/ee/browser_ui/3_create/jenkins/jenkins_build_status_spec.rb
``` ```
The test automatically spins up a Docker container for Jenkins and tear down once the test completes. The test automatically spins up a Docker container for Jenkins and tear down once the test completes.
...@@ -131,7 +131,7 @@ sudo nginx -s reload ...@@ -131,7 +131,7 @@ sudo nginx -s reload
You could then run the tests from the `/qa` directory: You could then run the tests from the `/qa` directory:
```shell ```shell
CHROME_HEADLESS=false bin/qa Test::Instance::All http://gitlab-gitaly-cluster.test -- --tag gitaly_cluster WEBDRIVER_HEADLESS=false bin/qa Test::Instance::All http://gitlab-gitaly-cluster.test -- --tag gitaly_cluster
``` ```
Once you have finished testing you can stop and remove the Docker containers: Once you have finished testing you can stop and remove the Docker containers:
...@@ -160,13 +160,13 @@ You might see NGINX issues when you run `gdk start` or `gdk restart`. In that ca ...@@ -160,13 +160,13 @@ You might see NGINX issues when you run `gdk start` or `gdk restart`. In that ca
Navigate to the folder in `/your-gdk/gitlab/qa` and issue the command: Navigate to the folder in `/your-gdk/gitlab/qa` and issue the command:
```shell ```shell
QA_DEBUG=true CHROME_HEADLESS=false GITLAB_ADMIN_USERNAME=rootusername GITLAB_ADMIN_PASSWORD=rootpassword GITLAB_QA_ACCESS_TOKEN=your_token_here GITLAB_QA_ADMIN_ACCESS_TOKEN=your_token_here CLUSTER_API_URL=https://kubernetes.docker.internal:6443 bundle exec bin/qa Test::Instance::All https://[YOUR-PORT].qa-tunnel.gitlab.info/ -- qa/specs/features/browser_ui/8_monitor/all_monitor_core_features_spec.rb --tag kubernetes --tag orchestrated --tag requires_admin QA_DEBUG=true WEBDRIVER_HEADLESS=false GITLAB_ADMIN_USERNAME=rootusername GITLAB_ADMIN_PASSWORD=rootpassword GITLAB_QA_ACCESS_TOKEN=your_token_here GITLAB_QA_ADMIN_ACCESS_TOKEN=your_token_here CLUSTER_API_URL=https://kubernetes.docker.internal:6443 bundle exec bin/qa Test::Instance::All https://[YOUR-PORT].qa-tunnel.gitlab.info/ -- qa/specs/features/browser_ui/8_monitor/all_monitor_core_features_spec.rb --tag kubernetes --tag orchestrated --tag requires_admin
``` ```
The following includes more information on the command: The following includes more information on the command:
-`QA_DEBUG` - Set to `true` to verbosely log page object actions. -`QA_DEBUG` - Set to `true` to verbosely log page object actions.
-`CHROME_HEADLESS` - When running locally, set to `false` to allow Chrome tests to be visible - watch your tests being run. -`WEBDRIVER_HEADLESS` - When running locally, set to `false` to allow browser tests to be visible - watch your tests being run.
-`GITLAB_ADMIN_USERNAME` - Admin username to use when adding a license. -`GITLAB_ADMIN_USERNAME` - Admin username to use when adding a license.
-`GITLAB_ADMIN_PASSWORD` - Admin password to use when adding a license. -`GITLAB_ADMIN_PASSWORD` - Admin password to use when adding a license.
-`GITLAB_QA_ACCESS_TOKEN` and `GITLAB_QA_ADMIN_ACCESS_TOKEN` - A valid personal access token with the `api` scope. This is used for API access during tests, and is used in the version that staging is currently running. The `ADMIN_ACCESS_TOKEN` is from a user with admin access. Used for API access as an admin during tests. -`GITLAB_QA_ACCESS_TOKEN` and `GITLAB_QA_ADMIN_ACCESS_TOKEN` - A valid personal access token with the `api` scope. This is used for API access during tests, and is used in the version that staging is currently running. The `ADMIN_ACCESS_TOKEN` is from a user with admin access. Used for API access as an admin during tests.
...@@ -279,7 +279,7 @@ Geo end-to-end tests can run locally against a [Geo GDK setup](https://gitlab.co ...@@ -279,7 +279,7 @@ Geo end-to-end tests can run locally against a [Geo GDK setup](https://gitlab.co
Run from the [`qa/` directory](https://gitlab.com/gitlab-org/gitlab/-/blob/f7272b77e80215c39d1ffeaed27794c220dbe03f/qa) with both GDK Geo primary and Geo secondary instances running: Run from the [`qa/` directory](https://gitlab.com/gitlab-org/gitlab/-/blob/f7272b77e80215c39d1ffeaed27794c220dbe03f/qa) with both GDK Geo primary and Geo secondary instances running:
```shell ```shell
CHROME_HEADLESS=false bundle exec bin/qa QA::EE::Scenario::Test::Geo --primary-address http://localhost:3001 --secondary-address http://localhost:3002 --without-setup WEBDRIVER_HEADLESS=false bundle exec bin/qa QA::EE::Scenario::Test::Geo --primary-address http://localhost:3001 --secondary-address http://localhost:3002 --without-setup
``` ```
### Using Geo in Docker ### Using Geo in Docker
...@@ -455,7 +455,7 @@ To run the LDAP tests on your local with TLS enabled, follow these steps: ...@@ -455,7 +455,7 @@ To run the LDAP tests on your local with TLS enabled, follow these steps:
1. Run an LDAP test from [`gitlab/qa`](https://gitlab.com/gitlab-org/gitlab/-/tree/d5447ebb5f99d4c72780681ddf4dc25b0738acba/qa) directory: 1. Run an LDAP test from [`gitlab/qa`](https://gitlab.com/gitlab-org/gitlab/-/tree/d5447ebb5f99d4c72780681ddf4dc25b0738acba/qa) directory:
```shell ```shell
GITLAB_LDAP_USERNAME="tanuki" GITLAB_LDAP_PASSWORD="password" QA_DEBUG=true CHROME_HEADLESS=false bin/qa Test::Instance::All https://gitlab.test qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb GITLAB_LDAP_USERNAME="tanuki" GITLAB_LDAP_PASSWORD="password" QA_DEBUG=true WEBDRIVER_HEADLESS=false bin/qa Test::Instance::All https://gitlab.test qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb
``` ```
### Running LDAP tests with TLS disabled ### Running LDAP tests with TLS disabled
...@@ -483,5 +483,5 @@ To run the LDAP tests on your local with TLS disabled, follow these steps: ...@@ -483,5 +483,5 @@ To run the LDAP tests on your local with TLS disabled, follow these steps:
1. Run an LDAP test from [`gitlab/qa`](https://gitlab.com/gitlab-org/gitlab/-/tree/d5447ebb5f99d4c72780681ddf4dc25b0738acba/qa) directory: 1. Run an LDAP test from [`gitlab/qa`](https://gitlab.com/gitlab-org/gitlab/-/tree/d5447ebb5f99d4c72780681ddf4dc25b0738acba/qa) directory:
```shell ```shell
GITLAB_LDAP_USERNAME="tanuki" GITLAB_LDAP_PASSWORD="password" QA_DEBUG=true CHROME_HEADLESS=false bin/qa Test::Instance::All http://localhost qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb GITLAB_LDAP_USERNAME="tanuki" GITLAB_LDAP_PASSWORD="password" QA_DEBUG=true WEBDRIVER_HEADLESS=false bin/qa Test::Instance::All http://localhost qa/specs/features/browser_ui/1_manage/login/log_into_gitlab_via_ldap_spec.rb
``` ```
...@@ -89,8 +89,8 @@ module QA ...@@ -89,8 +89,8 @@ module QA
# Chrome won't work properly in a Docker container in sandbox mode # Chrome won't work properly in a Docker container in sandbox mode
options.add_argument("no-sandbox") options.add_argument("no-sandbox")
# Run headless by default unless CHROME_HEADLESS is false # Run headless by default unless WEBDRIVER_HEADLESS is false
if QA::Runtime::Env.chrome_headless? if QA::Runtime::Env.webdriver_headless?
options.add_argument("headless") options.add_argument("headless")
# Chrome documentation says this flag is needed for now # Chrome documentation says this flag is needed for now
......
# frozen_string_literal: true # frozen_string_literal: true
require 'active_support/deprecation'
require 'gitlab/qa' require 'gitlab/qa'
require 'uri' require 'uri'
...@@ -64,9 +65,13 @@ module QA ...@@ -64,9 +65,13 @@ module QA
ENV['QA_LOG_PATH'] || $stdout ENV['QA_LOG_PATH'] || $stdout
end end
# set to 'false' to have Chrome run visibly instead of headless # set to 'false' to have the browser run visibly instead of headless
def chrome_headless? def webdriver_headless?
enabled?(ENV['CHROME_HEADLESS']) if ENV.key?('CHROME_HEADLESS')
ActiveSupport::Deprecation.warn("CHROME_HEADLESS is deprecated. Use WEBDRIVER_HEADLESS instead.")
end
enabled?(ENV['WEBDRIVER_HEADLESS']) || enabled?(ENV['CHROME_HEADLESS'])
end end
# set to 'true' to have Chrome use a fixed profile directory # set to 'true' to have Chrome use a fixed profile directory
......
...@@ -54,10 +54,15 @@ RSpec.describe QA::Runtime::Env do ...@@ -54,10 +54,15 @@ RSpec.describe QA::Runtime::Env do
default: false default: false
end end
describe '.chrome_headless?' do describe '.webdriver_headless?' do
before do
# We need to set this because we have a fallback for CHROME_HEADLESS
stub_env('CHROME_HEADLESS', 'false')
end
it_behaves_like 'boolean method', it_behaves_like 'boolean method',
method: :chrome_headless?, method: :webdriver_headless?,
env_key: 'CHROME_HEADLESS', env_key: 'WEBDRIVER_HEADLESS',
default: true default: true
end end
......
...@@ -47,7 +47,7 @@ RSpec.describe 'Multi-file editor new directory', :js do ...@@ -47,7 +47,7 @@ RSpec.describe 'Multi-file editor new directory', :js do
find('.js-ide-commit-mode').click find('.js-ide-commit-mode').click
# Compact mode depends on the size of window. If it is shorter than MAX_WINDOW_HEIGHT_COMPACT, # Compact mode depends on the size of window. If it is shorter than MAX_WINDOW_HEIGHT_COMPACT,
# (as it is with CHROME_HEADLESS=0), this initial commit button will exist. Otherwise, if it is # (as it is with WEBDRIVER_HEADLESS=0), this initial commit button will exist. Otherwise, if it is
# taller (as it is by default with chrome headless) then the button will not exist. # taller (as it is by default with chrome headless) then the button will not exist.
if page.has_css?('.qa-begin-commit-button') if page.has_css?('.qa-begin-commit-button')
find('.qa-begin-commit-button').click find('.qa-begin-commit-button').click
......
...@@ -37,7 +37,7 @@ RSpec.describe 'Multi-file editor new file', :js do ...@@ -37,7 +37,7 @@ RSpec.describe 'Multi-file editor new file', :js do
find('.js-ide-commit-mode').click find('.js-ide-commit-mode').click
# Compact mode depends on the size of window. If it is shorter than MAX_WINDOW_HEIGHT_COMPACT, # Compact mode depends on the size of window. If it is shorter than MAX_WINDOW_HEIGHT_COMPACT,
# (as it is with CHROME_HEADLESS=0), this initial commit button will exist. Otherwise, if it is # (as it is with WEBDRIVER_HEADLESS=0), this initial commit button will exist. Otherwise, if it is
# taller (as it is by default with chrome headless) then the button will not exist. # taller (as it is by default with chrome headless) then the button will not exist.
if page.has_css?('.qa-begin-commit-button') if page.has_css?('.qa-begin-commit-button')
find('.qa-begin-commit-button').click find('.qa-begin-commit-button').click
......
...@@ -60,8 +60,8 @@ Capybara.register_driver :chrome do |app| ...@@ -60,8 +60,8 @@ Capybara.register_driver :chrome do |app|
# Chrome won't work properly in a Docker container in sandbox mode # Chrome won't work properly in a Docker container in sandbox mode
options.add_argument("no-sandbox") options.add_argument("no-sandbox")
# Run headless by default unless CHROME_HEADLESS specified # Run headless by default unless WEBDRIVER_HEADLESS specified
options.add_argument("headless") unless ENV['CHROME_HEADLESS'] =~ /^(false|no|0)$/i options.add_argument("headless") unless ENV['WEBDRIVER_HEADLESS'] =~ /^(false|no|0)$/i || ENV['CHROME_HEADLESS'] =~ /^(false|no|0)$/i
# Disable /dev/shm use in CI. See https://gitlab.com/gitlab-org/gitlab/issues/4252 # Disable /dev/shm use in CI. See https://gitlab.com/gitlab-org/gitlab/issues/4252
options.add_argument("disable-dev-shm-usage") if ENV['CI'] || ENV['CI_SERVER'] options.add_argument("disable-dev-shm-usage") if ENV['CI'] || ENV['CI_SERVER']
......
...@@ -7,8 +7,8 @@ module LiveDebugger ...@@ -7,8 +7,8 @@ module LiveDebugger
puts puts
puts "Current example is paused for live debugging." puts "Current example is paused for live debugging."
if ENV['CHROME_HEADLESS'] =~ /^(false|no|0)$/i if is_headless_disabled?
puts "Switch to the Chrome window that was automatically opened to run the test in order to view current page" puts "Switch to the browser window that was automatically opened to run the test in order to view current page"
else else
puts "Opening #{current_url} in your default browser..." puts "Opening #{current_url} in your default browser..."
end end
...@@ -16,10 +16,16 @@ module LiveDebugger ...@@ -16,10 +16,16 @@ module LiveDebugger
puts "The current user credentials are: #{@current_user.username} / #{@current_user.password}" if @current_user puts "The current user credentials are: #{@current_user.username} / #{@current_user.password}" if @current_user
puts "Press any key to resume the execution of the example!!" puts "Press any key to resume the execution of the example!!"
`open #{current_url}` if ENV['CHROME_HEADLESS'] !~ /^(false|no|0)$/i `open #{current_url}` if is_headless_disabled?
loop until $stdin.getch loop until $stdin.getch
puts "Back to the example!" puts "Back to the example!"
end end
def is_headless_disabled?
ActiveSupport::Deprecation.warn("CHROME_HEADLESS is deprecated. Use WEBDRIVER_HEADLESS instead.") if ENV.key?('CHROME_HEADLESS')
ENV['WEBDRIVER_HEADLESS'] =~ /^(false|no|0)$/i || ENV['CHROME_HEADLESS'] =~ /^(false|no|0)$/i
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment