diff --git a/.bazelrc b/.bazelrc index 05599d21483ea..f0031fc19eab8 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,8 +1,14 @@ -try-import .bazelrc.local -try-import .bazelrc.windows.local +try-import %workspace%/.bazelrc.local +try-import %workspace%/.bazelrc.windows.local -# Disable bzlmod until we're ready to use it -common --noenable_bzlmod +# Enable bzlmod but without lockfile for a moment. +# Lockfile is a problem to check in at the moment +# because of constant Git conflicts and platform-specific +# pieces. +# https://github.com/bazelbuild/bazel/issues/20369 +# https://github.com/bazelbuild/bazel/issues/21491 + +common --enable_bzlmod --lockfile_mode=off # Ensure Windows support is accurate. @@ -33,6 +39,8 @@ build --nobuild_runfile_links # More JS magic build --experimental_allow_unresolved_symlinks +# Avoid a warning about directory tracking being unsound +startup --host_jvm_args=-DBAZEL_TRACK_SOURCE_DIRECTORIES=1 # Required for faster TS builds build --@aspect_rules_ts//ts:skipLibCheck=always @@ -70,6 +78,7 @@ test --test_env=MOZ_HEADLESS test --test_env=SELENIUM_BROWSER test --test_env=TRAVIS test --test_env=PYTHON_VERSION +test --test_env=SE_AVOID_STATS=true # Remove once rules_ruby support proper $LOAD_PATH expansion. @@ -81,13 +90,9 @@ test --test_env=RUBYOPT="-Irb/lib -w" build --action_env=JRUBY_OPTS="--dev" test --test_env=JRUBY_OPTS="--dev" -# JRuby/TruffleRuby: https://github.com/jruby/jruby/issues/5661 - -#build --action_env=HOME -#test --test_env=HOME - # Expose necessary variables for Selenium-Manager. +test:windows --test_env=PATH test:windows --test_env=LOCALAPPDATA test:windows --test_env=PROGRAMFILES="C:\\Program Files" test:windows --test_env=PROGRAMFILES(X86)="C:\\Program Files (x86)" @@ -97,77 +102,14 @@ test --test_timeout=1800 test:node_debug --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results test:ruby_debug --test_output=streamed --test_env=RUBY_DEBUG_FORK_MODE=parent --run_under="@bundle//bin:rdbg --nonstop --open --command" -# The RBE to use -build:remote --bes_results_url=https://gypsum.cluster.engflow.com/invocation -build:remote --bes_backend=grpcs://gypsum.cluster.engflow.com -build:remote --remote_executor=grpcs://gypsum.cluster.engflow.com -build:remote --remote_cache=grpcs://gypsum.cluster.engflow.com - -# The number of cores available -build:remote -j 50 - -# Build Without The Bytes -build:remote --remote_download_minimal - -build:remote --define=EXECUTOR=remote -build:remote --experimental_inmemory_dotd_files -build:remote --experimental_inmemory_jdeps_files -build:remote --remote_timeout=3600 -build:remote --spawn_strategy=remote,local -#build:remote --nolegacy_important_outputs -build:remote --incompatible_strict_action_env=true - -build:remote --crosstool_top=//common/remote-build/cc:toolchain -build:remote --extra_execution_platforms=//common/remote-build:platform -build:remote --extra_toolchains=//common/remote-build:cc-toolchain -build:remote --host_platform=//common/remote-build:platform -build:remote --platforms=//common/remote-build:platform - -# The Docker images are running Linux -build:remote --cpu=k8 -build:remote --host_cpu=k8 - -build:remote --disk_cache= - -build:remote --incompatible_enable_cc_toolchain_resolution -build:remote --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 -test:remote --test_env=DISPLAY=:99.0 -test:remote --test_tag_filters=-skip-remote,-remote - -# Env vars we can hard code -build:remote --action_env=HOME=/home/dev -build:remote --action_env=PATH=/bin:/usr/bin:/usr/local/bin -test:remote --test_env=PATH=/bin:/usr/bin:/usr/local/bin -test:remote --test_env=HOME=/home/dev -test --test_env=SE_AVOID_STATS=true - -# Make sure we sniff credentials properly -build:remote --credential_helper=%workspace%/scripts/credential-helper.sh -# Use pinned browsers when running remotely -build:remote --//common:pin_browsers - -# The remote build machines are pretty small, and 50 threads may leave them -# thrashing, but our dev machines are a lot larger. Scale the workload so we -# make reasonable usage of everything, everywhere, all at once. -build:remote --local_resources=cpu='HOST_CPUS*10' -build:remote --local_resources=memory='HOST_RAM*4.0' - -# A small hint that we're running our tests remotely -test:remote --test_env=REMOTE_BUILD=1 - -# Wait for up to 5 minutes for a test to pass -test:remote --test_timeout=600 - -# Extend the remote config for CI -build:remote-ci --config=remote -build:remote-ci --curses=no --color=yes --show_timestamps --show_progress_rate_limit=5 -build:remote-ci --bes_upload_mode=wait_for_upload_complete +build:release --stamp +build:release --compilation_mode=opt -# Configuration changes suggested by EngFlow -build:remote --grpc_keepalive_time=30s -build:remote --nolegacy_important_outputs +# As regular `release` but all the build work happens on the RBE +build:remote_release --config=release +build:remote_release --config=remote +build:remote_release --remote_download_toplevel -build:release --config=remote -build:release --stamp -build:release --remote_download_outputs=toplevel +# RBE +import %workspace%/.bazelrc.remote diff --git a/.bazelrc.remote b/.bazelrc.remote new file mode 100644 index 0000000000000..db858bbfaf1f5 --- /dev/null +++ b/.bazelrc.remote @@ -0,0 +1,68 @@ +# The RBE to use +build:remote --bes_results_url=https://gypsum.cluster.engflow.com/invocation +build:remote --bes_backend=grpcs://gypsum.cluster.engflow.com +build:remote --remote_executor=grpcs://gypsum.cluster.engflow.com +build:remote --remote_cache=grpcs://gypsum.cluster.engflow.com + +# The number of cores available +build:remote -j 50 + +build:remote --define=EXECUTOR=remote +build:remote --experimental_inmemory_dotd_files +build:remote --experimental_inmemory_jdeps_files +build:remote --remote_timeout=3600 +build:remote --spawn_strategy=remote,local +#build:remote --nolegacy_important_outputs +build:remote --incompatible_strict_action_env=true + +build:remote --crosstool_top=//common/remote-build/cc:toolchain +build:remote --extra_execution_platforms=//common/remote-build:platform +build:remote --extra_toolchains=//common/remote-build:cc-toolchain +build:remote --host_platform=//common/remote-build:platform +build:remote --platforms=//common/remote-build:platform +build:remote --cxxopt=-std=c++14 + +# The Docker images are running Linux +build:remote --cpu=k8 +build:remote --host_cpu=k8 + +build:remote --disk_cache= + +build:remote --incompatible_enable_cc_toolchain_resolution +build:remote --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1 +test:remote --test_env=DISPLAY=:99.0 +test:remote --test_tag_filters=-skip-remote,-remote + +# Env vars we can hard code +build:remote --action_env=HOME=/home/dev +build:remote --action_env=PATH=/bin:/usr/bin:/usr/local/bin +test:remote --test_env=PATH=/bin:/usr/bin:/usr/local/bin +test:remote --test_env=HOME=/home/dev + +# Make sure we sniff credentials properly +build:remote --credential_helper=gypsum.cluster.engflow.com=%workspace%/scripts/credential-helper.sh + +# Use pinned browsers when running remotely +build:remote --//common:pin_browsers + +# The remote build machines are pretty small, and 50 threads may leave them +# thrashing, but our dev machines are a lot larger. Scale the workload so we +# make reasonable usage of everything, everywhere, all at once. +build:remote --local_resources=cpu='HOST_CPUS*10' +build:remote --local_resources=memory='HOST_RAM*4.0' + +# A small hint that we're running our tests remotely +test:remote --test_env=REMOTE_BUILD=1 + +# Wait for up to 5 minutes for a test to pass +test:remote --test_timeout=600 + +# Extend the remote config for CI +build:remote-ci --config=remote +build:remote-ci --curses=no --color=yes --show_timestamps --show_progress_rate_limit=5 +build:remote-ci --bes_upload_mode=wait_for_upload_complete +build:remote-ci --remote_download_minimal + +# Configuration changes suggested by EngFlow +build:remote --grpc_keepalive_time=30s +build:remote --nolegacy_important_outputs diff --git a/.bazelversion b/.bazelversion index a3fcc7121bbab..0ee843cc60466 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -7.1.0 +7.2.0 diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index aca34a0191f00..0000000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,56 +0,0 @@ -version: 2 -updates: - - package-ecosystem: github-actions - directory: "/" - schedule: - interval: daily - time: '08:00' - open-pull-requests-limit: 0 - labels: - - "C-build" - - "dependencies" - - package-ecosystem: "npm" - directory: "/" - schedule: - interval: daily - time: '08:00' - open-pull-requests-limit: 0 - labels: - - "C-nodejs" - - "dependencies" - - package-ecosystem: "bundler" - directory: "/" - schedule: - interval: daily - time: '08:00' - open-pull-requests-limit: 0 - labels: - - "C-rb" - - "dependencies" - - package-ecosystem: "cargo" - directory: "/rust" - schedule: - interval: daily - time: '08:00' - open-pull-requests-limit: 0 - labels: - - "C-rust" - - "dependencies" - - package-ecosystem: "pip" - directory: "/py" - schedule: - interval: daily - time: '08:00' - open-pull-requests-limit: 0 - labels: - - "C-py" - - "dependencies" - - package-ecosystem: "nuget" - directory: "/dotnet" - schedule: - interval: daily - time: '08:00' - open-pull-requests-limit: 0 - labels: - - "C-dotnet" - - "dependencies" diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000000000..8f13b55a4e290 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,6 @@ +changelog: + exclude: + labels: + -dependencies + authors: + - selenium-ci diff --git a/.github/workflows/bazel.yml b/.github/workflows/bazel.yml index 7687cb5bfb168..428ac9ae6f87a 100644 --- a/.github/workflows/bazel.yml +++ b/.github/workflows/bazel.yml @@ -36,11 +36,21 @@ on: required: false type: string default: '' + dotnet-version: + description: Custom DotNet version to install + required: false + type: string + default: '' java-version: description: Custom Java version to install required: false type: string default: '' + node-version: + description: Custom Node version to install + required: false + type: string + default: '' ruby-version: description: Custom Ruby version to use required: false @@ -60,13 +70,14 @@ on: jobs: bazel: name: ${{ inputs.name }} - runs-on: ${{ inputs.os }}-latest + runs-on: ${{ inputs.os == 'macos' && 'macos-13' || format('{0}-latest', inputs.os) }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SEL_M2_USER: ${{ secrets.SEL_M2_USER }} SEL_M2_PASS: ${{ secrets.SEL_M2_PASS }} TWINE_PASSWORD: ${{ secrets.TWINE_PASSWORD }} TWINE_USERNAME: ${{ secrets.TWINE_USERNAME }} + NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} SE_AVOID_STATS: true steps: - name: Checkout source tree @@ -87,30 +98,39 @@ jobs: - name: Set Ruby version if: inputs.ruby-version != '' run: echo '${{ inputs.ruby-version }}' > rb/.ruby-version + - name: Setup DotNet + if: inputs.dotnet-version != '' + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{ inputs.dotnet-version }} - name: Setup Java if: inputs.java-version != '' uses: actions/setup-java@v3 with: java-version: ${{ inputs.java-version }} distribution: 'temurin' + - name: Setup Node + if: inputs.node-version != '' + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.node-version }} - name: Setup Bazel with caching if: inputs.caching - uses: bazel-contrib/setup-bazel@0.8.1 + uses: bazel-contrib/setup-bazel@0.8.5 with: bazelisk-cache: true bazelrc: common --color=yes + cache-version: 2 disk-cache: ${{ inputs.cache-key }} external-cache: | name: ${{ inputs.cache-key }} manifest: crates: rust/Cargo.Bazel.lock - npm: package-lock.json - pypi__pip: py/requirements_lock.txt - ruby: ${{ inputs.os == 'windows' && 'false' || 'rb/.ruby-version' }} + rules_ruby~~ruby~ruby: ${{ inputs.os == 'windows' && 'false' || 'rb/.ruby-version' }} repository-cache: true - name: Setup Bazel without caching if: inputs.caching == false - uses: bazel-contrib/setup-bazel@0.8.1 + uses: bazel-contrib/setup-bazel@0.8.5 with: bazelrc: common --color=yes - name: Setup Fluxbox and Xvfb @@ -123,25 +143,12 @@ jobs: - name: Set resolution if: inputs.os == 'windows' && inputs.browser != '' run: Set-DisplayResolution -Width 1920 -Height 1080 -Force - - name: Setup Chrome - if: inputs.browser == 'chrome' - uses: browser-actions/setup-chrome@latest - with: - chrome-version: ${{ inputs.browser-version || 'stable' }} - - name: Setup Firefox - if: inputs.browser == 'firefox' - uses: abhi1693/setup-browser@v0.3.5 - with: - browser: firefox - version: ${{ inputs.browser-version || 'latest' }} - - name: Setup Edge - if: inputs.browser == 'edge' - uses: browser-actions/setup-edge@latest - with: - edge-version: ${{ inputs.browser-version || 'stable' }} - name: Setup Safari if: inputs.browser == 'safari' run: sudo safaridriver --enable + - name: Setup curl for Ubuntu + if: inputs.os == 'ubuntu' + run: sudo apt-get update && sudo apt-get install -y libcurl4-openssl-dev - name: Run Bazel run: ${{ inputs.run }} - name: Start SSH session diff --git a/.github/workflows/ci-java.yml b/.github/workflows/ci-java.yml index 049dace57490b..569d68d562440 100644 --- a/.github/workflows/ci-java.yml +++ b/.github/workflows/ci-java.yml @@ -18,6 +18,9 @@ jobs: os: ${{ matrix.os }} browser: chrome cache-key: java-${{ matrix.os }}-tests + # rules_jvm_external is not fully hermetic + # https://github.com/bazelbuild/rules_jvm_external/issues/1046 + java-version: 17 run: | bazel test --flaky_test_attempts 3 //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest ` //java/test/org/openqa/selenium/federatedcredentialmanagement:FederatedCredentialManagementTest ` @@ -39,10 +42,13 @@ jobs: os: ${{ matrix.os }} browser: chrome cache-key: java-${{ matrix.os }}-tests + # rules_jvm_external is not fully hermetic + # https://github.com/bazelbuild/rules_jvm_external/issues/1046 + java-version: 17 run: | bazel test --flaky_test_attempts 3 //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest-remote \ //java/test/org/openqa/selenium/federatedcredentialmanagement:FederatedCredentialManagementTest \ - //java/test/org/openqa/selenium/firefox:FirefoxDriverBuilderTest \ + //java/test/org/openqa/selenium/firefox:FirefoxDriverBuilderTest \ //java/test/org/openqa/selenium/grid/router:RemoteWebDriverDownloadTest \ //java/test/org/openqa/selenium/remote:RemoteWebDriverBuilderTest \ //java/test/org/openqa/selenium/grid/router:RemoteWebDriverDownloadTest @@ -60,5 +66,8 @@ jobs: os: ${{ matrix.os }} browser: chrome cache-key: java-${{ matrix.os }}-remote-tests + # rules_jvm_external is not fully hermetic + # https://github.com/bazelbuild/rules_jvm_external/issues/1046 + java-version: 17 run: | bazel test --flaky_test_attempts 3 //java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest-remote diff --git a/.github/workflows/ci-javascript.yml b/.github/workflows/ci-javascript.yml deleted file mode 100644 index 89956051e4168..0000000000000 --- a/.github/workflows/ci-javascript.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: CI - JavaScript - -on: - workflow_call: - workflow_dispatch: - -jobs: - build: - name: Build - uses: ./.github/workflows/bazel.yml - with: - name: Build - cache-key: javascript-build - run: bazel build //javascript/node/selenium-webdriver:selenium-webdriver - browser-tests: - name: Browser Tests - needs: build - uses: ./.github/workflows/bazel.yml - strategy: - fail-fast: false - matrix: - browser: - - chrome - - firefox - with: - name: Browser Tests (${{ matrix.browser }}) - browser: ${{ matrix.browser }} - cache-key: node - run: | - export SELENIUM_BROWSER=${{ matrix.browser }} - bazel test --flaky_test_attempts 3 //javascript/node/selenium-webdriver:${{matrix.browser}}-browser-tests diff --git a/.github/workflows/ci-ruby.yml b/.github/workflows/ci-ruby.yml index 653034f947f45..419e17df5065c 100644 --- a/.github/workflows/ci-ruby.yml +++ b/.github/workflows/ci-ruby.yml @@ -73,20 +73,12 @@ jobs: - chrome - edge - firefox - - safari os: - - ubuntu - windows - macos exclude: - - browser: edge - os: ubuntu - browser: edge os: macos - - browser: safari - os: ubuntu - - browser: safari - os: windows with: name: Local Tests (${{ matrix.browser }}, ${{ matrix.os }}) browser: ${{ matrix.browser }} @@ -99,6 +91,7 @@ jobs: --local_test_jobs 1 --test_size_filters large --test_tag_filters ${{ matrix.browser }} + ${{ matrix.os != 'windows' && '--pin_browsers' || '' }} //rb/spec/... integration-tests-remote: @@ -111,12 +104,6 @@ jobs: include: - browser: edge os: windows - - browser: chrome - os: ubuntu - - browser: firefox - os: ubuntu - - browser: safari - os: macos with: name: Remote Tests (${{ matrix.browser }}, ${{ matrix.os }}) browser: ${{ matrix.browser }} @@ -130,4 +117,5 @@ jobs: --local_test_jobs 1 --test_size_filters large --test_tag_filters ${{ matrix.browser }}-remote + ${{ matrix.os != 'windows' && '--pin_browsers' || '' }} //rb/spec/... diff --git a/.github/workflows/ci-rust.yml b/.github/workflows/ci-rust.yml index 09b135f5d4e59..6b165b69cc05f 100644 --- a/.github/workflows/ci-rust.yml +++ b/.github/workflows/ci-rust.yml @@ -40,7 +40,7 @@ jobs: name: Tests (${{ matrix.os }}) cache-key: rust-test os: ${{ matrix.os }} - run: bazel test --test_env=RUST_BACKTRACE=1 --flaky_test_attempts=3 //rust/... + run: bazel test --test_env=RUST_BACKTRACE=full --test_env=RUST_TEST_NOCAPTURE=1 --flaky_test_attempts=3 //rust/... windows-stable: name: "Windows Stable" @@ -163,7 +163,7 @@ jobs: macos-stable: name: "MacOS Stable" - runs-on: macos-latest + runs-on: macos-13 needs: tests if: github.event_name != 'schedule' env: @@ -195,7 +195,7 @@ jobs: macos-debug: name: "MacOS Debug" - runs-on: macos-latest + runs-on: macos-13 needs: tests if: github.event_name != 'schedule' env: @@ -230,7 +230,7 @@ jobs: release: name: "Release Binaries" runs-on: ubuntu-latest - needs: [macos-stable, linux-stable, windows-stable, macos-debug, linux-debug, windows-debug] + needs: [ macos-stable, linux-stable, windows-stable, macos-debug, linux-debug, windows-debug ] if: github.event_name != 'schedule' && github.repository_owner == 'seleniumhq' && (github.ref == 'refs/heads/trunk' || inputs.release == 'true') steps: - name: "Checkout selenium_manager_artifacts" @@ -257,7 +257,7 @@ jobs: git tag ${{ env.TAG_NAME }} git push && git push --tags - name: "Release" - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: token: ${{ secrets.SELENIUM_CI_TOKEN }} repository: SeleniumHQ/selenium_manager_artifacts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e5c078ffc68d4..2175fe47d3b96 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,16 +21,15 @@ jobs: with: fetch-depth: 50 - name: Setup Bazel - uses: bazel-contrib/setup-bazel@0.8.1 + uses: bazel-contrib/setup-bazel@0.8.5 with: bazelisk-cache: true + cache-version: 2 external-cache: | name: ci-check manifest: crates: rust/Cargo.Bazel.lock - npm: package-lock.json - pypi__pip: py/requirements_lock.txt - ruby: rb/.ruby-version + rules_ruby~~ruby~ruby: rb/.ruby-version repository-cache: true - name: Check Bazel targets id: check-targets @@ -60,17 +59,6 @@ jobs: contains(join(github.event.commits.*.message), '[java]') || contains(github.event.pull_request.title, '[java]') - javascript: - name: JavaScript - needs: check - uses: ./.github/workflows/ci-javascript.yml - if: > - github.event_name == 'schedule' || - github.event_name == 'workflow_dispatch' || - contains(needs.check.outputs.targets, '//javascript') || - contains(join(github.event.commits.*.message), '[js]') || - contains(github.event.pull_request.title, '[js]') - python: name: Python needs: check diff --git a/.github/workflows/delete-comments.yml b/.github/workflows/delete-comments.yml new file mode 100644 index 0000000000000..d766665ced333 --- /dev/null +++ b/.github/workflows/delete-comments.yml @@ -0,0 +1,44 @@ +name: Delete Comments + +on: + issue_comment: + types: [created] + +permissions: + issues: write + +jobs: + delete_comment: + runs-on: ubuntu-latest + steps: + - name: Check for specific strings in comment + id: check_comment + uses: actions/github-script@v7 + with: + script: | + const comment = context.payload.comment.body; + const triggerStrings = ['www.mediafire.com']; + return triggerStrings.some(triggerString => comment.includes(triggerString)); + + - name: Delete comment if it contains any of the specific strings + if: steps.check_comment.outputs.result == 'true' + uses: actions/github-script@v7 + with: + script: | + const commentId = context.payload.comment.id; + await github.rest.issues.deleteComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: commentId + }); + + - name: Block user from the org if their comment contained any of the banned strings + if: steps.check_comment.outputs.result == 'true' + uses: actions/github-script@v7 + with: + script: | + const username = context.payload.comment.user.login + await github.rest.orgs.blockUser({ + org: context.repo.owner, + username: username + }); diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 38f3c47518b04..eeea269c87f62 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -19,6 +19,8 @@ on: - ruby - python - grid + - dotnet + - javascript jobs: ruby: @@ -31,47 +33,168 @@ jobs: gem: - selenium-webdriver with: - name: Release + name: Nightly Ruby Release cache-key: rb-nightly-${{ matrix.gem }} run: | export GEM_HOST_API_KEY="Bearer $GITHUB_TOKEN" - bazel run //rb:${{ matrix.gem }}-bump-nightly-version ${{ inputs.version }} - bazel run //rb:${{ matrix.gem }}-release-nightly + ./go rb:release[nightly] + on-ruby-failure: + name: On Ruby Failure + runs-on: ubuntu-latest + if: ${{ always() && (needs.ruby.result == 'failure' || needs.ruby.result == 'timed_out') }} + needs: ruby + steps: + - uses: actions/checkout@v4 + - name: Slack Notification + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_ICON_EMOJI: ":rotating_light:" + SLACK_COLOR: ${{ needs.ruby.status }} + SLACK_CHANNEL: selenium-tlc + SLACK_USERNAME: GitHub Workflows + SLACK_TITLE: Nightly Ruby ${{ needs.ruby.result }} + MSG_MINIMAL: actions url + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} python: if: (github.repository_owner == 'seleniumhq') && (inputs.language == 'python' || github.event_name == 'schedule') name: Python uses: ./.github/workflows/bazel.yml with: - name: Release + name: Nightly Python Release cache-key: python-nightly - run: | - ./go "py:version[nightly]" - ./go py:build - pip install twine - twine upload --repository testpypi bazel-bin/py/selenium-4*.whl bazel-bin/py/selenium-4*.tar.gz + run: ./go py:release[nightly] secrets: inherit - + on-python-failure: + name: On Python Failure + runs-on: ubuntu-latest + if: ${{ always() && (needs.python.result == 'failure' || needs.python.result == 'timed_out') }} + needs: python + steps: + - uses: actions/checkout@v4 + - name: Slack Notification + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_ICON_EMOJI: ":rotating_light:" + SLACK_COLOR: ${{ needs.python.status }} + SLACK_CHANNEL: selenium-tlc + SLACK_USERNAME: GitHub Workflows + SLACK_TITLE: Nightly Python ${{ needs.python.result }} + MSG_MINIMAL: actions url + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} java: if: (github.repository_owner == 'seleniumhq') && (inputs.language == 'java' || github.event_name == 'schedule') name: Java uses: ./.github/workflows/bazel.yml with: - name: Release + name: Nightly Java Release cache-key: java-nightly - run: | - ./go publish-maven-snapshot + run: ./go java:release[nightly] + secrets: inherit + on-java-failure: + name: On Java Failure + runs-on: ubuntu-latest + if: ${{ always() && (needs.java.result == 'failure' || needs.java.result == 'timed_out') }} + needs: java + steps: + - uses: actions/checkout@v4 + - name: Slack Notification + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_ICON_EMOJI: ":rotating_light:" + SLACK_COLOR: ${{ needs.java.status }} + SLACK_CHANNEL: selenium-tlc + SLACK_USERNAME: GitHub Workflows + SLACK_TITLE: Nightly Java ${{ needs.java.result }} + MSG_MINIMAL: actions url + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} + + dotnet: + if: (github.repository_owner == 'seleniumhq') && (inputs.language == 'dotnet' || github.event_name == 'schedule') + name: DotNet + uses: ./.github/workflows/bazel.yml + with: + name: Nightly DotNet Release + cache-key: dotnet-nightly + dotnet-version: '6.x' + run: ./go dotnet:release[--stamp,nightly] secrets: inherit + on-dotnet-failure: + name: On .NET Failure + runs-on: ubuntu-latest + if: ${{ always() && (needs.dotnet.result == 'failure' || needs.dotnet.result == 'timed_out') }} + needs: dotnet + steps: + - uses: actions/checkout@v4 + - name: Slack Notification + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_ICON_EMOJI: ":rotating_light:" + SLACK_COLOR: ${{ needs.dotnet.status }} + SLACK_CHANNEL: selenium-tlc + SLACK_USERNAME: GitHub Workflows + SLACK_TITLE: Nightly .NET ${{ needs.dotnet.result }} + MSG_MINIMAL: actions url + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} grid: if: (github.repository_owner == 'seleniumhq') && (inputs.language == 'grid' || github.event_name == 'schedule') name: Grid uses: ./.github/workflows/bazel.yml with: - name: Release + name: Nightly Grid Release cache-key: grid-nightly - run: | - echo build --stamp >>.bazelrc.local - ./go java-release-zip + run: ./go java:package[--config=release] nightly-release-files: build/dist/*.* + on-grid-failure: + name: On Grid Failure + runs-on: ubuntu-latest + if: ${{ always() && (needs.grid.result == 'failure' || needs.grid.result == 'timed_out') }} + needs: grid + steps: + - uses: actions/checkout@v4 + - name: Slack Notification + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_ICON_EMOJI: ":rotating_light:" + SLACK_COLOR: ${{ needs.grid.status }} + SLACK_CHANNEL: selenium-tlc + SLACK_USERNAME: GitHub Workflows + SLACK_TITLE: Nightly Grid ${{ needs.grid.result }} + MSG_MINIMAL: actions url + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} + + javascript: + if: (github.repository_owner == 'seleniumhq') && (inputs.language == 'javascript' || github.event_name == 'schedule') + name: JavaScript + uses: ./.github/workflows/bazel.yml + with: + name: Nightly JavaScript Release + cache-key: javascript-nightly + node-version: '18.x' + run: | + sed -i 's|https://registry.npmjs.org/|https://npm.pkg.github.com|g' javascript/node/selenium-webdriver/package.json + sed -i 's|"name": "selenium-webdriver"|"name": "@seleniumhq/selenium-webdriver"|g' javascript/node/selenium-webdriver/package.json + echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}" >> ~/.npmrc + echo "@seleniumhq:registry=https://npm.pkg.github.com" >> ~/.npmrc + echo "always-auth=true" >> ~/.npmrc + ./go node:release[--stamp,nightly] + secrets: inherit + on-javascript-failure: + name: On JavaScript Failure + runs-on: ubuntu-latest + if: ${{ always() && (needs.javascript.result == 'failure' || needs.javascript.result == 'timed_out') }} + needs: javascript + steps: + - uses: actions/checkout@v4 + - name: Slack Notification + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_ICON_EMOJI: ":rotating_light:" + SLACK_COLOR: ${{ needs.javascript.status }} + SLACK_CHANNEL: selenium-tlc + SLACK_USERNAME: GitHub Workflows + SLACK_TITLE: Nightly JavaScript ${{ needs.javascript.result }} + MSG_MINIMAL: actions url + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/pin-browsers.yml b/.github/workflows/pin-browsers.yml index 20bf9b7699e63..1275d3e159946 100644 --- a/.github/workflows/pin-browsers.yml +++ b/.github/workflows/pin-browsers.yml @@ -36,7 +36,7 @@ jobs: fi - name: Create Pull Request if: env.CHANGES_FOUND == 'true' - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: token: ${{ secrets.SELENIUM_CI_TOKEN }} add-paths: common/repositories.bzl diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index e8687a26d725b..fb2d19a97a272 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -36,7 +36,7 @@ jobs: git checkout -b release-${{ github.event.inputs.version }} - name: Update Rust Version run: | - ./go rust:version + ./go rust:version[${{ github.event.inputs.version }}] ./go rust:version:commit - name: Push changes uses: ad-m/github-push-action@master @@ -68,9 +68,10 @@ jobs: fetch-tags: true ref: release-${{ github.event.inputs.version }} - name: Install Ruby - uses: ruby/setup-ruby@ec02537da5712d66d4d50a0f33b7eb52773b5ed1 + uses: ruby/setup-ruby@v1 with: ruby-version: '3.1' + working-directory: 'rb' - name: "Prep git" run: | git config --local user.email "selenium-ci@users.noreply.github.com" @@ -79,20 +80,22 @@ jobs: run: git reset HEAD~1 - name: Update everything including early release CDP if: ${{ github.event.inputs.chrome_channel == 'early-stable' }} - run: ./go all:prepare['Beta'] + run: ./go all:prepare[${{ github.event.inputs.version }},Beta] - name: Update everything including released CDP if: ${{ github.event.inputs.chrome_channel == 'stable' }} - run: ./go "all:prepare[Stable]" + run: ./go "all:prepare[${{ github.event.inputs.version }},Stable]" - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v6 with: token: ${{ secrets.SELENIUM_CI_TOKEN }} author: Selenium CI Bot delete-branch: true + branch: release-preparation-${{ github.event.inputs.version }} + base: trunk title: "[build] Prepare for release of Selenium ${{ github.event.inputs.version }}" body: | **Warning: Manually update the changelogs before merging** - + This PR: * Updates Rust version for Selenium Manager release * Updates Pinned browser version to coincide with new CDP release @@ -102,9 +105,9 @@ jobs: * Adds new authors to authors file * Updates all versions for all bindings * Generates *rough* change logs for each bindings (please tidy them up before merging this) - + - Auto-generated by [create-pull-request][1] - + [1]: https://github.com/peter-evans/create-pull-request labels: C-build draft: true diff --git a/.github/workflows/stage-release.yml b/.github/workflows/stage-release.yml new file mode 100644 index 0000000000000..6d15a040cfdc0 --- /dev/null +++ b/.github/workflows/stage-release.yml @@ -0,0 +1,65 @@ +name: Release Staging + +on: + pull_request: + types: [closed] + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH_NAME: ${{ github.event.pull_request.head.ref }} + +jobs: + github-release: + if: > + github.event.pull_request.merged == true && + github.repository_owner == 'seleniumhq' && + startsWith(github.event.pull_request.head.ref, 'release-preparation-') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v4 + - name: Extract version from branch name + id: extract_version + run: | + VERSION=$(echo $BRANCH_NAME | grep -oE '[0-9]+\.[0-9]+\.[0-9]+') + echo "VERSION=$VERSION" >> $GITHUB_ENV + - name: Prep git + run: | + git config --local user.email "selenium-ci@users.noreply.github.com" + git config --local user.name "Selenium CI Bot" + - name: Tag Release + run: | + git tag selenium-${{ env.VERSION }} + git push origin selenium-${{ env.VERSION }} + - name: Update Nightly Tag to Remove pre-release + run: | + git fetch --tags + git tag -d nightly || echo "Nightly tag not found" + git tag nightly + git push origin refs/tags/nightly --force + - name: Setup Java + uses: actions/setup-java@v3 + with: + java-version: 17 + distribution: 'temurin' + - name: Build and Stage Packages + run: ./go all:package[--config=release] + - name: Generate Draft Release + uses: softprops/action-gh-release@v2 + with: + name: Selenium ${{ env.VERSION }} + body: | + ## Detailed Changelogs by Component + **[Java](https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG)**     |     **[Python](https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES)**     |     **[DotNet](https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/CHANGELOG)**     |     **[Ruby](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)**     |     **[JavaScript](https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/node/selenium-webdriver/CHANGES.md)**     |     **[IEDriver](https://github.com/SeleniumHQ/selenium/blob/trunk/cpp/iedriverserver/CHANGELOG)** +
+ tag_name: selenium-${{ env.VERSION }} + draft: true + generate_release_notes: true + prerelease: false + files: build/dist/*.* + + update-documentation: + needs: github-release + uses: ./.github/workflows/update-documentation.yml + with: + tag: selenium-${{ needs.github-release.outputs.version }} diff --git a/.github/workflows/update-documentation.yml b/.github/workflows/update-documentation.yml new file mode 100644 index 0000000000000..7e2e5efee541f --- /dev/null +++ b/.github/workflows/update-documentation.yml @@ -0,0 +1,254 @@ +name: Update Documentation + +on: + workflow_dispatch: + inputs: + tag: + description: Release tag (e.g. selenium-4.21.0) + required: true + type: string + + workflow_call: + inputs: + tag: + required: true + type: string + +env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + +jobs: + determine-language: + runs-on: ubuntu-latest + outputs: + language: ${{ steps.get-language.outputs.language }} + steps: + - name: Parse language from tag + id: get-language + run: | + tag=${{ inputs.tag }} + language=$(echo $tag | awk -F'-' '{print $NF}') + if [[ ! "$language" =~ ^(java|ruby|python|dotnet|node)$ ]]; then + language="all" + fi + echo "language=$language" > $GITHUB_OUTPUT + + java-docs: + runs-on: ubuntu-latest + needs: determine-language + steps: + - name: Checkout the tag + uses: actions/checkout@v4 + with: + ref: ${{ inputs.tag }} + - name: Prep git + run: | + git config --local user.email "selenium-ci@users.noreply.github.com" + git config --local user.name "Selenium CI Bot" + - name: Setup Java + uses: actions/setup-java@v3 + with: + java-version: 17 + distribution: 'temurin' + - name: Update Documentation + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'java' + run: ./go java:docs + - name: Create patch for changes + run: | + git format-patch -1 HEAD --stdout > java-docs.patch + - name: Upload patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'java' + uses: actions/upload-artifact@v2 + with: + name: java-docs-patch + path: java-docs.patch + + ruby-docs: + runs-on: ubuntu-latest + needs: determine-language + steps: + - name: Checkout the tag + uses: actions/checkout@v4 + with: + ref: ${{ inputs.tag }} + - name: Prep git + run: | + git config --local user.email "selenium-ci@users.noreply.github.com" + git config --local user.name "Selenium CI Bot" + - name: Setup Java + uses: actions/setup-java@v3 + with: + java-version: 17 + distribution: 'temurin' + - name: Update Documentation + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'ruby' + run: ./go rb:docs + - name: Create patch for changes + run: | + git format-patch -1 HEAD --stdout > ruby-docs.patch + - name: Upload patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'ruby' + uses: actions/upload-artifact@v2 + with: + name: ruby-docs-patch + path: ruby-docs.patch + + python-docs: + needs: determine-language + runs-on: ubuntu-latest + steps: + - name: Checkout the tag + uses: actions/checkout@v4 + with: + ref: ${{ inputs.tag }} + - name: Prep git + run: | + git config --local user.email "selenium-ci@users.noreply.github.com" + git config --local user.name "Selenium CI Bot" + - name: Set up Python 3.8 + uses: actions/setup-python@v4 + with: + python-version: 3.8 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install tox + - name: Update Documentation + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'python' + run: ./go py:docs + - name: Create patch for changes + run: | + git format-patch -1 HEAD --stdout > python-docs.patch + - name: Upload patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'python' + uses: actions/upload-artifact@v2 + with: + name: python-docs-patch + path: python-docs.patch + + dotnet-docs: + needs: determine-language + runs-on: ubuntu-latest + steps: + - name: Checkout the tag + uses: actions/checkout@v4 + with: + ref: ${{ inputs.tag }} + - name: Prep git + run: | + git config --local user.email "selenium-ci@users.noreply.github.com" + git config --local user.name "Selenium CI Bot" + - name: Install specific version of DocFX tool + # Pinning to 2.75.3 to avoid breaking changes in newer versions + # See https://github.com/dotnet/docfx/issues/9855 + run: dotnet tool install --global --version 2.75.3 docfx + - name: Update Documentation + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'dotnet' + run: ./go dotnet:docs + - name: Create patch for changes + run: | + git format-patch -1 HEAD --stdout > dotnet-docs.patch + - name: Upload patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'dotnet' + uses: actions/upload-artifact@v2 + with: + name: dotnet-docs-patch + path: dotnet-docs.patch + + node-docs: + needs: determine-language + runs-on: ubuntu-latest + steps: + - name: Checkout the tag + uses: actions/checkout@v4 + with: + ref: ${{ inputs.tag }} + - name: Prep git + run: | + git config --local user.email "selenium-ci@users.noreply.github.com" + git config --local user.name "Selenium CI Bot" + - name: Install npm dependencies + run: | + npm install + npm install --prefix javascript/node/selenium-webdriver + - name: Update Documentation + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'node' + run: ./go node:docs + - name: Create patch for changes + run: | + git format-patch -1 HEAD --stdout > node-docs.patch + - name: Upload patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'node' + uses: actions/upload-artifact@v2 + with: + name: node-docs-patch + path: node-docs.patch + + merge-patches: + runs-on: ubuntu-latest + needs: [java-docs, ruby-docs, python-docs, dotnet-docs, node-docs] + steps: + - name: Checkout documentation branch + uses: actions/checkout@v4 + with: + ref: 'gh-pages' + - name: Create and checkout new branch + run: | + git config --local user.email "selenium-ci@users.noreply.github.com" + git config --local user.name "Selenium CI Bot" + git checkout -b api-docs-${{ inputs.tag }} + - name: Download Java patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'java' + uses: actions/download-artifact@v2 + with: + name: java-docs-patch + path: patches/ + - name: Download Ruby patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'ruby' + uses: actions/download-artifact@v2 + with: + name: ruby-docs-patch + path: patches/ + - name: Download Python patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'python' + uses: actions/download-artifact@v2 + with: + name: python-docs-patch + path: patches/ + - name: Download .NET patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'dotnet' + uses: actions/download-artifact@v2 + with: + name: dotnet-docs-patch + path: patches/ + - name: Download Node patch + if: needs.determine-language.outputs.language == 'all' || needs.determine-language.outputs.language == 'node' + uses: actions/download-artifact@v2 + with: + name: node-docs-patch + path: patches/ + - name: Apply patches + run: | + for patch in patches/*.patch; do + git am < "$patch" + done + - name: Push Branch + run: git push origin api-docs-${{ inputs.tag }} + - name: Documentation Pull Request + uses: peter-evans/create-pull-request@v6 + with: + token: ${{ secrets.SELENIUM_CI_TOKEN }} + author: Selenium CI Bot + delete-branch: true + branch: api-docs-${{ inputs.tag }} + base: gh-pages + title: Update documentation for ${{ inputs.tag }} + body: | + This PR updates the API documentation for all bindings + based on the provided tag name. + + - Auto-generated by [create-pull-request][1] + + [1]: https://github.com/peter-evans/create-pull-request + labels: documentation + draft: false diff --git a/.gitignore b/.gitignore index 5bf103eed871d..259551ffd4482 100644 --- a/.gitignore +++ b/.gitignore @@ -74,8 +74,10 @@ py/selenium/webdriver/remote/findElements.js py/selenium/webdriver/remote/getAttribute.js py/selenium/webdriver/remote/isDisplayed.js py/docs/build/ +py/docs/source/**/* py/build/ py/LICENSE +py/pytestdebug.log selenium.egg-info/ third_party/java/jetty/jetty-repacked.jar *.user @@ -125,6 +127,7 @@ bazel-genfiles bazel-out bazel-selenium bazel-testlogs +MODULE.bazel.lock /.vscode/ /.scannerwork/ diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml index c8685587c1288..afac610da5956 100644 --- a/.idea/jsLibraryMappings.xml +++ b/.idea/jsLibraryMappings.xml @@ -1,8 +1,6 @@ - - \ No newline at end of file diff --git a/.skipped-tests b/.skipped-tests index c6502a27c0a6a..82b2d1c796077 100644 --- a/.skipped-tests +++ b/.skipped-tests @@ -1,3 +1,5 @@ +-//dotnet/test/common:NetworkInterceptionTests-chrome +-//dotnet/test/common:NetworkInterceptionTests-edge -//java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest -//java/test/org/openqa/selenium/chrome:ChromeDriverFunctionalTest-remote -//java/test/org/openqa/selenium/edge:EdgeDriverFunctionalTest @@ -17,10 +19,40 @@ -//javascript/atoms:test-chrome -//javascript/atoms:test-edge -//javascript/atoms:test-firefox-beta +-//javascript/chrome-driver/... +-//javascript/node/selenium-webdriver:test-bidi-network-test.js-chrome +-//javascript/node/selenium-webdriver:test-builder-test.js-chrome +-//javascript/node/selenium-webdriver:test-builder-test.js-firefox +-//javascript/node/selenium-webdriver:test-chrome-devtools-test.js-chrome +-//javascript/node/selenium-webdriver:test-chrome-options-test.js-chrome +-//javascript/node/selenium-webdriver:test-chrome-service-test.js-chrome +-//javascript/node/selenium-webdriver:test-firefox-options-test.js-firefox +-//javascript/node/selenium-webdriver:test-lib-capabilities-test.js-chrome -//py:test-chrome-test/selenium/webdriver/chrome/chrome_launcher_tests.py -//py:test-chrome-test/selenium/webdriver/chrome/chrome_service_tests.py -//py:test-chrome-test/selenium/webdriver/chrome/proxy_tests.py -//rb/spec/integration/selenium/webdriver/chrome:service-chrome +-//rb/spec/integration/selenium/webdriver/chrome:service-chrome-bidi +-//rb/spec/integration/selenium/webdriver/chrome:service-chrome-remote -//rb/spec/integration/selenium/webdriver/edge:service-edge +-//rb/spec/integration/selenium/webdriver/edge:service-edge-bidi +-//rb/spec/integration/selenium/webdriver/edge:service-edge-remote +-//rb/spec/integration/selenium/webdriver/firefox:driver-firefox-beta-bidi -//rb/spec/integration/selenium/webdriver/firefox:service-firefox -//rb/spec/integration/selenium/webdriver/firefox:service-firefox-beta +-//rb/spec/integration/selenium/webdriver/firefox:service-firefox-beta-bidi +-//rb/spec/integration/selenium/webdriver/firefox:service-firefox-beta-remote +-//rb/spec/integration/selenium/webdriver/firefox:service-firefox-bidi +-//rb/spec/integration/selenium/webdriver/firefox:service-firefox-remote +-//rb/spec/integration/selenium/webdriver/remote:driver-chrome-remote +-//rb/spec/integration/selenium/webdriver/remote:driver-edge-remote +-//rb/spec/integration/selenium/webdriver/remote:driver-firefox-beta-remote +-//rb/spec/integration/selenium/webdriver/remote:driver-firefox-remote +-//rb/spec/integration/selenium/webdriver/remote:element-chrome-remote +-//rb/spec/integration/selenium/webdriver/remote:element-edge-remote +-//rb/spec/integration/selenium/webdriver/remote:element-firefox-beta-remote +-//rb/spec/integration/selenium/webdriver/remote:element-firefox-remote +-//rb/spec/integration/selenium/webdriver:element-chrome +-//rb/spec/integration/selenium/webdriver:element-chrome-bidi +-//rb/spec/integration/selenium/webdriver:element-chrome-remote +-//rust/tests/... diff --git a/AUTHORS b/AUTHORS index ebbbc1292c21a..de3df458c7739 100644 --- a/AUTHORS +++ b/AUTHORS @@ -23,6 +23,7 @@ Ahmed Ashour AJ Ajay Kemparaj Akhil Lb +Ákos Lukács Akuli Al Sutton Alan Baird @@ -41,6 +42,7 @@ Alex Savchuk Alexander Bayandin Alexander Dobrynin Alexander Kavanaugh +Alexander Millin Alexandr Savchuk Alexandre Abreu Alexei Barantsev @@ -63,12 +65,14 @@ Andras Hatvani Andre Wiggins <459878+andrewiggins@users.noreply.github.com> Andreas Tolf Tolfsen Andreas Tolfsen +Andrei Andrei Botalov Andrei Rusu Andrei Solntsev Andrey Botalov Andrii Rohovets Andy Duncan +Angie Jones anonymous_sdet Anthony Sottile Anton Usmansky @@ -88,6 +92,7 @@ Ashley Trinh Aslak Hellesøy asmundak Atsushi Tatsuma +Augustin Gottlieb Pequeno <33221555+aguspe@users.noreply.github.com> Aurélien Pupier Austin Michael Wilkins <42476341+amwilkins@users.noreply.github.com> BaerMitUmlaut @@ -98,6 +103,7 @@ Ben Kucera <14625260+Bkucera@users.noreply.github.com> Ben Lamm Ben Sedat Benjamin Forehand Jr +bgermann bhecquet bhkwan Bill Agee @@ -131,6 +137,7 @@ Carlos Ortega Carlos Villela Carson McDonald ce86f3bb9faf71e <118820152+ce86f3bb9faf71e@users.noreply.github.com> +Cédric Boutillier Cervac Petru cezarelnazli ch-saeki <31008335+ch-saeki@users.noreply.github.com> @@ -142,10 +149,12 @@ Chirag Jayswal chris Chris Block Chris Gamache +Chris Gossett <54162250+cgossett@users.noreply.github.com> Chris Martin Chris Mohr Chris Stringer Chris Ward +Christian Ansel <36796016+ChrstnAnsl@users.noreply.github.com> Christian Biesinger Christian Clauss Christopher Buttkus @@ -165,7 +174,6 @@ Coty Rosenblath Craig Nishina CsolG customcommander -Cédric Boutillier Dakkaron Damien Allison Damir @@ -217,6 +225,7 @@ Diego Fernández Santos Diego Molina Dima Kovalenko Dima Veselov +Diogo Teles Sant'Anna Dmitriy Sintsov Dmitry Dubenets Dmitry Tokarev @@ -238,6 +247,8 @@ Dylan Reichstadt Dylan Semler Earlopain <14981592+Earlopain@users.noreply.github.com> Eberhard Beilharz +Ed Manlove +Ed Manlove Edi Weissmann Edirin Atumah Eduardo Wermuth @@ -256,6 +267,7 @@ Eric Plaster Erik Beans Erik E. Beerepoot Erik Kuefler +Étienne Barrié Evan Sangaline Evgeniy Roldukhin EwaMarek @@ -267,10 +279,10 @@ Florian LOPES Florian Mutter <32459530+florianmutter@users.noreply.github.com> Florian Zipperle Francis Bergin -Franz Liedke François Freitag François JACQUES François Reynaud +Franz Liedke Frederik Carlier Fredrik Wollsén freynaud @@ -340,6 +352,7 @@ ifland Ilya Kozhevnikov Ilyas Bayraktar Immanuel Hayden +Indomitable Innokenty Shuvalov Isaac A. Murchie Isaul Vargas @@ -364,6 +377,7 @@ James Garbutt <43081j@users.noreply.github.com> James Hilliard James Martin James Strachen +James Yuzawa jamespdo Jan Trejbal Jan Weitz @@ -411,8 +425,10 @@ Jim van Musscher jkbzh <3439365+jkbzh@users.noreply.github.com> jkohls jmuramatsu +João Luca Ripardo Joaquín Romero jochenberger +Joe Bandenburg Joe Lencioni Joe Schulte Joe Walnes @@ -441,12 +457,12 @@ Jonathan Lipps Jonathon Kereliuk Jongkuen Hong Jordan Mace +Jörg Sautter josephg Josh Goldberg Joshua Bruning Joshua Fehler Joshua Grant -João Luca Ripardo JT Archie jugglinmike Julian Didier @@ -461,7 +477,6 @@ Justin Tulloss Justine Tunney justinwoolley@gmail.com jwoolley <19597672+jwoolley@users.noreply.github.com> -Jörg Sautter Kamen Litchev Karl Kuehn Karl-Philipp Richter @@ -515,10 +530,10 @@ Lucas Diniz Lucas Tierney Luis Correia Luis Pflamminger +Lukáš Linhart Luke Hill Luke Inman-Semerau lukec -Lukáš Linhart Lyudmil Latinov Machinexa2 <60662297+machinexa2@users.noreply.github.com> Maciej Pakulski @@ -597,6 +612,7 @@ ming Mirko Nasato mitchloudenbeck Miten Chauhan +mk868 mkvetko MMK-IBSEN <124664589+MMK-IBSEN@users.noreply.github.com> Mohab Mohie @@ -611,6 +627,7 @@ mpurland mtrea <32470080+mtrea@users.noreply.github.com> Mubariz Hajimuradov Muhammad Hammad <33136628+mhnaeem@users.noreply.github.com> +MustafaAgamy Muthu Kannan MWschutte <72599545+MWschutte@users.noreply.github.com> myslak71 @@ -619,6 +636,7 @@ Nathan Isom native-api Naveen <172697+naveensrinivasan@users.noreply.github.com> Naveen Singh <36371707+Naveen3Singh@users.noreply.github.com> +Navin Chandra <98466550+navin772@users.noreply.github.com> Neil Carvalho Nelson Sproul Nick Crews @@ -640,6 +658,8 @@ nvonop Oboleninov Anton Oleg Höfling Oleg Ridchenko <73664101+oleg-rd@users.noreply.github.com> +Oleksandr Kulychok +Oleksandr Kulychok Oleksii Olivier SCHNEIDER Olle Jonsson @@ -659,6 +679,7 @@ Patrick Lightbody Paul G Webster Paul Hammant Pavel Lobashov +Pavel Sobolev Perryn Fowler Pete Johns Peter Hedenskog @@ -694,6 +715,7 @@ reichsta Reinaldo Rossetti Reinhold Degenfellner Remco +renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> richard.hines RichCrook richseviora @@ -732,6 +754,7 @@ Sankha Narayan Guria Santiago Suarez Ordoñez Sarah Bird Sayyid Ali Sajjad Rizavi <58586026+ali-sajjad-rizavi@users.noreply.github.com> +schrufygroovy <50398024+schrufygroovy@users.noreply.github.com> Scott Babcock Scott Sauber Scott Stevens @@ -760,6 +783,7 @@ Shishu Raj Pandey Shreyan Avigyan <74560907+shreyanavigyan@users.noreply.github.com> Shubham Singh <41840111+singh811@users.noreply.github.com> Shuhai Shen +Simon Benzer <69980130+shbenzer@users.noreply.github.com> Simon K Simon Perepelitsa Simon Stewart @@ -768,6 +792,7 @@ smhc Snail space88man Sri Harsha +Sri Harsha sridharUpputuri <52928428+sridharUpputuri@users.noreply.github.com> Srinivasan Sekar Sripathi Pai @@ -790,9 +815,9 @@ take0x <89313929+take0x@users.noreply.github.com> Takeshi Kishi Takuho NAKANO Takuma Chiba +Tamás Buka Tamas Utasi <3823780+utamas@users.noreply.github.com> Tamsil Sajid Amani -Tamás Buka Tatsuya Hoshino Terence Haddock thecr8tr @@ -835,6 +860,7 @@ Ulf Adams Ulrich Buchgraber User253489 V24 <55334829+umarfarouk98@users.noreply.github.com> +Václav Votípka Valery Yatsynovich Varun Menon varunsurapaneni <67070327+varunsurapaneni@users.noreply.github.com> @@ -859,7 +885,6 @@ Vladimir Támara Patiño VladimirPodolyan <36446855+VladimirPodolyan@users.noreply.github.com> Vladislav Velichko <111522705+vlad8x8@users.noreply.github.com> Vyvyan Codd -Václav Votípka Werner Robitza wiggin15 wildloop @@ -881,6 +906,4 @@ Zhuo Peng Ziyu Zoltar - Knower of All zsong -Ákos Lukács -Étienne Barrié 保木本将之 diff --git a/BUILD.bazel b/BUILD.bazel index f08bd9d81b5ba..43f9fae6400da 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,5 +1,5 @@ load("@aspect_rules_js//npm:defs.bzl", "npm_link_package") -load("@com_github_bazelbuild_buildtools//buildifier:def.bzl", "buildifier") +load("@buildifier_prebuilt//:rules.bzl", "buildifier") load("@npm//:defs.bzl", "npm_link_all_packages") load("//common:browsers.bzl", "chrome_data", "firefox_data") load("//java:browsers.bzl", "chrome_jvm_flags", "firefox_jvm_flags") @@ -21,6 +21,14 @@ filegroup( visibility = ["//visibility:public"], ) +filegroup( + name = "rakefile", + srcs = [ + "Rakefile", + ], + visibility = ["//rb:__subpackages__"], +) + alias( name = "grid", actual = "//java/src/org/openqa/selenium/grid:executable-grid", diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aa82517e05b5e..80b6ecaf11662 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -89,6 +89,40 @@ to check that your approach aligns with the project's ideas. Nothing is more frustrating than seeing your hard work go to waste because your vision doesn't align with the project's. +#### Dependencies Managed by Bazel + +##### Java + +Edit `MODULE.bazel`, and either update or add the dependency you want +using the regular maven coordinates to the `maven.install` with the +name `maven`. Once done, run `REPIN=1 bazel run @maven//:pin` to +update the lock file, create a PR and check the change in. + +##### JS + +We use `pnpm` for JS development in the project, and we also use [pnpm +workspaces](https://pnpm.io/workspaces). Take a look at the top-level +`pnpm-workspace.yaml` file to find them all, but the main thing to +know is that each of the workspaces has its own `package.json`. You +can add dependencies to specific workspaces either by using `pnpm` +installed on your local machine, or by executing: + +```shell +# Example of adding a dep to the JS webdriver bindings +cd javascript/node/selenium-webdriver +bazel run javascript:pnpm -- install my-amazing-dep --dir $PWD +``` + +This will install the dependency using the same version of `pnpm` we +build the project with for a single JS project. + +To update all dependencies in the tree to the latest version: + +`bazel run javascript:pnpm -- -r up --dir $PWD` + +This will also update the lock file, so once a change is made, create +a PR and commit all the changed files. + #### License Headers Every file in the Selenium project must carry the following license diff --git a/MODULE.bazel b/MODULE.bazel index da473aab627f7..7ee21c50a99db 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -1 +1,374 @@ module(name = "selenium") + +bazel_dep(name = "apple_rules_lint", version = "0.3.2") +bazel_dep(name = "aspect_bazel_lib", version = "2.7.9") +bazel_dep(name = "aspect_rules_esbuild", version = "0.20.1") +bazel_dep(name = "aspect_rules_js", version = "1.42.3") +bazel_dep(name = "aspect_rules_ts", version = "2.4.2") +bazel_dep(name = "bazel_features", version = "1.13.0") +bazel_dep(name = "bazel_skylib", version = "1.7.1") +bazel_dep(name = "buildifier_prebuilt", version = "6.4.0") +bazel_dep(name = "contrib_rules_jvm", version = "0.27.0") +bazel_dep(name = "platforms", version = "0.0.10") + +# Required for the closure rules +bazel_dep(name = "protobuf", version = "21.7", dev_dependency = True, repo_name = "com_google_protobuf") + +# Required for rules_rust to import the crates properly +bazel_dep(name = "rules_cc", version = "0.0.9", dev_dependency = True) + +bazel_dep(name = "rules_dotnet", version = "0.15.1") +bazel_dep(name = "rules_java", version = "7.6.3") +bazel_dep(name = "rules_jvm_external", version = "6.1") +bazel_dep(name = "rules_nodejs", version = "6.2.0") +bazel_dep(name = "rules_oci", version = "1.7.6") +bazel_dep(name = "rules_pkg", version = "0.10.1") +bazel_dep(name = "rules_python", version = "0.33.0") +bazel_dep(name = "rules_proto", version = "6.0.0") +bazel_dep(name = "rules_ruby", version = "0.11.0") + +linter = use_extension("@apple_rules_lint//lint:extensions.bzl", "linter") +linter.configure( + name = "java-spotbugs", + config = "//java:spotbugs-config", +) +linter.configure( + name = "rust-rustfmt", + config = "//rust:enable-rustfmt", +) +linter.register(name = "rust-rustfmt") + +node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node") +node.toolchain(node_version = "20.9.0") + +pnpm = use_extension( + "@aspect_rules_js//npm:extensions.bzl", + "pnpm", + dev_dependency = True, +) +use_repo(pnpm, "pnpm") + +npm = use_extension("@aspect_rules_js//npm:extensions.bzl", "npm") +npm.npm_translate_lock( + name = "npm", + data = [ + "@//:package.json", + "@//:pnpm-workspace.yaml", + "@//javascript/grid-ui:package.json", + "@//javascript/node/selenium-webdriver:package.json", + ], + generate_bzl_library_targets = True, + npmrc = "//:.npmrc", + pnpm_lock = "//:pnpm-lock.yaml", + update_pnpm_lock = True, + verify_node_modules_ignored = "//:.bazelignore", +) +use_repo(npm, "npm") + +rules_ts_ext = use_extension( + "@aspect_rules_ts//ts:extensions.bzl", + "ext", + dev_dependency = True, +) +rules_ts_ext.deps( + ts_version = "4.9.5", +) +use_repo(rules_ts_ext, "npm_typescript") + +esbuild = use_extension("@aspect_rules_esbuild//esbuild:extensions.bzl", "esbuild") +esbuild.toolchain(esbuild_version = "0.19.9") +use_repo(esbuild, "esbuild_toolchains") + +register_toolchains("@esbuild_toolchains//:all") + +dotnet = use_extension("@rules_dotnet//dotnet:extensions.bzl", "dotnet") +dotnet.toolchain(dotnet_version = "8.0.203") +use_repo(dotnet, "dotnet_toolchains") + +selenium_paket = use_extension("//dotnet:paket.nuget_extension.bzl", "nuget_extension") +use_repo(selenium_paket, "paket.nuget") + +register_toolchains("@dotnet_toolchains//:all") + +oci = use_extension("@rules_oci//oci:extensions.bzl", "oci") +oci.pull( + name = "java_image_base", + digest = "sha256:161a1d97d592b3f1919801578c3a47c8e932071168a96267698f4b669c24c76d", + image = "gcr.io/distroless/java17", +) +oci.pull( + name = "firefox_standalone", + digest = "sha256:b6d8279268b3183d0d33e667e82fec1824298902f77718764076de763673124f", + image = "index.docker.io/selenium/standalone-firefox", +) +oci.pull( + name = "chrome_standalone", + digest = "sha256:1b809a961a0a77787a7cccac74ddc5570b7e89747f925b8469ddb9a6624d4ece", + image = "index.docker.io/selenium/standalone-chrome", +) +use_repo(oci, "chrome_standalone", "firefox_standalone", "java_image_base") + +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python.toolchain( + is_default = True, + python_version = "3.8", +) +python.toolchain(python_version = "3.9") +python.toolchain(python_version = "3.10") +python.toolchain(python_version = "3.11") +use_repo(python, "pythons_hub") + +pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") + +[ + pip.parse( + hub_name = "py_dev_requirements", + python_version = version, + requirements_lock = "//py:requirements_lock.txt", + ) + for version in [ + "3.8", + "3.9", + "3.10", + "3.11", + ] +] + +use_repo(pip, "py_dev_requirements") + +register_toolchains("@pythons_hub//:all") + +# https://github.com/bazelbuild/rules_jvm_external/pull/1079 +archive_override( + module_name = "rules_jvm_external", + integrity = "sha256-yS8Qes1PLbYbe10b1WSgl0Auqn/1Wlxg8O3wSr7a/Sg=", + patch_strip = 1, + patches = ["//java:rules_jvm_external_javadoc.patch"], + strip_prefix = "rules_jvm_external-f572a26116c7ef71d8842dd056c2605782f7be8d", + urls = ["https://github.com/bazelbuild/rules_jvm_external/archive/f572a26116c7ef71d8842dd056c2605782f7be8d.tar.gz"], +) + +java_toolchains = use_extension("@rules_java//java:extensions.bzl", "toolchains") +use_repo( + java_toolchains, + "remote_java_tools", + "remote_java_tools_darwin_arm64", + "remote_java_tools_darwin_x86_64", + "remote_java_tools_linux", + "remote_java_tools_windows", + "remotejdk17_linux", + "remotejdk17_linux_s390x", + "remotejdk17_macos", + "remotejdk17_macos_aarch64", + "remotejdk17_win", + "remotejdk17_win_arm64", +) + +maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven") +maven.install( + name = "maven", + artifacts = [ + "com.beust:jcommander:1.82", + "com.github.javaparser:javaparser-core:3.26.1", + "com.github.spotbugs:spotbugs:4.8.6", + "com.github.stephenc.jcip:jcip-annotations:1.0-1", + "com.google.code.gson:gson:2.11.0", + "com.google.guava:guava:33.3.0-jre", + "com.google.auto:auto-common:1.2.2", + "com.google.auto.service:auto-service:1.1.1", + "com.google.auto.service:auto-service-annotations:1.1.1", + "com.google.googlejavaformat:google-java-format:jar:1.23.0", + "com.graphql-java:graphql-java:20.2", + "com.graphql-java:java-dataloader:3.2.0", + "dev.failsafe:failsafe:3.3.2", + "io.grpc:grpc-context:1.66.0", + "io.lettuce:lettuce-core:6.4.0.RELEASE", + "io.netty:netty-buffer:4.1.112.Final", + "io.netty:netty-codec-http:4.1.112.Final", + "io.netty:netty-codec-http2:4.1.112.Final", + "io.netty:netty-common:4.1.112.Final", + "io.netty:netty-handler:4.1.112.Final", + "io.netty:netty-handler-proxy:4.1.112.Final", + "io.netty:netty-transport:4.1.112.Final", + "io.opentelemetry:opentelemetry-api:1.41.0", + "io.opentelemetry:opentelemetry-context:1.41.0", + "io.opentelemetry:opentelemetry-exporter-logging:1.41.0", + "io.opentelemetry:opentelemetry-sdk:1.41.0", + "io.opentelemetry:opentelemetry-sdk-common:1.41.0", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.41.0", + "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.41.0", + "io.opentelemetry:opentelemetry-sdk-testing:1.41.0", + "io.opentelemetry:opentelemetry-sdk-trace:1.41.0", + "io.opentelemetry.semconv:opentelemetry-semconv:1.25.0-alpha", + "io.ous:jtoml:2.0.0", + "it.ozimov:embedded-redis:0.7.3", + "net.bytebuddy:byte-buddy:1.15.0", + "org.htmlunit:htmlunit-core-js:4.4.0", + "org.apache.commons:commons-exec:1.4.0", + "org.apache.logging.log4j:log4j-core:2.23.1", + "org.assertj:assertj-core:3.26.3", + "org.bouncycastle:bcpkix-jdk18on:1.78.1", + "org.eclipse.mylyn.github:org.eclipse.egit.github.core:2.1.5", + "org.hsqldb:hsqldb:2.7.3", + "org.jspecify:jspecify:1.0.0", + "org.junit.jupiter:junit-jupiter-api:5.11.0", + "org.junit.jupiter:junit-jupiter-engine:5.11.0", + "org.junit.jupiter:junit-jupiter-params:5.11.0", + "org.junit.platform:junit-platform-launcher:1.11.0", + "org.junit.platform:junit-platform-reporting:1.11.0", + "org.junit.platform:junit-platform-commons:1.11.0", + "org.junit.platform:junit-platform-engine:1.11.0", + "org.mockito:mockito-core:5.12.0", + "org.redisson:redisson:3.35.0", + "org.slf4j:slf4j-api:2.0.16", + "org.slf4j:slf4j-jdk14:2.0.16", + "org.zeromq:jeromq:0.6.0", + ], + excluded_artifacts = [ + "org.hamcrest:hamcrest-all", # Replaced by hamcrest 2 + "org.hamcrest:hamcrest-core", + "io.netty:netty-all", # Depend on the actual things you need + ], + fail_if_repin_required = True, + fail_on_missing_checksum = True, + fetch_sources = True, + lock_file = "//java:maven_install.json", + repositories = [ + "https://repo1.maven.org/maven2", + ], + strict_visibility = True, +) +use_repo(maven, "maven", "unpinned_maven") + +ruby = use_extension("@rules_ruby//ruby:extensions.bzl", "ruby") +ruby.toolchain( + name = "ruby", + msys2_packages = [ + "curl", + "libyaml", + ], + version_file = "//:rb/.ruby-version", +) +ruby.bundle_fetch( + name = "bundle", + srcs = [ + "//:rb/lib/selenium/devtools/version.rb", + "//:rb/lib/selenium/webdriver/version.rb", + "//:rb/selenium-devtools.gemspec", + "//:rb/selenium-webdriver.gemspec", + ], + gem_checksums = { + "activesupport-7.2.1": "7557fa077a592a4f36f7ddacf4d9d71c34aff69ed20236b8a61c22d567da8c24", + "addressable-2.8.7": "462986537cf3735ab5f3c0f557f14155d778f4b43ea4f485a9deb9c8f7c58232", + "ast-2.4.2": "1e280232e6a33754cde542bc5ef85520b74db2aac73ec14acef453784447cc12", + "base64-0.2.0": "0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507", + "bigdecimal-3.1.8": "a89467ed5a44f8ae01824af49cbc575871fa078332e8f77ea425725c1ffe27be", + "bigdecimal-3.1.8-java": "b9e94c14623fff8575f17a10320852219bbba92ecff4977571503d942687326e", + "concurrent-ruby-1.3.4": "d4aa926339b0a86b5b5054a0a8c580163e6f5dcbdfd0f4bb916b1a2570731c32", + "connection_pool-2.4.1": "0f40cf997091f1f04ff66da67eabd61a9fe0d4928b9a3645228532512fab62f4", + "crack-1.0.0": "c83aefdb428cdc7b66c7f287e488c796f055c0839e6e545fec2c7047743c4a49", + "csv-3.3.0": "0bbd1defdc31134abefed027a639b3723c2753862150f4c3ee61cab71b20d67d", + "curb-1.0.5": "2c4755dfb5d6190e9ebb4407b23ac5a5c2c226be1449e6d3bdf625656352efd1", + "debug-1.9.2": "48e026c0852c7a10c60263e2e527968308958e266231e36d64e3efcabec7e7fc", + "diff-lcs-1.5.1": "273223dfb40685548436d32b4733aa67351769c7dea621da7d9dd4813e63ddfe", + "drb-2.2.1": "e9d472bf785f558b96b25358bae115646da0dbfd45107ad858b0bc0d935cb340", + "ffi-1.17.0": "51630e43425078311c056ca75f961bb3bda1641ab36e44ad4c455e0b0e4a231c", + "ffi-1.17.0-java": "f65f022616970fcde83fe176393eb873a7b959ef2703f94931cf0af6ab55ec7a", + "ffi-1.17.0-x86_64-darwin": "fdcd48c69db3303ef95aec5c64d6275fcf9878a02c0bec0afddc506ceca0f56b", + "fileutils-1.7.2": "36a0fb324218263e52b486ad7408e9a295378fe8edc9fd343709e523c0980631", + "git-1.19.1": "b0a422d9f6517353c48a330d6114de4db9e0c82dbe7202964a1d9f1fbc827d70", + "hashdiff-1.1.1": "c7966316726e0ceefe9f5c6aef107ebc3ccfef8b6db55fe3934f046b2cf0936a", + "i18n-1.14.5": "26dcbc05e364b57e27ab430148b3377bc413987d34cc042336271d8f42e9d1b9", + "io-console-0.7.2": "f0dccff252f877a4f60d04a4dc6b442b185ebffb4b320ab69212a92b48a7a221", + "io-console-0.7.2-java": "73aa382f8832b116613ceaf57b8ff5bf73dfedcaf39f0aa5420e10f63a4543ed", + "irb-1.14.0": "53d805013bbd194874b8c13a56aca6aebcd11dd79166d88724f8a434fedde615", + "jar-dependencies-0.4.1": "b2df2f1ecbff15334ce20ea7fdd5b8d8161faab67761ff72c7647d728e40d387", + "json-2.7.2": "1898b5cbc81cd36c0fd4d0b7ad2682c39fb07c5ff682fc6265f678f550d4982c", + "json-2.7.2-java": "138e3038b5361b3d06ee2e8aa2be00bed0d0de4ef5f1553fc5935e5b93aca7ee", + "language_server-protocol-3.17.0.3": "3d5c58c02f44a20d972957a9febe386d7e7468ab3900ce6bd2b563dd910c6b3f", + "listen-3.9.0": "db9e4424e0e5834480385197c139cb6b0ae0ef28cc13310cfd1ca78377d59c67", + "logger-1.6.0": "0ab7c120262dd8de2a18cb8d377f1f318cbe98535160a508af9e7710ff43ef3e", + "minitest-5.25.1": "3db6795a80634def1cf86fda79d2d83b59b25ce5e186fa675f73c565589d2ad8", + "parallel-1.26.3": "d86babb7a2b814be9f4b81587bf0b6ce2da7d45969fab24d8ae4bf2bb4d4c7ef", + "parser-3.3.4.2": "71efa8690c2a1ff8937258ff5713add4894dcea8b4ba19055692e28a2469c9e6", + "psych-5.1.2": "337322f58fc2bf24827d2b9bd5ab595f6a72971867d151bb39980060ea40a368", + "psych-5.1.2-java": "1dd68dc609eddbc884e6892e11da942e16f7256bd30ebde9d35449d43043a6fe", + "public_suffix-6.0.1": "61d44e1cab5cbbbe5b31068481cf16976dd0dc1b6b07bd95617ef8c5e3e00c6f", + "racc-1.8.1": "4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f", + "racc-1.8.1-java": "54f2e6d1e1b91c154013277d986f52a90e5ececbe91465d29172e49342732b98", + "rack-2.2.9": "fd6301a97a1c1e955e68f85c861fcb1cde6145a32c532e1ea321a72ff8cc4042", + "rainbow-3.1.1": "039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a", + "rake-13.2.1": "46cb38dae65d7d74b6020a4ac9d48afed8eb8149c040eccf0523bec91907059d", + "rb-fsevent-0.11.2": "43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe", + "rb-inotify-0.11.1": "a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e", + "rbs-3.5.3": "f262eea0db1e40eaa154266096b1a4272bc965a81d78acb0e54b58b4dc11f052", + "rchardet-1.8.0": "693acd5253d5ade81a51940697955f6dd4bb2f0d245bda76a8e23deec70a52c7", + "rdoc-6.7.0": "b17d5f0f57b0853d7b880d4360a32c7caf8dbb81f8503a36426df809e617f379", + "regexp_parser-2.9.2": "5a27e767ad634f8a4b544520d5cd28a0db7aa1198a5d7c9d7e11d7b3d9066446", + "reline-0.5.9": "5d2dd7ed0fd078e79a05e4eaa47dc91b8dacec7358e9e1dd6d9c4636cff7d378", + "rexml-3.3.6": "7af0459d108dfd6ffa7d38c67c8464e200f5c9d476d4c6a3d1899e92808d63c6", + "rspec-3.13.0": "d490914ac1d5a5a64a0e1400c1d54ddd2a501324d703b8cfe83f458337bab993", + "rspec-core-3.13.0": "557792b4e88da883d580342b263d9652b6a10a12d5bda9ef967b01a48f15454c", + "rspec-expectations-3.13.2": "565fb94ab39923c0fe6a16cfc9570d1821b741917a50800373fcbbb752c7a45a", + "rspec-mocks-3.13.1": "087189899c337937bcf1d66a50dc3fc999ac88335bbeba4d385c2a38c87d7b38", + "rspec-support-3.13.1": "48877d4f15b772b7538f3693c22225f2eda490ba65a0515c4e7cf6f2f17de70f", + "rubocop-1.65.1": "3a239b71fcfdeb32c654f4b48c2e6aeb4f77b128e348fa9442184f207e70718d", + "rubocop-ast-1.32.1": "6a86ce3b7aa8ff8b600396d8f75ef5f85873b94bf0a1ae11607c19e65ced79c1", + "rubocop-capybara-2.21.0": "5d264efdd8b6c7081a3d4889decf1451a1cfaaec204d81534e236bc825b280ab", + "rubocop-factory_bot-2.26.1": "8de13cd4edcee5ca800f255188167ecef8dbfc3d1fae9f15734e9d2e755392aa", + "rubocop-performance-1.21.1": "5cf20002a544275ad6aa99abca4b945d2a2ed71be925c38fe83700360ed8734e", + "rubocop-rake-0.6.0": "56b6f22189af4b33d4f4e490a555c09f1281b02f4d48c3a61f6e8fe5f401d8db", + "rubocop-rspec-2.31.0": "2bae19388d78e1ceace44cd95fd34f3209f4ef20cac1b168d0a1325cbba3d672", + "rubocop-rspec_rails-2.29.1": "4ae95abbe9ca5a9b6d8be14e50d230fb5b6ba033b05d4c0981b5b76fc44988e4", + "ruby-progressbar-1.13.0": "80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33", + "rubyzip-2.3.2": "3f57e3935dc2255c414484fbf8d673b4909d8a6a57007ed754dde39342d2373f", + "securerandom-0.3.1": "98f0450c0ea46d2f9a4b6db4f391dbd83dc08049592eada155739f40e0341bde", + "steep-1.5.3": "7c6302a4d5932d0a46176ebc79766e52b853c223a85525aa2f8911e345123b85", + "stringio-3.1.1": "53456e14175c594e0e8eb2206a1be33f3974d4fe21c131e628908b05c8c2ae1e", + "strscan-3.1.0": "01b8a81d214fbf7b5308c6fb51b5972bbfc4a6aa1f166fd3618ba97e0fcd5555", + "strscan-3.1.0-java": "8645aa76e017e21764c6df572d2d79fcc1672284014f5bdbd806278cdbcd11b0", + "terminal-table-3.0.2": "f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91", + "tzinfo-2.0.6": "8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b", + "unicode-display_width-2.5.0": "7e7681dcade1add70cb9fda20dd77f300b8587c81ebbd165d14fd93144ff0ab4", + "webmock-3.23.1": "0fa738c0767d1c4ec8cc57f6b21998f0c238c8a5b32450df1c847f2767140d95", + "webrick-1.8.1": "19411ec6912911fd3df13559110127ea2badd0c035f7762873f58afc803e158f", + "websocket-1.2.11": "b7e7a74e2410b5e85c25858b26b3322f29161e300935f70a0e0d3c35e0462737", + "yard-0.9.36": "5505736c1b00c926f71053a606ab75f02070c5960d0778b901fe9d8b0a470be4", + }, + gemfile = "//:rb/Gemfile", + gemfile_lock = "//:rb/Gemfile.lock", +) +use_repo(ruby, "bundle", "ruby", "ruby_toolchains") + +register_toolchains("@ruby_toolchains//:all") + +selenium_manager_artifacts = use_extension("//common:selenium_manager.bzl", "selenium_manager_artifacts") +use_repo( + selenium_manager_artifacts, + "download_sm_linux", + "download_sm_macos", + "download_sm_windows", +) + +pin_browsers_extension = use_extension("//common:repositories.bzl", "pin_browsers_extension") +use_repo( + pin_browsers_extension, + "linux_beta_firefox", + "linux_chrome", + "linux_chromedriver", + "linux_edge", + "linux_edgedriver", + "linux_firefox", + "linux_geckodriver", + "mac_beta_firefox", + "mac_chrome", + "mac_chromedriver", + "mac_edge", + "mac_edgedriver", + "mac_firefox", + "mac_geckodriver", +) + +local_drivers = use_repo_rule("//common/private:drivers.bzl", "local_drivers") + +local_drivers(name = "local_drivers") diff --git a/README.md b/README.md index d2b905c8108f9..e5ef14de8c4f4 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![CI](https://github.com/SeleniumHQ/selenium/actions/workflows/ci.yml/badge.svg?branch=trunk&event=schedule)](https://github.com/SeleniumHQ/selenium/actions/workflows/ci.yml) -Selenium +Selenium Logo Selenium is an umbrella project encapsulating a variety of tools and libraries enabling web browser automation. Selenium specifically @@ -370,7 +370,6 @@ Supported browsers: * `safari-preview` In addition to the [Common Options Examples](#common-options-examples), here are some additional Ruby specific ones: -* `--test_arg "-tfocus"` - test only [focused specs](https://relishapp.com/rspec/rspec-core/v/3-12/docs/filtering/inclusion-filters) * `--test_arg "-eTimeouts"` - test only specs which name include "Timeouts" * `--test_arg ""` - pass any extra RSpec arguments (see `bazel run @bundle//bin:rspec -- --help`) diff --git a/Rakefile b/Rakefile index 0223e0b778bdc..a1b77c50b28b3 100644 --- a/Rakefile +++ b/Rakefile @@ -11,8 +11,6 @@ require 'open-uri' require 'git' require 'find' -include Rake::DSL - Rake.application.instance_variable_set(:@name, 'go') orig_verbose = verbose verbose(false) @@ -99,9 +97,9 @@ task '//java/test/org/openqa/selenium/environment/webserver:webserver:uber' => [ JAVA_RELEASE_TARGETS = %w[ //java/src/org/openqa/selenium/chrome:chrome.publish //java/src/org/openqa/selenium/chromium:chromium.publish - //java/src/org/openqa/selenium/devtools/v122:v122.publish - //java/src/org/openqa/selenium/devtools/v123:v123.publish - //java/src/org/openqa/selenium/devtools/v121:v121.publish + //java/src/org/openqa/selenium/devtools/v128:v128.publish + //java/src/org/openqa/selenium/devtools/v126:v126.publish + //java/src/org/openqa/selenium/devtools/v127:v127.publish //java/src/org/openqa/selenium/devtools/v85:v85.publish //java/src/org/openqa/selenium/edge:edge.publish //java/src/org/openqa/selenium/firefox:firefox.publish @@ -271,16 +269,13 @@ ie_generator.generate_type_mapping( desc 'Generate Javadocs' task javadocs: %i[//java/src/org/openqa/selenium/grid:all-javadocs] do - rm_rf 'build/docs/api/java' - mkdir_p 'build/docs/api/java' - + FileUtils.rm_rf('build/docs/api/java') + FileUtils.mkdir_p('build/docs/api/java') out = 'bazel-bin/java/src/org/openqa/selenium/grid/all-javadocs.jar' cmd = %(cd build/docs/api/java && jar xf "../../../../#{out}" 2>&1) cmd = cmd.tr('/', '\\').tr(':', ';') if SeleniumRake::Checks.windows? - - ok = system(cmd) - ok or raise 'could not unpack javadocs' + raise 'could not unpack javadocs' unless system(cmd) File.open('build/docs/api/java/stylesheet.css', 'a') do |file| file.write(<<~STYLE @@ -332,90 +327,39 @@ task ios_driver: [ '//javascript/webdriver/atoms/fragments:get_location_in_view:ios' ] -desc 'Create zipped assets for Java for uploading to GitHub' +# This task does not allow running RBE, to run stamped with RBE use +# ./go java:package['--config=release'] +desc 'Create stamped zipped assets for Java for uploading to GitHub' task :'java-release-zip' do - Bazel.execute('build', ['--stamp'], '//java/src/org/openqa/selenium:client-zip') - Bazel.execute('build', ['--stamp'], '//java/src/org/openqa/selenium/grid:server-zip') - Bazel.execute('build', ['--stamp'], '//java/src/org/openqa/selenium/grid:executable-grid') - mkdir_p 'build/dist' - Dir.glob('build/dist/*{java,server}*').each { |file| FileUtils.rm_f(file) } - - FileUtils.copy('bazel-bin/java/src/org/openqa/selenium/grid/server-zip.zip', - "build/dist/selenium-server-#{java_version}.zip") - FileUtils.chmod(0666, "build/dist/selenium-server-#{java_version}.zip") - FileUtils.copy('bazel-bin/java/src/org/openqa/selenium/client-zip.zip', - "build/dist/selenium-java-#{java_version}.zip") - FileUtils.chmod(0666, "build/dist/selenium-java-#{java_version}.zip") - FileUtils.copy('bazel-bin/java/src/org/openqa/selenium/grid/selenium', - "build/dist/selenium-server-#{java_version}.jar") - FileUtils.chmod(0777, "build/dist/selenium-server-#{java_version}.jar") + Rake::Task['java:package'].invoke('--config=remote_release') end task 'release-java': %i[java-release-zip publish-maven] def read_m2_user_pass - # First check env vars, then the settings.xml config inside .m2 - user = nil - pass = nil - if ENV['SEL_M2_USER'] && ENV['SEL_M2_PASS'] - puts 'Fetching m2 user and pass from environment variables.' - user = ENV['SEL_M2_USER'] - pass = ENV['SEL_M2_PASS'] - return [user, pass] - end + puts 'Maven environment variables not set, inspecting /.m2/settings.xml.' settings = File.read("#{Dir.home}/.m2/settings.xml") found_section = false settings.each_line do |line| if !found_section found_section = line.include? 'sonatype-nexus-staging' - elsif user.nil? && line.include?('') - user = line.split('')[1].split('') - pass = line.split('')[1].split('') + ENV['MAVEN_USER'] = line[%r{(.*?)}, 1] + elsif line.include?('') + ENV['MAVEN_PASSWORD'] = line[%r{(.*?)}, 1] end + break if ENV['MAVEN_PASSWORD'] && ENV['MAVEN_USER'] end - - [user, pass] end desc 'Publish all Java jars to Maven as stable release' -task 'publish-maven': JAVA_RELEASE_TARGETS do - creds = read_m2_user_pass - JAVA_RELEASE_TARGETS.each do |p| - Bazel.execute('run', - ['--stamp', - '--define', - 'maven_repo=https://oss.sonatype.org/service/local/staging/deploy/maven2', - '--define', - "maven_user=#{creds[0]}", - '--define', - "maven_password=#{creds[1]}", - '--define', - 'gpg_sign=true'], - p) - end +task 'publish-maven' do + Rake::Task['java:release'].invoke end desc 'Publish all Java jars to Maven as nightly release' -task 'publish-maven-snapshot': JAVA_RELEASE_TARGETS do - creds = read_m2_user_pass - if java_version.end_with?('-SNAPSHOT') - JAVA_RELEASE_TARGETS.each do |p| - Bazel.execute('run', - ['--stamp', - '--define', - 'maven_repo=https://oss.sonatype.org/content/repositories/snapshots', - '--define', - "maven_user=#{creds[0]}", - '--define', - "maven_password=#{creds[1]}", - '--define', - 'gpg_sign=false'], - p) - end - else - puts 'No SNAPSHOT version configured. Targets will not be pushed to the snapshot repo in SonaType.' - end +task 'publish-maven-snapshot' do + Rake::Task['java:release'].invoke('nightly') end desc 'Install jars to local m2 directory' @@ -490,46 +434,62 @@ namespace :node do end desc 'Build Node npm package' - task :build, [:args] do |_task, arguments| - args = Array(arguments[:args]) || [] + task :build do |_task, arguments| + args = arguments.to_a.compact Bazel.execute('build', args, '//javascript/node/selenium-webdriver') end task :'dry-run' do - Bazel.execute('run', ['--stamp'], '//javascript/node/selenium-webdriver:selenium-webdriver.pack') + Bazel.execute('run', ['--stamp'], + '//javascript/node/selenium-webdriver:selenium-webdriver.publish -- --dry-run=true') end desc 'Release Node npm package' - task :release do - Bazel.execute('run', ['--stamp'], '//javascript/node/selenium-webdriver:selenium-webdriver.publish') + task :release do |_task, arguments| + args = arguments.to_a.compact + nightly = args.delete('nightly') + Rake::Task['node:version'].invoke('nightly') if nightly + + Bazel.execute('run', ['--config=release'], '//javascript/node/selenium-webdriver:selenium-webdriver.publish') end desc 'Release Node npm package' task deploy: :release - desc 'Generate Node documentation — currently not working' + desc 'Generate Node documentation' task :docs, [:skip_update] do |_task, arguments| - puts "WARNING — Cannot currently update API Docs for JavaScript bindings" + FileUtils.rm_rf('build/docs/api/javascript/') + begin + sh 'npm run generate-docs --prefix javascript/node/selenium-webdriver || true', verbose: true + rescue StandardError + puts 'Ensure that npm is installed on your system' + raise + end + + update_gh_pages unless arguments[:skip_update] end desc 'Update JavaScript changelog' task :changelog do header = "## #{node_version}" - update_changelog(node_version, 'javascript', 'javascript/node/selenium-webdriver/', 'javascript/node/selenium-webdriver/CHANGES.md', header) + update_changelog(node_version, 'javascript', 'javascript/node/selenium-webdriver/', + 'javascript/node/selenium-webdriver/CHANGES.md', header) end desc 'Update Node version' task :version, [:version] do |_task, arguments| old_version = node_version - new_version = updated_version(old_version, arguments[:version]) + nightly = "-nightly#{Time.now.strftime('%Y%m%d%H%M')}" + new_version = updated_version(old_version, arguments[:version], nightly) ['javascript/node/selenium-webdriver/package.json', - 'package-lock.json'].each do |file| + 'package-lock.json', + 'javascript/node/selenium-webdriver/BUILD.bazel'].each do |file| text = File.read(file).gsub(old_version, new_version) - File.open(file, "w") { |f| f.puts text } + File.open(file, 'w') { |f| f.puts text } end - Rake::Task['node:changelog'].invoke + Rake::Task['node:changelog'].invoke unless new_version.include?(nightly) end end @@ -540,16 +500,20 @@ def python_version end namespace :py do desc 'Build Python wheel and sdist with optional arguments' - task :build, [:args] do |_task, arguments| - args = Array(arguments[:args]) || [] + task :build do |_task, arguments| + args = arguments.to_a.compact Bazel.execute('build', args, '//py:selenium-wheel') Bazel.execute('build', args, '//py:selenium-sdist') end desc 'Release Python wheel and sdist to pypi' - task :release, [:args] do |_task, arguments| - args = Array(arguments[:args]) || ['--stamp'] - Bazel.execute('run', args, '//py:selenium-release') + task :release do |_task, arguments| + args = arguments.to_a.compact + nightly = args.delete('nightly') + Rake::Task['py:version'].invoke('nightly') if nightly + + command = nightly ? '//py:selenium-release-nightly' : '//py:selenium-release' + Bazel.execute('run', ['--config=release'], command) end desc 'generate and copy files required for local development' @@ -571,13 +535,13 @@ namespace :py do dirs.each { |dir| FileUtils.rm_rf("#{lib_path}/common/#{dir}") } Find.find(bazel_bin_path) do |path| - if File.directory?(path) && dirs.any? {|dir| path.include?("common/#{dir}")} + if File.directory?(path) && dirs.any? { |dir| path.include?("common/#{dir}") } Find.prune next end next if File.directory?(path) - target_file = File.join(lib_path, path.sub(/^#{bazel_bin_path}\//, '')) + target_file = File.join(lib_path, path.sub(%r{^#{bazel_bin_path}/}, '')) if File.exist?(target_file) puts "Removing target file: #{target_file}" FileUtils.rm(target_file) @@ -596,10 +560,7 @@ namespace :py do raise end - unless arguments[:skip_update] - puts "Updating Python documentation" - puts update_gh_pages ? "Python Docs updated!" : "Python Doc update cancelled" - end + update_gh_pages unless arguments[:skip_update] end desc 'Install Python wheel locally' @@ -621,44 +582,26 @@ namespace :py do desc 'Update Python version' task :version, [:version] do |_task, arguments| - bump_nightly = arguments[:version] === 'nightly' old_version = python_version - new_version = nil - - # There are three cases we want to deal with: - # 1. Switching from a release build to a nightly one - # 2. Updating a nightly build for the next nightly build - # 3. Switching from nightlies to a release build. - - if bump_nightly && old_version.include?('.dev') - # This is the case where we are updating a nightly build to the next nightly build. - # This change is usually done by the CI system and never committed. - # The ".dev" is removed to have the pushed package in TestPyPi be shown as latest. - new_version = old_version.gsub(/\.dev\d+$/, '') + + ".#{Time.now.strftime("%Y%m%d%H%M")}" - elsif bump_nightly - # This is the case after a production release and the version number is configured - # to start doing nightly builds. - new_version = old_version + ".dev#{Time.now.strftime("%Y%m%d%H%M")}" - else - new_version = updated_version(old_version.gsub(/\.dev\d+$/, ''), arguments[:version]) - end + nightly = ".dev#{Time.now.strftime('%Y%m%d%H%M')}" + new_version = updated_version(old_version, arguments[:version], nightly) ['py/setup.py', 'py/BUILD.bazel', 'py/selenium/__init__.py', 'py/selenium/webdriver/__init__.py', 'py/docs/source/conf.py'].each do |file| - text = File.read(file).gsub(old_version, new_version) - File.open(file, "w") { |f| f.puts text } + text = File.read(file).gsub(old_version, new_version) + File.open(file, 'w') { |f| f.puts text } end old_short_version = old_version.split('.')[0..1].join('.') new_short_version = new_version.split('.')[0..1].join('.') text = File.read('py/docs/source/conf.py').gsub(old_short_version, new_short_version) - File.open('py/docs/source/conf.py', "w") { |f| f.puts text } + File.open('py/docs/source/conf.py', 'w') { |f| f.puts text } - Rake::Task['py:changelog'].invoke unless new_version.include?('nightly') || bump_nightly + Rake::Task['py:changelog'].invoke unless new_version.include?(nightly) end desc 'Update Python Syntax' @@ -677,15 +620,32 @@ namespace :py do desc "Python #{browser} tests" task browser do Rake::Task['py:clean'].invoke - Bazel.execute('test', [],"//py:common-#{browser}") - Bazel.execute('test', [],"//py:test-#{browser}") + Bazel.execute('test', [], "//py:common-#{browser}") + Bazel.execute('test', [], "//py:test-#{browser}") end end - desc "Python Remote tests with Firefox" + desc 'Python Remote tests with Firefox' task :remote do Rake::Task['py:clean'].invoke - Bazel.execute('test', [],"//py:test-remote") + Bazel.execute('test', [], '//py:test-remote') + end + end + + namespace :test do + desc 'Python unit tests' + task :unit do + Rake::Task['py:clean'].invoke + Bazel.execute('test', ['--test_size_filters=small'], '//py/...') + end + + %i[chrome edge firefox safari].each do |browser| + desc "Python #{browser} tests" + task browser do + Rake::Task['py:clean'].invoke + Bazel.execute('test', %w[--test_output all], "//py:common-#{browser}") + Bazel.execute('test', %w[--test_output all], "//py:test-#{browser}") + end end end end @@ -697,12 +657,13 @@ def ruby_version end namespace :rb do desc 'Generate Ruby gems' - task :build, [:args] do |_task, arguments| - args = Array(arguments[:args]) || [] - webdriver = args.reject! { |item| item == 'webdriver' } - devtools = args.reject! { |item| item == 'devtools' } - Bazel.execute('build', args, '//rb:selenium-webdriver') if webdriver - Bazel.execute('build', args, '//rb:selenium-devtools') if devtools + task :build do |_task, arguments| + args = arguments.to_a.compact + webdriver = args.delete('webdriver') + devtools = args.delete('devtools') + + Bazel.execute('build', args, '//rb:selenium-webdriver') if webdriver || !devtools + Bazel.execute('build', args, '//rb:selenium-devtools') if devtools || !webdriver end desc 'Update generated Ruby files for local development' @@ -713,10 +674,17 @@ namespace :rb do end desc 'Push Ruby gems to rubygems' - task :release, [:args] do |_task, arguments| - args = Array(arguments[:args]) || ['--stamp'] - Bazel.execute('run', args, '//rb:selenium-webdriver-release') - Bazel.execute('run', args, '//rb:selenium-devtools-release') + task :release do |_task, arguments| + args = arguments.to_a.compact + nightly = args.delete('nightly') + + if nightly + Bazel.execute('run', [], '//rb:selenium-webdriver-bump-nightly-version') + Bazel.execute('run', ['--config=release'], '//rb:selenium-webdriver-release-nightly') + else + Bazel.execute('run', ['--config=release'], '//rb:selenium-webdriver-release') + Bazel.execute('run', ['--config=release'], '//rb:selenium-devtools-release') + end end desc 'Generate Ruby documentation' @@ -724,37 +692,34 @@ namespace :rb do FileUtils.rm_rf('build/docs/api/rb/') Bazel.execute('run', [], '//rb:docs') FileUtils.mkdir_p('build/docs/api') - FileUtils.cp_r('bazel-bin/rb/docs.rb.sh.runfiles/selenium/docs/api/rb/.', 'build/docs/api/rb') + FileUtils.cp_r('bazel-bin/rb/docs.sh.runfiles/_main/docs/api/rb/.', 'build/docs/api/rb') - unless arguments[:skip_update] - puts "Updating Ruby documentation" - puts update_gh_pages ? "Ruby Docs updated!" : "Ruby Doc update cancelled" - end + update_gh_pages unless arguments[:skip_update] end desc 'Update Ruby changelog' task :changelog do - header = "#{ruby_version} (#{Time.now.strftime("%Y-%m-%d")})\n=========================" + header = "#{ruby_version} (#{Time.now.strftime('%Y-%m-%d')})\n=========================" update_changelog(ruby_version, 'rb', 'rb/lib/', 'rb/CHANGES', header) end desc 'Update Ruby version' task :version, [:version] do |_task, arguments| old_version = ruby_version - new_version = updated_version(old_version, arguments[:version]) - new_version += '.nightly' unless old_version.include?('nightly') + new_version = updated_version(old_version, arguments[:version], '.nightly') file = 'rb/lib/selenium/webdriver/version.rb' text = File.read(file).gsub(old_version, new_version) - File.open(file, "w") { |f| f.puts text } + File.open(file, 'w') { |f| f.puts text } - Rake::Task['rb:changelog'].invoke unless new_version.include?('nightly') - sh 'cd rb && bundle update' + Rake::Task['rb:changelog'].invoke unless new_version.include?('.nightly') + sh 'cd rb && bundle --version && bundle update' end desc 'Update Ruby Syntax' - task :lint do - `cd rb && bundle exec rubocop -a` + task :lint do |_task, arguments| + args = arguments.to_a.compact + Bazel.execute('run', args, '//rb:lint') end end @@ -765,33 +730,47 @@ def dotnet_version end namespace :dotnet do desc 'Build nupkg files' - task :build, [:args] do |_task, arguments| - args = Array(arguments[:args]) || [] + task :build do |_task, arguments| + args = arguments.to_a.compact Bazel.execute('build', args, '//dotnet:all') end - desc 'Create zipped assets for .NET for uploading to GitHub' - task :zip_assets, [:args] do |_task, arguments| - args = Array(arguments[:args]) || ['--stamp'] - Rake::Task['dotnet:build'].invoke(args) + desc 'Package .NET bindings into zipped assets and stage for release' + task :package do |_task, arguments| + args = arguments.to_a.compact.empty? ? ['--stamp'] : arguments.to_a.compact + Rake::Task['dotnet:build'].invoke(*args) mkdir_p 'build/dist' - FileUtils.rm_f('build/dist/*dotnet*') + FileUtils.rm_f(Dir.glob('build/dist/*dotnet*')) FileUtils.copy('bazel-bin/dotnet/release.zip', "build/dist/selenium-dotnet-#{dotnet_version}.zip") - FileUtils.chmod(0666, "build/dist/selenium-dotnet-#{dotnet_version}.zip") + FileUtils.chmod(0o666, "build/dist/selenium-dotnet-#{dotnet_version}.zip") FileUtils.copy('bazel-bin/dotnet/strongnamed.zip', "build/dist/selenium-dotnet-strongnamed-#{dotnet_version}.zip") - FileUtils.chmod(0666, "build/dist/selenium-dotnet-strongnamed-#{dotnet_version}.zip") + FileUtils.chmod(0o666, "build/dist/selenium-dotnet-strongnamed-#{dotnet_version}.zip") end desc 'Upload nupkg files to Nuget' - task :release, [:args] do |_task, arguments| - args = Array(arguments[:args]) || ['--stamp'] - Rake::Task['dotnet:build'].invoke(args) - Rake::Task['dotnet:zip_assets'].invoke(args) + task :release do |_task, arguments| + args = arguments.to_a.compact + nightly = args.delete('nightly') + Rake::Task['dotnet:version'].invoke('nightly') if nightly + Rake::Task['dotnet:package'].invoke('--config=remote_release') + + api_key = ENV.fetch('NUGET_API_KEY', nil) + push_destination = 'https://api.nuget.org/v3/index.json' + if nightly + # Nightly builds are pushed to GitHub NuGet repository + # This commands will run in GitHub Actions + api_key = ENV.fetch('GITHUB_TOKEN', nil) + github_push_url = 'https://nuget.pkg.github.com/seleniumhq/index.json' + push_destination = 'github' + flags = ['--username', 'seleniumhq', '--password', api_key, '--store-password-in-clear-text', '--name', + push_destination, github_push_url] + sh "dotnet nuget add source #{flags.join(' ')}" + end ["./bazel-bin/dotnet/src/webdriver/Selenium.WebDriver.#{dotnet_version}.nupkg", "./bazel-bin/dotnet/src/support/Selenium.Support.#{dotnet_version}.nupkg"].each do |asset| - sh "dotnet nuget push #{asset} --api-key #{ENV.fetch('NUGET_API_KEY', nil)} --source https://api.nuget.org/v3/index.json" + sh "dotnet nuget push #{asset} --api-key #{api_key} --source #{push_destination}" end end @@ -799,7 +778,11 @@ namespace :dotnet do task :docs, [:skip_update] do |_task, arguments| FileUtils.rm_rf('build/docs/api/dotnet/') begin - sh 'dotnet tool update -g docfx' + # Pinning to 2.75.3 to avoid breaking changes in newer versions + # See https://github.com/dotnet/docfx/issues/9855 + sh 'dotnet tool uninstall --global docfx || true' + sh 'dotnet tool install --global --version 2.75.3 docfx' + # sh 'dotnet tool update -g docfx' rescue StandardError puts 'Please ensure that .NET SDK is installed.' raise @@ -818,10 +801,7 @@ namespace :dotnet do end end - unless arguments[:skip_update] - puts "Updating .NET documentation" - puts update_gh_pages ? ".NET Docs updated!" : ".NET Doc update cancelled" - end + update_gh_pages unless arguments[:skip_update] end desc 'Update .NET changelog' @@ -833,41 +813,69 @@ namespace :dotnet do desc 'Update .NET version' task :version, [:version] do |_task, arguments| old_version = dotnet_version - new_version = updated_version(old_version, arguments[:version]) + nightly = "-nightly#{Time.now.strftime('%Y%m%d%H%M')}" + new_version = updated_version(old_version, arguments[:version], nightly) file = 'dotnet/selenium-dotnet-version.bzl' text = File.read(file).gsub(old_version, new_version) - File.open(file, "w") { |f| f.puts text } + File.open(file, 'w') { |f| f.puts text } - Rake::Task['dotnet:changelog'].invoke + Rake::Task['dotnet:changelog'].invoke unless new_version.include?(nightly) end end namespace :java do desc 'Build Java Client Jars' - task :build, [:args] do |_task, arguments| - args = Array(arguments[:args]) || [] - Bazel.execute('build', args, '//java/src/org/openqa/selenium:client-combined') + task :build do |_task, arguments| + args = arguments.to_a.compact + JAVA_RELEASE_TARGETS.each { |target| Bazel.execute('build', args, target) } end - desc 'Build Grid Jar' - task :grid, [:args] do |_task, arguments| - args = Array(arguments[:args]) || [] - Bazel.execute('build', args, '//java/src/org/openqa/selenium/grid:grid') + desc 'Build Grid Server' + task :grid do |_task, arguments| + args = arguments.to_a.compact + Bazel.execute('build', args, '//java/src/org/openqa/selenium/grid:executable-grid') end - desc 'Package Java bindings and grid into releasable packages' - task :package, [:args] do |_task, arguments| - args = Array(arguments[:args]) || [] - Rake::Task['java:build'].invoke(args) - Rake::Task['java-release-zip'].invoke + desc 'Package Java bindings and grid into releasable packages and stage for release' + task :package do |_task, arguments| + args = arguments.to_a.compact.empty? ? ['--config=release'] : arguments.to_a.compact + Bazel.execute('build', args, '//java/src/org/openqa/selenium:client-zip') + Bazel.execute('build', args, '//java/src/org/openqa/selenium/grid:server-zip') + Bazel.execute('build', args, '//java/src/org/openqa/selenium/grid:executable-grid') + + mkdir_p 'build/dist' + Dir.glob('build/dist/*{java,server}*').each { |file| FileUtils.rm_f(file) } + + FileUtils.copy('bazel-bin/java/src/org/openqa/selenium/grid/server-zip.zip', + "build/dist/selenium-server-#{java_version}.zip") + FileUtils.chmod(0o666, "build/dist/selenium-server-#{java_version}.zip") + FileUtils.copy('bazel-bin/java/src/org/openqa/selenium/client-zip.zip', + "build/dist/selenium-java-#{java_version}.zip") + FileUtils.chmod(0o666, "build/dist/selenium-java-#{java_version}.zip") + FileUtils.copy('bazel-bin/java/src/org/openqa/selenium/grid/selenium', + "build/dist/selenium-server-#{java_version}.jar") + FileUtils.chmod(0o777, "build/dist/selenium-server-#{java_version}.jar") end desc 'Deploy all jars to Maven' - task :release, [:args] do |_task, arguments| - args = Array(arguments[:args]) || ['--stamp'] - Rake::Task['java:package'].invoke(args) - Rake::Task['publish-maven'].invoke + task :release do |_task, arguments| + args = arguments.to_a.compact + nightly = args.delete('nightly') + + ENV['MAVEN_USER'] ||= ENV.fetch('SEL_M2_USER', nil) + ENV['MAVEN_PASSWORD'] ||= ENV.fetch('SEL_M2_PASS', nil) + read_m2_user_pass unless ENV['MAVEN_PASSWORD'] && ENV['MAVEN_USER'] + + repo = nightly ? 'content/repositories/snapshots' : 'service/local/staging/deploy/maven2' + ENV['MAVEN_REPO'] = "https://oss.sonatype.org/#{repo}" + ENV['GPG_SIGN'] = (!nightly).to_s + + Rake::Task['java:version'].invoke if nightly + Rake::Task['java:package'].invoke('--config=release') + Rake::Task['java:build'].invoke('--config=release') + # Because we want to `run` things, we can't use the `release` config + JAVA_RELEASE_TARGETS.each { |target| Bazel.execute('run', ['--config=release'], target) } end desc 'Install jars to local m2 directory' @@ -877,10 +885,7 @@ namespace :java do task :docs, [:skip_update] do |_task, arguments| Rake::Task['javadocs'].invoke - unless arguments[:skip_update] - puts "Updating Java documentation" - puts update_gh_pages ? "Java Docs updated!" : "Java Doc update cancelled" - end + update_gh_pages unless arguments[:skip_update] end desc 'Update Maven dependencies' @@ -889,7 +894,7 @@ namespace :java do args = ['--action_env=RULES_JVM_EXTERNAL_REPIN=1'] Bazel.execute('run', args, '@unpinned_maven//:pin') - file_path = 'java/maven_deps.bzl' + file_path = 'MODULE.bazel' content = File.read(file_path) # For some reason ./go wrapper is not outputting from Open3, so cannot use Bazel class directly output = `bazel run @maven//:outdated` @@ -901,7 +906,7 @@ namespace :java do versions = output.scan(/(\S+) \[\S+ -> (\S+)\]/).to_h versions.each do |artifact, version| if artifact.match?('graphql') - puts "WARNING — Cannot automatically update graphql" + puts 'WARNING — Cannot automatically update graphql' next end @@ -923,13 +928,12 @@ namespace :java do desc 'Update Java version' task :version, [:version] do |_task, arguments| old_version = java_version - new_version = updated_version(old_version, arguments[:version]) - new_version += '-SNAPSHOT' unless old_version.include?('SNAPSHOT') + new_version = updated_version(old_version, arguments[:version], '-SNAPSHOT') file = 'java/version.bzl' text = File.read(file).gsub(old_version, new_version) - File.open(file, "w") { |f| f.puts text } - Rake::Task['java:changelog'].invoke if old_version.include?('SNAPSHOT') + File.open(file, 'w') { |f| f.puts text } + Rake::Task['java:changelog'].invoke unless new_version.include?('-SNAPSHOT') end end @@ -940,8 +944,8 @@ def rust_version end namespace :rust do desc 'Build Selenium Manager' - task :build, [:args] do |_task, arguments| - args = Array(arguments[:args]) || [] + task :build do |_task, arguments| + args = arguments.to_a.compact Bazel.execute('build', args, '//rust:selenium-manager') end @@ -967,16 +971,15 @@ namespace :rust do else old_version.split('.').tap(&:shift).append('0').join('.') end - converted_version = updated_version(equivalent_version, arguments[:version]) - new_version = converted_version.split('.').unshift("0").tap(&:pop).join('.') - new_version += '-nightly' unless old_version.include?('nightly') + updated = updated_version(equivalent_version, arguments[:version], '-nightly') + new_version = updated.split(/\.|-/).tap { |v| v.delete_at(2) }.unshift('0').join('.').gsub('.nightly', '-nightly') ['rust/Cargo.toml', 'rust/BUILD.bazel'].each do |file| text = File.read(file).gsub(old_version, new_version) - File.open(file, "w") { |f| f.puts text } + File.open(file, 'w') { |f| f.puts text } end - Rake::Task['rust:changelog'].invoke unless new_version.include?('nightly') + Rake::Task['rust:changelog'].invoke unless new_version.include?('-nightly') Rake::Task['rust:update'].invoke end @@ -987,7 +990,7 @@ namespace :rust do task :commit do @git.reset commit!("update Rust version to #{rust_version}", - ['rust/BUILD.bazel', 'rust/Cargo.Bazel.lock', 'rust/Cargo.lock', 'rust/Cargo.toml']) + ['rust/BUILD.bazel', 'rust/Cargo.Bazel.lock', 'rust/Cargo.lock', 'rust/Cargo.toml']) commit!('Rust Changelog', ['rust/CHANGELOG.md']) end end @@ -996,88 +999,93 @@ end namespace :all do desc 'Update all API Documentation' task :docs do - FileUtils.rm_rf('build/docs/api') if Dir.exist?('build/docs/api') - Rake::Task['java:docs'].invoke(true) Rake::Task['py:docs'].invoke(true) Rake::Task['rb:docs'].invoke(true) Rake::Task['dotnet:docs'].invoke(true) Rake::Task['node:docs'].invoke(true) - puts "Updating All API Docs" - puts update_gh_pages ? "AP Docs updated!" : "API Doc update cancelled" + update_gh_pages end desc 'Build all artifacts for all language bindings' - task :build, [:args] do |_task, arguments| - args = Array(arguments[:args]) || [] - Rake::Task['java:build'].invoke(args) - Rake::Task['py:build'].invoke(args) - Rake::Task['rb:build'].invoke(args) - Rake::Task['dotnet:build'].invoke(args) - Rake::Task['node:build'].invoke(args) + task :build do |_task, arguments| + args = arguments.to_a.compact + Rake::Task['java:build'].invoke(*args) + Rake::Task['py:build'].invoke(*args) + Rake::Task['rb:build'].invoke(*args) + Rake::Task['dotnet:build'].invoke(*args) + Rake::Task['node:build'].invoke(*args) + end + + desc 'Package or build stamped artifacts for distribution in GitHub Release assets' + task :package do |_task, arguments| + args = arguments.to_a.compact + Rake::Task['java:package'].invoke(*args) + Rake::Task['dotnet:package'].invoke(*args) end desc 'Release all artifacts for all language bindings' - task :release, [:args] do |_task, arguments| + task :release do |_task, arguments| Rake::Task['clean'].invoke - tag = @git.add_tag("selenium-#{java_version}") - @git.push('origin', tag.name) - - args = Array(arguments[:args]) || ['--stamp'] - Rake::Task['java:release'].invoke(args) - Rake::Task['py:release'].invoke(args) - Rake::Task['rb:release'].invoke(args) - Rake::Task['dotnet:release'].invoke(args) - Rake::Task['node:release'].invoke(args) - Rake::Task['create_release_notes'].invoke(args) - Rake::Task['all:docs'].invoke + + args = arguments.to_a.compact.empty? ? ['--stamp'] : arguments.to_a.compact + Rake::Task['java:release'].invoke(*args) + Rake::Task['py:release'].invoke(*args) + Rake::Task['rb:release'].invoke(*args) + Rake::Task['dotnet:release'].invoke(*args) + Rake::Task['node:release'].invoke(*args) + + # TODO: Update this so it happens in each language, but does not commit Rake::Task['all:version'].invoke('nightly') - puts "Committing nightly version updates" - commit!('update versions to nightly', ['java/version.bzl', - 'rb/lib/selenium/webdriver/version.rb', - 'rb/Gemfile.lock', - 'py/setup.py', - 'py/BUILD.bazel', - 'py/selenium/__init__.py', - 'py/selenium/webdriver/__init__.py', - 'py/docs/source/conf.py', - 'rust/BUILD.bazel', - 'rust/Cargo.Bazel.lock', - 'rust/Cargo.lock', - 'rust/Cargo.toml']) + puts 'Committing nightly version updates' + commit!('update versions to nightly', ['dotnet/selenium-dotnet-version.bzl', + 'java/version.bzl', + 'javascript/node/selenium-webdriver/BUILD.bazel', + 'javascript/node/selenium-webdriver/package.json', + 'py/docs/source/conf.py', + 'py/selenium/webdriver/__init__.py', + 'py/selenium/__init__.py', + 'py/BUILD.bazel', + 'py/setup.py', + 'rb/lib/selenium/webdriver/version.rb', + 'rb/Gemfile.lock', + 'package-lock.json']) print 'Do you want to push the committed changes? (Y/n): ' - response = STDIN.gets.chomp.downcase - @git.push if response == 'y' || response == 'yes' + response = $stdin.gets.chomp.downcase + @git.push if %w[y yes].include?(response) + end + + task :lint do + ext = /mswin|msys|mingw|cygwin|bccwin|wince|emc/.match?(RbConfig::CONFIG['host_os']) ? 'ps1' : 'sh' + sh "./scripts/format.#{ext}", verbose: true + Rake::Task['py:lint'].invoke end desc 'Update everything in preparation for a release' - task :prepare, [:channel] do |_task, arguments| - chrome_channel = if arguments[:channel].nil? - 'Stable' - else - arguments[:channel] - end + task :prepare, [:version, :channel] do |_task, arguments| + chrome_channel = arguments[:channel] || 'Stable' + version = arguments[:version] args = Array(chrome_channel) ? ['--', "--chrome_channel=#{chrome_channel.capitalize}"] : [] Bazel.execute('run', args, '//scripts:pinned_browsers') commit!('Update pinned browser versions', ['common/repositories.bzl']) Bazel.execute('run', args, '//scripts:update_cdp') commit!('Update supported versions for Chrome DevTools', - ['common/devtools/', - 'dotnet/src/webdriver/DevTools/', - 'dotnet/src/webdriver/WebDriver.csproj', - 'dotnet/test/common/DevTools/', - 'dotnet/test/common/CustomDriverConfigs/', - 'dotnet/selenium-dotnet-version.bzl', - 'java/src/org/openqa/selenium/devtools/', - 'javascript/node/selenium-webdriver/BUILD.bazel', - 'py/BUILD.bazel', - 'rb/lib/selenium/devtools/', - 'rb/Gemfile.lock', - 'Rakefile']) + ['common/devtools/', + 'dotnet/src/webdriver/DevTools/', + 'dotnet/src/webdriver/WebDriver.csproj', + 'dotnet/test/common/DevTools/', + 'dotnet/test/common/CustomDriverConfigs/', + 'dotnet/selenium-dotnet-version.bzl', + 'java/src/org/openqa/selenium/devtools/', + 'javascript/node/selenium-webdriver/BUILD.bazel', + 'py/BUILD.bazel', + 'rb/lib/selenium/devtools/', + 'rb/Gemfile.lock', + 'Rakefile']) Bazel.execute('run', args, '//scripts:selenium_manager') commit!('Update selenium manager version', ['common/selenium_manager.bzl']) @@ -1089,7 +1097,8 @@ namespace :all do commit!('Update authors file', ['AUTHORS']) # Note that this does not include Rust version changes that are handled in separate rake:version task - Rake::Task['all:version'].invoke + # TODO: These files are all defined in other tasks; remove duplication + Rake::Task['all:version'].invoke(version) commit!("FIX CHANGELOGS BEFORE MERGING!\n\nUpdate versions and change logs to release Selenium #{java_version}", ['dotnet/CHANGELOG', 'dotnet/selenium-dotnet-version.bzl', @@ -1112,19 +1121,13 @@ namespace :all do desc 'Update all versions' task :version, [:version] do |_task, arguments| - version = arguments[:version] - if version == 'nightly' - Rake::Task['java:version'].invoke - Rake::Task['rb:version'].invoke - Rake::Task['rust:version'].invoke - Rake::Task['py:version'].invoke - else - Rake::Task['java:version'].invoke(version) - Rake::Task['rb:version'].invoke(version) - Rake::Task['node:version'].invoke(version) - Rake::Task['py:version'].invoke(version) - Rake::Task['dotnet:version'].invoke(version) - end + version = arguments[:version] || 'nightly' + + Rake::Task['java:version'].invoke(version) + Rake::Task['rb:version'].invoke(version) + Rake::Task['node:version'].invoke(version) + Rake::Task['py:version'].invoke(version) + Rake::Task['dotnet:version'].invoke(version) end end @@ -1132,158 +1135,65 @@ at_exit do system 'sh', '.git-fixfiles' if File.exist?('.git') && !SeleniumRake::Checks.windows? end -desc 'Create Release Notes for Minor Release' -task :create_release_notes do - range = "#{previous_tag(java_version)}...HEAD" - format = "* [\\`%h\\`](http://github.com/seleniumhq/selenium/commit/%H) - %s :: %aN" - git_log_command = %Q(git --no-pager log "#{range}" --pretty=format:"#{format}" --reverse) - git_log_output = `#{git_log_command}` - - release_notes = <<~RELEASE_NOTES - ### Changelog - - For each component's detailed changelog, please check: - * [Ruby](https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES) - * [Python](https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES) - * [JavaScript](https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/node/selenium-webdriver/CHANGES.md) - * [Java](https://github.com/SeleniumHQ/selenium/blob/trunk/java/CHANGELOG) - * [DotNet](https://github.com/SeleniumHQ/selenium/blob/trunk/dotnet/CHANGELOG) - * [IEDriverServer](https://github.com/SeleniumHQ/selenium/blob/trunk/cpp/iedriverserver/CHANGELOG) - - ### Commits in this release -
- Click to see all the commits included in this release - - #{git_log_output} - -
- RELEASE_NOTES - - FileUtils.mkdir_p('build/dist') - release_notes_file = "build/dist/release_notes_#{java_version}.md" - File.write(release_notes_file, release_notes) - puts "Release notes have been generated at: #{release_notes_file}" -end - -def updated_version(current, desired = nil) - puts "Calculating " - version = desired ? desired.split('.') : current.split(/\.|-/) - if desired - # Allows user to pass in only major/minor versions - version << "0" while version.size < 3 - elsif version.size > 3 - # Assumes a pre-release version which means removing the pre-release portion - version.pop while version.size > 3 - else - version[1] = (version[1].to_i + 1).to_s - version[2] = '0' +def updated_version(current, desired = nil, nightly = nil) + if !desired.nil? && desired != 'nightly' + # If desired is present, return full 3 digit version + desired.split('.').tap { |v| v << 0 while v.size < 3 }.join('.') + elsif current.split(/\.|-/).size > 3 + # if current version is already nightly, just need to bump it; this will be noop for some languages + pattern = /-?\.?(nightly|SNAPSHOT|dev)\d*$/ + current.gsub(pattern, nightly) + elsif current.split(/\.|-/).size == 3 + # if current version is not nightly, need to bump the version and make nightly + "#{current.split(/\.|-/).tap { |i| (i[1] = i[1].to_i + 1) && (i[2] = 0) }.join('.')}#{nightly}" end - version.join('.') end def update_gh_pages - origin_reference = @git.current_branch - origin_reference ||= begin - # This allows updating docs from a tagged commit instead of a branch - puts "commit is not at HEAD, checking for matching tag" - tag = @git.tags.detect {|tag| tag.sha == @git.revparse("HEAD") } - tag ? tag.name : raise(StandardError, "Must be on a tagged commit or at the HEAD of a branch to update API Docs") - end - - puts "Checking out gh-pages" - begin - @git.checkout('gh-pages') - rescue Git::FailedError => ex - # This happens when the working directory is not clean and things need to be stashed or committed - line = ex.message.lines[2].gsub("output: \"error: ", '') - puts line.gsub('\t', "\t").split('\n')[0...-2].join("\n") - # TODO: we could offer to automatically fix with a stash, but there may be edge cases - print "Manually Fix and Retry? (Y/n):" - response = STDIN.gets.chomp.downcase - return false unless response == 'y' || response == 'yes' - - retry - end - - puts "Updating gh-pages branch from upstream repository" - begin - @git.pull - rescue Git::FailedError => ex - # This happens when upstream is not already set - line = ex.message.lines[2].gsub("output: \"error: ", '') - puts line.gsub('\t', "\t").split('\n').delete_if(&:empty?)[-2...-1].join("\n") - print "Manually Fix and Retry? (Y/n):" - response = STDIN.gets.chomp.downcase - return restore_git(origin_reference) unless response == 'y' || response == 'yes' - - retry - end - - %w[java rb py dotnet].each do |language| - if Dir.exist?("build/docs/api/#{language}") && !Dir.empty?("build/docs/api/#{language}") - puts "Deleting #{language} directory in docs/api since corresponding directory in build/docs/api is not empty" - FileUtils.rm_rf("docs/api/#{language}") - puts "Moving documentation files from untracked build directory to tracked docs directory" - FileUtils.mv("build/docs/api/#{language}", "docs/api/#{language}") - end - end - - print 'Do you want to commit the changes? (Y/n): ' - response = STDIN.gets.chomp.downcase - return restore_git(origin_reference) unless response == 'y' || response == 'yes' + @git.fetch('origin', {ref: 'gh-pages'}) + @git.checkout('gh-pages', force: true) - puts "Committing changes" - commit!('updating all API docs', ['docs/api/']) + %w[java rb py dotnet javascript].each do |language| + next unless Dir.exist?("build/docs/api/#{language}") && !Dir.empty?("build/docs/api/#{language}") - puts "Pushing changes to upstream repository" - @git.push + FileUtils.rm_rf("docs/api/#{language}") + FileUtils.mv("build/docs/api/#{language}", "docs/api/#{language}") - puts "Checking out originating branch/tag — #{origin_reference}" - @git.checkout(origin_reference) - true + commit!("updating #{language} API docs", ["docs/api/#{language}/"]) + end end def restore_git(origin_reference) - puts "Stashing docs changes for gh-pages" - Git::Stash.new(@git, "docs changes for gh-pages") + puts 'Stashing docs changes for gh-pages' + Git::Stash.new(@git, 'docs changes for gh-pages') puts "Checking out originating branch/tag — #{origin_reference}" @git.checkout(origin_reference) false end -def previous_version(version) - current = version.split(/\.|-/) - if current.size > 3 - current.pop while current.size > 3 - else - current[1] = (current[1].to_i - 1).to_s - current[2] = '0' - end -end - -def previous_tag(current_version, language=nil) +def previous_tag(current_version, language = nil) version = current_version.split(/\.|-/) if version.size > 3 - puts "WARNING - Changelogs not updated when set to prerelease" + puts 'WARNING - Changelogs not updated when set to prerelease' elsif version[2].to_i > 1 # specified as patch release patch_version = (version[2].to_i - 1).to_s "selenium-#{[[version[0]], version[1], patch_version].join('.')}-#{language}" - elsif version[2] == "1" + elsif version[2] == '1' # specified as patch release; special case - "selenium-#{[[version[0]], version[1], "0"].join('.')}" + "selenium-#{[[version[0]], version[1], '0'].join('.')}" else minor_version = (version[1].to_i - 1) tags = @git.tags.map(&:name) - tag = language ? tags.select { |tag| tag.match?(/selenium-4\.#{minor_version}.*-#{language}/) }.last : nil - tag || "selenium-#{[[version[0]], minor_version, "0"].join('.')}" + tag = language ? tags.reverse.find { |t| t.match?(/selenium-4\.#{minor_version}.*-#{language}/) } : nil + tag || "selenium-#{[[version[0]], minor_version, '0'].join('.')}" end end def update_changelog(version, language, path, changelog, header) tag = previous_tag(version, language) - log = `git --no-pager log #{tag}...HEAD --pretty=format:">>> %B" --reverse #{path}` - commits = log.split(">>>").map { |entry| + log = `git --no-pager log #{tag}...HEAD --pretty=format:"--> %B" --reverse #{path}` + commits = log.split('>>>').map { |entry| lines = entry.split("\n") lines.reject! { |line| line.match?(/^(----|Co-authored|Signed-off)/) || line.empty? } lines.join("\n") @@ -1303,6 +1213,6 @@ def commit!(message, files = [], all: false) @git.add(file) end all ? @git.commit_all(message) : @git.commit(message) -rescue Git::FailedError => ex - puts ex.message +rescue Git::FailedError => e + puts e.message end diff --git a/WORKSPACE b/WORKSPACE index b85b8278bebbd..eb09ccc8726e0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,238 +1,41 @@ -workspace( - name = "selenium", -) +workspace(name = "selenium") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -http_archive( - name = "rules_java", - sha256 = "16bc94b1a3c64f2c36ceecddc9e09a643e80937076b97e934b96a8f715ed1eaa", - urls = [ - "https://github.com/bazelbuild/rules_java/releases/download/6.5.2/rules_java-6.5.2.tar.gz", - ], -) - -load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains") - -rules_java_dependencies() - -rules_java_toolchains() - -http_archive( - name = "apple_rules_lint", - sha256 = "7c3cc45a95e3ef6fbc484a4234789a027e11519f454df63cbb963ac499f103f9", - strip_prefix = "apple_rules_lint-0.3.2", - url = "https://github.com/apple/apple_rules_lint/archive/refs/tags/0.3.2.tar.gz", -) - -load("@apple_rules_lint//lint:repositories.bzl", "lint_deps") - -lint_deps() - -load("@apple_rules_lint//lint:setup.bzl", "lint_setup") - -# Add your linters here. -lint_setup({ - "java-spotbugs": "//java:spotbugs-config", - "rust-rustfmt": "//rust:enable-rustfmt", -}) - -http_archive( - name = "bazel_skylib", - sha256 = "66ffd9315665bfaafc96b52278f57c7e2dd09f5ede279ea6d39b2be471e7e3aa", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz", - ], -) - -load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") - -bazel_skylib_workspace() - -http_archive( - name = "aspect_bazel_lib", - sha256 = "f75d03783588e054899eb0729a97fb5b8973c1a26f30373fafd485c90bf207d1", - strip_prefix = "bazel-lib-2.4.2", - url = "https://github.com/aspect-build/bazel-lib/releases/download/v2.4.2/bazel-lib-v2.4.2.tar.gz", -) - -load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies", "aspect_bazel_lib_register_toolchains") - -aspect_bazel_lib_dependencies() - -aspect_bazel_lib_register_toolchains() - -http_archive( - name = "rules_python", - sha256 = "c68bdc4fbec25de5b5493b8819cfc877c4ea299c0dcb15c244c5a00208cde311", - strip_prefix = "rules_python-0.31.0", - url = "https://github.com/bazelbuild/rules_python/releases/download/0.31.0/rules_python-0.31.0.tar.gz", -) - -load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_multi_toolchains") - -py_repositories() - -default_python_version = "3.8" - -python_register_multi_toolchains( - name = "python", - default_version = default_python_version, - ignore_root_user_error = True, - python_versions = [ - "3.8", - "3.9", - "3.10", - "3.11", - ], -) - -load("@python//:pip.bzl", "multi_pip_parse") -load("@python//3.10:defs.bzl", interpreter_3_10 = "interpreter") -load("@python//3.11:defs.bzl", interpreter_3_11 = "interpreter") -load("@python//3.8:defs.bzl", interpreter_3_8 = "interpreter") -load("@python//3.9:defs.bzl", interpreter_3_9 = "interpreter") - -multi_pip_parse( - name = "py_dev_requirements", - default_version = default_python_version, - python_interpreter_target = { - "3.11": interpreter_3_11, - "3.10": interpreter_3_10, - "3.9": interpreter_3_9, - "3.8": interpreter_3_8, - }, - requirements_lock = { - "3.11": "//py:requirements_lock.txt", - "3.10": "//py:requirements_lock.txt", - "3.9": "//py:requirements_lock.txt", - "3.8": "//py:requirements_lock.txt", - }, -) - -load("@py_dev_requirements//:requirements.bzl", "install_deps") - -install_deps() - -# This gets us a pre-compiled `protoc` -http_archive( - name = "rules_proto", - sha256 = "dc3fb206a2cb3441b485eb1e423165b231235a1ea9b031b4433cf7bc1fa460dd", - strip_prefix = "rules_proto-5.3.0-21.7", - urls = [ - "https://github.com/bazelbuild/rules_proto/archive/refs/tags/5.3.0-21.7.tar.gz", - ], -) - -load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") - -rules_proto_dependencies() - -rules_proto_toolchains() - -# The go rules are often a dependency of _something_, so loading the version -# we want early -http_archive( - name = "io_bazel_rules_go", - sha256 = "6b65cb7917b4d1709f9410ffe00ecf3e160edf674b78c54a894471320862184f", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.39.0/rules_go-v0.39.0.zip", - "https://github.com/bazelbuild/rules_go/releases/download/v0.39.0/rules_go-v0.39.0.zip", - ], -) - -load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") - -go_rules_dependencies() - -go_register_toolchains(version = "1.19.3") +# rules_closure are not published to BCR. http_archive( - name = "rules_jvm_external", + name = "io_bazel_rules_closure", patch_args = [ "-p1", ], patches = [ - "//java:rules_jvm_external_javadoc.patch", + "//javascript:rules_closure_shell.patch", + ], + sha256 = "d66deed38a0bb20581c15664f0ab62270af5940786855c7adc3087b27168b529", + strip_prefix = "rules_closure-0.11.0", + urls = [ + "https://github.com/bazelbuild/rules_closure/archive/0.11.0.tar.gz", ], - sha256 = "85fd6bad58ac76cc3a27c8e051e4255ff9ccd8c92ba879670d195622e7c0a9b7", - strip_prefix = "rules_jvm_external-6.0", - url = "https://github.com/bazelbuild/rules_jvm_external/releases/download/6.0/rules_jvm_external-6.0.tar.gz", -) - -load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") - -rules_jvm_external_deps() - -load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup") - -rules_jvm_external_setup() - -http_archive( - name = "contrib_rules_jvm", - sha256 = "4d62589dc6a55e74bbe33930b826d593367fc777449a410604b2ad7c6c625ef7", - strip_prefix = "rules_jvm-0.19.0", - url = "https://github.com/bazel-contrib/rules_jvm/releases/download/v0.19.0/rules_jvm-v0.19.0.tar.gz", -) - -load("@contrib_rules_jvm//:repositories.bzl", "contrib_rules_jvm_deps") - -contrib_rules_jvm_deps() - -load("@contrib_rules_jvm//:setup.bzl", "contrib_rules_jvm_setup") - -contrib_rules_jvm_setup() - -load("//java:maven_deps.bzl", "selenium_java_deps") - -selenium_java_deps() - -load("@maven//:defs.bzl", "pinned_maven_install") - -pinned_maven_install() - -# Stop `aspect_rules_js` and `rules_dotnet` from fighting over `aspect_bazel_lib` -http_archive( - name = "aspect_bazel_lib", - sha256 = "4d6010ca5e3bb4d7045b071205afa8db06ec11eb24de3f023d74d77cca765f66", - strip_prefix = "bazel-lib-1.39.0", - url = "https://github.com/aspect-build/bazel-lib/releases/download/v1.39.0/bazel-lib-v1.39.0.tar.gz", ) -http_archive( - name = "rules_dotnet", - sha256 = "d01b0f44e58224deeb8ac81afe8701385d41b16c8028709d3a4ed5b46f1c48a0", - strip_prefix = "rules_dotnet-0.14.0", - url = "https://github.com/bazelbuild/rules_dotnet/releases/download/v0.14.0/rules_dotnet-v0.14.0.tar.gz", -) +load("@io_bazel_rules_closure//closure:repositories.bzl", "rules_closure_dependencies", "rules_closure_toolchains") -load( - "@rules_dotnet//dotnet:repositories.bzl", - "dotnet_register_toolchains", - "rules_dotnet_dependencies", +rules_closure_dependencies( + omit_rules_java = True, + omit_rules_proto = True, + omit_rules_python = True, ) -rules_dotnet_dependencies() - -dotnet_register_toolchains("dotnet", "7.0.400") - -load("@rules_dotnet//dotnet:paket.rules_dotnet_nuget_packages.bzl", "rules_dotnet_nuget_packages") - -rules_dotnet_nuget_packages() - -load("@rules_dotnet//dotnet:paket.paket2bazel_dependencies.bzl", "paket2bazel_dependencies") - -paket2bazel_dependencies() - -load("//dotnet:paket.bzl", "paket") +rules_closure_toolchains() -paket() +# rules_rust fails to compile zstd on Windows when used with Bzlmod +# so we keep it in WORKSPACE for now http_archive( name = "rules_rust", - integrity = "sha256-ww398ehv1QZQp26mRbOkXy8AZnsGGHpoXpVU4WfKl+4=", - urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.40.0/rules_rust-v0.40.0.tar.gz"], + integrity = "sha256-JLN47ZcAbx9wEr5Jiib4HduZATGLiDgK7oUi/fvotzU=", + urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.42.1/rules_rust-v0.42.1.tar.gz"], ) load("@rules_rust//rust:repositories.bzl", "rules_rust_dependencies", "rust_register_toolchains") @@ -253,280 +56,3 @@ crates_repository( load("@crates//:defs.bzl", "crate_repositories") crate_repositories() - -http_archive( - name = "aspect_rules_js", - sha256 = "a2f941e27f02e84521c2d47fd530c66d57dd6d6e44b4a4f1496fe304851d8e48", - strip_prefix = "rules_js-1.35.0", - url = "https://github.com/aspect-build/rules_js/releases/download/v1.35.0/rules_js-v1.35.0.tar.gz", -) - -load("@aspect_rules_js//js:repositories.bzl", "rules_js_dependencies") - -rules_js_dependencies() - -load("@rules_nodejs//nodejs:repositories.bzl", "nodejs_register_toolchains") - -nodejs_register_toolchains( - name = "nodejs", - node_version = "18.17.0", -) - -load("@aspect_rules_js//npm:repositories.bzl", "npm_translate_lock") - -npm_translate_lock( - name = "npm", - data = [ - "@//:package.json", - "@//:pnpm-workspace.yaml", - "@//javascript/grid-ui:package.json", - "@//javascript/node/selenium-webdriver:package.json", - ], - generate_bzl_library_targets = True, - npmrc = "//:.npmrc", - pnpm_lock = "//:pnpm-lock.yaml", - update_pnpm_lock = True, - verify_node_modules_ignored = "//:.bazelignore", -) - -load("@npm//:repositories.bzl", "npm_repositories") - -npm_repositories() - -http_archive( - name = "aspect_rules_ts", - sha256 = "bd3e7b17e677d2b8ba1bac3862f0f238ab16edb3e43fb0f0b9308649ea58a2ad", - strip_prefix = "rules_ts-2.1.0", - url = "https://github.com/aspect-build/rules_ts/releases/download/v2.1.0/rules_ts-v2.1.0.tar.gz", -) - -load("@aspect_rules_ts//ts:repositories.bzl", "rules_ts_dependencies") - -rules_ts_dependencies( - ts_version = "4.9.5", -) - -load("@bazel_features//:deps.bzl", "bazel_features_deps") - -bazel_features_deps() - -http_archive( - name = "aspect_rules_esbuild", - sha256 = "999349afef62875301f45ec8515189ceaf2e85b1e67a17e2d28b95b30e1d6c0b", - strip_prefix = "rules_esbuild-0.18.0", - url = "https://github.com/aspect-build/rules_esbuild/releases/download/v0.18.0/rules_esbuild-v0.18.0.tar.gz", -) - -load("@aspect_rules_esbuild//esbuild:dependencies.bzl", "rules_esbuild_dependencies") - -rules_esbuild_dependencies() - -# Register a toolchain containing esbuild npm package and native bindings -load("@aspect_rules_esbuild//esbuild:repositories.bzl", "esbuild_register_toolchains") - -esbuild_register_toolchains( - name = "esbuild", - esbuild_version = "0.19.9", -) - -http_archive( - name = "io_bazel_rules_closure", - patch_args = [ - "-p1", - ], - patches = [ - "//javascript:rules_closure_shell.patch", - ], - sha256 = "d66deed38a0bb20581c15664f0ab62270af5940786855c7adc3087b27168b529", - strip_prefix = "rules_closure-0.11.0", - urls = [ - "https://github.com/bazelbuild/rules_closure/archive/0.11.0.tar.gz", - ], -) - -load("@io_bazel_rules_closure//closure:repositories.bzl", "rules_closure_dependencies", "rules_closure_toolchains") - -rules_closure_dependencies() - -rules_closure_toolchains() - -http_archive( - name = "rules_pkg", - sha256 = "8f9ee2dc10c1ae514ee599a8b42ed99fa262b757058f65ad3c384289ff70c4b8", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz", - "https://github.com/bazelbuild/rules_pkg/releases/download/0.9.1/rules_pkg-0.9.1.tar.gz", - ], -) - -load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies") - -rules_pkg_dependencies() - -http_archive( - name = "rules_oci", - sha256 = "db57efd706f01eb3ce771468366baa1614b5b25f4cce99757e2b8d942155b8ec", - strip_prefix = "rules_oci-1.0.0", - url = "https://github.com/bazel-contrib/rules_oci/releases/download/v1.0.0/rules_oci-v1.0.0.tar.gz", -) - -load("@rules_oci//oci:dependencies.bzl", "rules_oci_dependencies") - -rules_oci_dependencies() - -load("@rules_oci//oci:repositories.bzl", "LATEST_CRANE_VERSION", "oci_register_toolchains") - -oci_register_toolchains( - name = "oci", - crane_version = LATEST_CRANE_VERSION, - # Uncommenting the zot toolchain will cause it to be used instead of crane for some tasks. - # Note that it does not support docker-format images. - # zot_version = LATEST_ZOT_VERSION, -) - -load("@rules_oci//oci:pull.bzl", "oci_pull") - -# Examine https://console.cloud.google.com/gcr/images/distroless/GLOBAL/java?gcrImageListsize=30 to find -# the latest version when updating -oci_pull( - name = "java_image_base", - digest = "sha256:161a1d97d592b3f1919801578c3a47c8e932071168a96267698f4b669c24c76d", - image = "gcr.io/distroless/java17", -) - -oci_pull( - name = "firefox_standalone", - digest = "sha256:b6d8279268b3183d0d33e667e82fec1824298902f77718764076de763673124f", - registry = "index.docker.io", - repository = "selenium/standalone-firefox", -) - -oci_pull( - name = "chrome_standalone", - digest = "sha256:1b809a961a0a77787a7cccac74ddc5570b7e89747f925b8469ddb9a6624d4ece", - registry = "index.docker.io", - repository = "selenium/standalone-chrome", -) - -load("//common:selenium_manager.bzl", "selenium_manager") - -selenium_manager() - -load("//common:repositories.bzl", "pin_browsers") - -pin_browsers() - -http_archive( - name = "rules_ruby", - sha256 = "9ff781fd8180c2be8b3ab0f16d1d88d618c3b1bc4d502dcb914591886da40014", - strip_prefix = "rules_ruby-0.8.1", - url = "https://github.com/bazel-contrib/rules_ruby/releases/download/v0.8.1/rules_ruby-v0.8.1.tar.gz", -) - -load( - "@rules_ruby//ruby:deps.bzl", - "rb_bundle_fetch", - "rb_register_toolchains", -) - -rb_register_toolchains( - version_file = "//:rb/.ruby-version", -) - -rb_bundle_fetch( - name = "bundle", - srcs = [ - "//:rb/lib/selenium/devtools/version.rb", - "//:rb/lib/selenium/webdriver/version.rb", - "//:rb/selenium-devtools.gemspec", - "//:rb/selenium-webdriver.gemspec", - ], - gem_checksums = { - "abbrev-0.1.2": "ad1b4eaaaed4cb722d5684d63949e4bde1d34f2a95e20db93aecfe7cbac74242", - "activesupport-7.1.3": "fbfc137f1ab0e3909bd3de3e2a965245abf0381a2a7e283fa766cee6f5e0f927", - "addressable-2.8.6": "798f6af3556641a7619bad1dce04cdb6eb44b0216a991b0396ea7339276f2b47", - "ast-2.4.2": "1e280232e6a33754cde542bc5ef85520b74db2aac73ec14acef453784447cc12", - "base64-0.2.0": "0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507", - "bigdecimal-3.1.6": "bcbc27d449cf8ed1b1814d21308f49c9d22ce73e33fff0d228e38799c02eab01", - "bigdecimal-3.1.6-java": "2ef0e13a578e2411123254273f8b34c47ff9d45de91a6f64465fb217de8d5d04", - "concurrent-ruby-1.2.3": "82fdd3f8a0816e28d513e637bb2b90a45d7b982bdf4f3a0511722d2e495801e2", - "connection_pool-2.4.1": "0f40cf997091f1f04ff66da67eabd61a9fe0d4928b9a3645228532512fab62f4", - "crack-1.0.0": "c83aefdb428cdc7b66c7f287e488c796f055c0839e6e545fec2c7047743c4a49", - "csv-3.2.8": "2f5e11e8897040b97baf2abfe8fa265b314efeb8a9b7f756db9ebcf79e7db9fe", - "debug-1.9.1": "86f1a6d4a299184f1a1f7ae4c2fe80f178beed55cdf608f83b49d7bdefa3ffda", - "diff-lcs-1.5.1": "273223dfb40685548436d32b4733aa67351769c7dea621da7d9dd4813e63ddfe", - "drb-2.2.0": "e9e4af1cded3306cfe37e064a0086e302d5f40df9cb4d161d059a6bb3a75d40f", - "ffi-1.16.3": "6d3242ff10c87271b0675c58d68d3f10148fabc2ad6da52a18123f06078871fb", - "ffi-1.16.3-x64-mingw32": "6ec709011e3955e97033fa77907a8ab89a9150137d4c45c82c77399b909c9259", - "fileutils-1.7.2": "36a0fb324218263e52b486ad7408e9a295378fe8edc9fd343709e523c0980631", - "git-1.19.1": "b0a422d9f6517353c48a330d6114de4db9e0c82dbe7202964a1d9f1fbc827d70", - "hashdiff-1.1.0": "b5465f0e7375f1ee883f53a766ece4dbc764b7674a7c5ffd76e79b2f5f6fc9c9", - "i18n-1.14.1": "9d03698903547c060928e70a9bc8b6b87fda674453cda918fc7ab80235ae4a61", - "io-console-0.7.2": "f0dccff252f877a4f60d04a4dc6b442b185ebffb4b320ab69212a92b48a7a221", - "io-console-0.7.2-java": "73aa382f8832b116613ceaf57b8ff5bf73dfedcaf39f0aa5420e10f63a4543ed", - "irb-1.11.2": "a05f07e81d32dc79d78b0019283b9877463da0d40253774d1fe89f9586ae1cb9", - "jar-dependencies-0.4.1": "b2df2f1ecbff15334ce20ea7fdd5b8d8161faab67761ff72c7647d728e40d387", - "json-2.7.1": "187ea312fb58420ff0c40f40af1862651d4295c8675267c6a1c353f1a0ac3265", - "json-2.7.1-java": "bfd628c0f8357058c2cf848febfa6f140f70f94ec492693a31a0a1933038a61b", - "language_server-protocol-3.17.0.3": "3d5c58c02f44a20d972957a9febe386d7e7468ab3900ce6bd2b563dd910c6b3f", - "listen-3.8.0": "9679040ac6e7845ad9f19cf59ecde60861c78e2fae57a5c20fe35e94959b2f8f", - "logger-1.6.0": "0ab7c120262dd8de2a18cb8d377f1f318cbe98535160a508af9e7710ff43ef3e", - "minitest-5.22.2": "c5a5003fc2114a3fde506e87f377f32a0882b41d944d7b90cf4cd1f781dbc718", - "mutex_m-0.2.0": "b6ef0c6c842ede846f2ec0ade9e266b1a9dac0bc151682b04835e8ebd54840d5", - "parallel-1.24.0": "5bf38efb9b37865f8e93d7a762727f8c5fc5deb19949f4040c76481d5eee9397", - "parser-3.3.0.5": "7748313e505ca87045dc0465c776c802043f777581796eb79b1654c5d19d2687", - "psych-5.1.2": "337322f58fc2bf24827d2b9bd5ab595f6a72971867d151bb39980060ea40a368", - "psych-5.1.2-java": "1dd68dc609eddbc884e6892e11da942e16f7256bd30ebde9d35449d43043a6fe", - "public_suffix-5.0.4": "35cd648e0d21d06b8dce9331d19619538d1d898ba6d56a6f2258409d2526d1ae", - "racc-1.7.3": "b785ab8a30ec43bce073c51dbbe791fd27000f68d1c996c95da98bf685316905", - "racc-1.7.3-java": "b2ad737e788cfa083263ce7c9290644bb0f2c691908249eb4f6eb48ed2815dbf", - "rack-2.2.8": "7b83a1f1304a8f5554c67bc83632d29ecd2ed1daeb88d276b7898533fde22d97", - "rainbow-3.1.1": "039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a", - "rake-13.1.0": "be6a3e1aa7f66e6c65fa57555234eb75ce4cf4ada077658449207205474199c6", - "rb-fsevent-0.11.2": "43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe", - "rb-inotify-0.10.1": "050062d4f31d307cca52c3f6a7f4b946df8de25fc4bd373e1a5142e41034a7ca", - "rbs-3.4.4": "1376d2604a00832641bb47521595e63a1c0d1cc241ded383ba48ddb4396de5a8", - "rchardet-1.8.0": "693acd5253d5ade81a51940697955f6dd4bb2f0d245bda76a8e23deec70a52c7", - "rdoc-6.6.2": "f763dbec81079236bcccded19d69680471bd55da8f731ea6f583d019dacd9693", - "regexp_parser-2.9.0": "81a00ba141cec0d4b4bf58cb80cd9193e5180836d3fa6ef623f7886d3ba8bdd9", - "reline-0.4.2": "14042962b71d4cf52cc7d348f411886e2df54fc9d434d69b0b0bff84786d1c3a", - "rexml-3.2.6": "e0669a2d4e9f109951cb1fde723d8acd285425d81594a2ea929304af50282816", - "rspec-3.13.0": "d490914ac1d5a5a64a0e1400c1d54ddd2a501324d703b8cfe83f458337bab993", - "rspec-core-3.13.0": "557792b4e88da883d580342b263d9652b6a10a12d5bda9ef967b01a48f15454c", - "rspec-expectations-3.13.0": "621d48c62262f955421eaa418130744760802cad47e781df70dba4d9f897102e", - "rspec-mocks-3.13.0": "735a891215758d77cdb5f4721fffc21078793959d1f0ee4a961874311d9b7f66", - "rspec-support-3.13.0": "0e725f53b8c20ce75913a5da7bf06bf90698266951f3b1e3ae7bcd9612775257", - "rubocop-1.60.2": "000da0bffba2da48efdab233b13085afc3fabad2aa17ef0470cbaa0fd7cbc76c", - "rubocop-ast-1.30.0": "faad6452b1018fee0dd9e21a44445908e94ee2a4435932a9dae0e0740b6349b3", - "rubocop-capybara-2.20.0": "2a6844b942921f230ee3ab8c94fe77f41a9406096a140245270c0e11624bb938", - "rubocop-factory_bot-2.25.1": "62751bde7af789878b8a31cbd2a82e69515ce7b23a2ad1820cb0fcc3e0150134", - "rubocop-performance-1.20.2": "1bb1fa8c427fac7ba3c8dd2decb9860f23cb2d6c40350bedc88538de8875c731", - "rubocop-rspec-2.26.1": "da00a2794c35c6df9d013621fe9d8340ef9717dba746eb4aa69f414d86e74458", - "ruby-progressbar-1.13.0": "80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33", - "ruby2_keywords-0.0.5": "ffd13740c573b7301cf7a2e61fc857b2a8e3d3aff32545d6f8300d8bae10e3ef", - "rubyzip-2.3.2": "3f57e3935dc2255c414484fbf8d673b4909d8a6a57007ed754dde39342d2373f", - "securerandom-0.3.1": "98f0450c0ea46d2f9a4b6db4f391dbd83dc08049592eada155739f40e0341bde", - "steep-1.5.3": "7c6302a4d5932d0a46176ebc79766e52b853c223a85525aa2f8911e345123b85", - "stringio-3.1.0": "c1f6263ae03a15025e51194ab19b06b15e06adcaaedb7f5f6c06ab60f5d67718", - "strscan-3.1.0": "01b8a81d214fbf7b5308c6fb51b5972bbfc4a6aa1f166fd3618ba97e0fcd5555", - "strscan-3.1.0-java": "8645aa76e017e21764c6df572d2d79fcc1672284014f5bdbd806278cdbcd11b0", - "terminal-table-3.0.2": "f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91", - "tzinfo-2.0.6": "8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b", - "unicode-display_width-2.5.0": "7e7681dcade1add70cb9fda20dd77f300b8587c81ebbd165d14fd93144ff0ab4", - "webmock-3.21.0": "6609ab365daa85d203fcc297d1fffdbc8fc4216308b7c77d620af7d1261e2fd2", - "webrick-1.8.1": "19411ec6912911fd3df13559110127ea2badd0c035f7762873f58afc803e158f", - "websocket-1.2.10": "2cc1a4a79b6e63637b326b4273e46adcddf7871caa5dc5711f2ca4061a629fa8", - "yard-0.9.36": "5505736c1b00c926f71053a606ab75f02070c5960d0778b901fe9d8b0a470be4", - }, - gemfile = "//:rb/Gemfile", - gemfile_lock = "//:rb/Gemfile.lock", -) - -http_archive( - name = "com_github_bazelbuild_buildtools", - sha256 = "65391537d1ef528bf772ae25d2c163bd5cee6a929b06cad985e0734f1a12610b", - strip_prefix = "buildtools-6.1.2", - urls = [ - "https://github.com/bazelbuild/buildtools/archive/refs/tags/v6.1.2.zip", - ], -) diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod deleted file mode 100644 index c2ec7748995cb..0000000000000 --- a/WORKSPACE.bzlmod +++ /dev/null @@ -1,2 +0,0 @@ -workspace(name = "selenium") - diff --git a/common/devtools/chromium/v121/BUILD.bazel b/common/devtools/chromium/v126/BUILD.bazel similarity index 100% rename from common/devtools/chromium/v121/BUILD.bazel rename to common/devtools/chromium/v126/BUILD.bazel diff --git a/common/devtools/chromium/v123/browser_protocol.pdl b/common/devtools/chromium/v126/browser_protocol.pdl similarity index 96% rename from common/devtools/chromium/v123/browser_protocol.pdl rename to common/devtools/chromium/v126/browser_protocol.pdl index 5b79452137dbf..31028c8b42049 100644 --- a/common/devtools/chromium/v123/browser_protocol.pdl +++ b/common/devtools/chromium/v126/browser_protocol.pdl @@ -475,6 +475,12 @@ experimental domain Animation # Animation that was started. Animation animation + # Event for animation that has been updated. + event animationUpdated + parameters + # Animation that was updated. + Animation animation + # Audits domain allows investigation of page violations and possible improvements. experimental domain Audits depends on Network @@ -729,6 +735,37 @@ experimental domain Audits WebAndOsHeaders NoWebOrOsSupport NavigationRegistrationWithoutTransientUserActivation + InvalidInfoHeader + NoRegisterSourceHeader + NoRegisterTriggerHeader + NoRegisterOsSourceHeader + NoRegisterOsTriggerHeader + + type SharedDictionaryError extends string + enum + UseErrorCrossOriginNoCorsRequest + UseErrorDictionaryLoadFailure + UseErrorMatchingDictionaryNotUsed + UseErrorUnexpectedContentDictionaryHeader + WriteErrorCossOriginNoCorsRequest + WriteErrorDisallowedBySettings + WriteErrorExpiredResponse + WriteErrorFeatureDisabled + WriteErrorInsufficientResources + WriteErrorInvalidMatchField + WriteErrorInvalidStructuredHeader + WriteErrorNavigationRequest + WriteErrorNoMatchField + WriteErrorNonListMatchDestField + WriteErrorNonSecureContext + WriteErrorNonStringIdField + WriteErrorNonStringInMatchDestList + WriteErrorNonStringMatchField + WriteErrorNonTokenTypeField + WriteErrorRequestAborted + WriteErrorShuttingDown + WriteErrorTooLongIdField + WriteErrorUnsupportedType # Details for issues around "Attribution Reporting API" usage. # Explainer: https://github.com/WICG/attribution-reporting-api @@ -756,6 +793,11 @@ experimental domain Audits string url optional SourceCodeLocation location + type SharedDictionaryIssueDetails extends object + properties + SharedDictionaryError sharedDictionaryError + AffectedRequest request + type GenericIssueErrorType extends string enum CrossOriginPortalPostMessageError @@ -807,6 +849,9 @@ experimental domain Audits type CookieDeprecationMetadataIssueDetails extends object properties array of string allowedSites + number optOutPercentage + boolean isOptOutTopLevel + CookieOperation operation type ClientHintIssueReason extends string enum @@ -865,6 +910,8 @@ experimental domain Audits SilentMediationFailure ThirdPartyCookiesBlocked NotSignedInWithIdp + MissingTransientUserActivation + ReplacedByButtonMode type FederatedAuthUserInfoRequestIssueDetails extends object properties @@ -959,6 +1006,7 @@ experimental domain Audits StylesheetLoadingIssue FederatedAuthUserInfoRequestIssue PropertyRuleIssue + SharedDictionaryIssue # This struct holds a list of optional fields with additional information # specific to the kind of issue. When adding a new issue code, please also @@ -985,6 +1033,7 @@ experimental domain Audits optional StylesheetLoadingIssueDetails stylesheetLoadingIssueDetails optional PropertyRuleIssueDetails propertyRuleIssueDetails optional FederatedAuthUserInfoRequestIssueDetails federatedAuthUserInfoRequestIssueDetails + optional SharedDictionaryIssueDetails sharedDictionaryIssueDetails # A unique id for a DevTools inspector issue. Allows other entities (e.g. # exceptions, CDP message, console messages, etc.) to reference an issue. @@ -1046,6 +1095,21 @@ experimental domain Audits parameters InspectorIssue issue +# Defines commands and events for browser extensions. Available if the client +# is connected using the --remote-debugging-pipe flag and +# the --enable-unsafe-extension-debugging flag is set. +experimental domain Extensions + # Installs an unpacked extension from the filesystem similar to + # --load-extension CLI flags. Returns extension ID once the extension + # has been installed. + command loadUnpacked + parameters + # Absolute file path. + string path + returns + # Extension id. + string id + # Defines commands and events for Autofill. experimental domain Autofill type CreditCard extends object @@ -1939,12 +2003,25 @@ experimental domain CSS CSSStyle style # CSS position-fallback rule representation. - type CSSPositionFallbackRule extends object + deprecated type CSSPositionFallbackRule extends object properties Value name # List of keyframes. array of CSSTryRule tryRules + # CSS @position-try rule representation. + type CSSPositionTryRule extends object + properties + # The prelude dashed-ident name + Value name + # The css style sheet identifier (absent for user agent stylesheet and user-specified + # stylesheet rules) this rule came from. + optional StyleSheetId styleSheetId + # Parent stylesheet's origin. + StyleSheetOrigin origin + # Associated style declaration. + CSSStyle style + # CSS keyframes rule representation. type CSSKeyframesRule extends object properties @@ -2118,7 +2195,9 @@ experimental domain CSS # A list of CSS keyframed animations matching this node. optional array of CSSKeyframesRule cssKeyframesRules # A list of CSS position fallbacks matching this node. - optional array of CSSPositionFallbackRule cssPositionFallbackRules + deprecated optional array of CSSPositionFallbackRule cssPositionFallbackRules + # A list of CSS @position-try rules matching this node, based on the position-try-options property. + optional array of CSSPositionTryRule cssPositionTryRules # A list of CSS at-property rules matching this node. optional array of CSSPropertyRule cssPropertyRules # A list of CSS property registrations matching this node. @@ -2160,6 +2239,15 @@ experimental domain CSS returns CSSLayerData rootLayer + # Given a CSS selector text and a style sheet ID, getLocationForSelector + # returns an array of locations of the CSS selector in the style sheet. + experimental command getLocationForSelector + parameters + StyleSheetId styleSheetId + string selectorText + returns + array of SourceRange ranges + # Starts tracking the given computed styles for updates. The specified array of properties # replaces the one previously specified. Pass empty array to disable tracking. # Use takeComputedStyleUpdates to retrieve the list of nodes that had properties modified. @@ -2541,11 +2629,14 @@ domain DOM marker backdrop selection + search-text target-text spelling-error grammar-error highlight first-line-inherited + scroll-marker + scroll-markers scrollbar scrollbar-thumb scrollbar-button @@ -3045,6 +3136,20 @@ domain DOM # NodeIds of top layer elements array of NodeId nodeIds + # Returns the NodeId of the matched element according to certain relations. + experimental command getElementByRelation + parameters + # Id of the node from which to query the relation. + NodeId nodeId + # Type of relation to get. + enum relation + # Get the popover target for a given element. In this case, this given + # element can only be an HTMLFormControlElement (,