diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000000..d6f49421364e
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,8 @@
+version: 2
+updates:
+
+ # Maintain dependencies for GitHub Actions
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
diff --git a/.github/workflows/calibreapp-image-actions.yml b/.github/workflows/calibreapp-image-actions.yml
index 4a5864a18a4e..38e7c5a47140 100644
--- a/.github/workflows/calibreapp-image-actions.yml
+++ b/.github/workflows/calibreapp-image-actions.yml
@@ -36,7 +36,7 @@ jobs:
github.event.pull_request.head.repo.full_name == github.repository)
steps:
- name: Checkout Branch
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Compress Images
id: calibre
uses: calibreapp/image-actions@main
@@ -49,7 +49,7 @@ jobs:
if: |
github.event_name != 'pull_request' &&
steps.calibre.outputs.markdown != ''
- uses: peter-evans/create-pull-request@v3
+ uses: peter-evans/create-pull-request@v7
with:
title: Auto Compress Images
branch-suffix: timestamp
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 379be069d393..adeee615cce6 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -4,27 +4,28 @@ on:
push:
branches:
- trunk
+ workflow_dispatch:
jobs:
deploy:
- if: contains(toJson(github.event.commits), '[deploy site]') == true
- runs-on: ubuntu-20.04
+ if: contains(toJson(github.event.commits), '[deploy site]') == true || github.event_name == 'workflow_dispatch'
+ runs-on: ubuntu-24.04
steps:
- name: Checkout repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Hugo
- uses: peaceiris/actions-hugo@v2
+ uses: peaceiris/actions-hugo@v3
with:
- hugo-version: '0.110.0'
+ hugo-version: ' 0.125.4'
extended: true
- name: Build
run: chmod +x build-site.sh && ./build-site.sh
env:
SELENIUM_CI_TOKEN: ${{secrets.SELENIUM_CI_TOKEN}}
- name: Deploy
- uses: peaceiris/actions-gh-pages@v3
+ uses: peaceiris/actions-gh-pages@v4
with:
personal_token: ${{ secrets.SELENIUM_CI_TOKEN }}
publish_dir: ./website_and_docs/public
diff --git a/.github/workflows/dotnet-examples.yml b/.github/workflows/dotnet-examples.yml
index f9970b3d2ebe..ad0fad7f95b8 100644
--- a/.github/workflows/dotnet-examples.yml
+++ b/.github/workflows/dotnet-examples.yml
@@ -21,39 +21,71 @@ env:
GH_TOKEN: ${{ secrets.SELENIUM_CI_TOKEN }}
jobs:
- test_examples:
+ tests:
strategy:
fail-fast: false
matrix:
- os: [ ubuntu-latest, windows-latest, macos-latest ]
- runs-on: ${{ matrix.os }}
+ os: [ ubuntu, windows, macos ]
+ release: [ stable, nightly ]
+ runs-on: ${{ format('{0}-latest', matrix.os) }}
steps:
- name: Checkout GitHub repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Remove driver directories Windows
- if: matrix.os == 'windows-latest'
+ if: matrix.os == 'windows'
run: |
rm "$env:ChromeWebDriver" -r -v
rm "$env:EdgeWebDriver" -r -v
rm "$env:GeckoWebDriver" -r -v
- name: Remove driver directories Non-Windows
- if: matrix.os != 'windows-latest'
+ if: matrix.os != 'windows'
run: |
sudo rm -rf $CHROMEWEBDRIVER $EDGEWEBDRIVER $GECKOWEBDRIVER
- name: Start Xvfb
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu'
run: Xvfb :99 &
- - name: Set up .Net
- uses: actions/setup-dotnet@v3
+ - name: Set up .Net Stable
+ if: matrix.release == 'stable'
+ uses: actions/setup-dotnet@v4
with:
- dotnet-version: 6.0.x
+ dotnet-version: 8.x
+ - name: Set up .Net Nightly
+ if: matrix.release == 'nightly'
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: 8.x
+ source-url: https://nuget.pkg.github.com/seleniumhq/index.json
+ env:
+ NUGET_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
+ - name: Update Nightly version non-Windows
+ if: matrix.release == 'nightly' && matrix.os != 'windows'
+ run:
+ |
+ pip install -r ./scripts/requirements.txt
+ latest_nightly=$(python ./scripts/latest-nightly-version.py nuget Selenium.WebDriver)
+ echo $latest_nightly
+ dotnet add examples/dotnet/SeleniumDocs/SeleniumDocs.csproj package Selenium.WebDriver --version $latest_nightly
+ dotnet add examples/dotnet/SeleniumDocs/SeleniumDocs.csproj package Selenium.Support --version $latest_nightly
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Update Nightly version Windows
+ if: matrix.release == 'nightly' && matrix.os == 'windows'
+ shell: pwsh
+ run:
+ |
+ pip install -r ./scripts/requirements.txt
+ $latest_nightly = python ./scripts/latest-nightly-version.py nuget Selenium.WebDriver
+ dotnet add examples/dotnet/SeleniumDocs/SeleniumDocs.csproj package Selenium.WebDriver --version $latest_nightly
+ dotnet add examples/dotnet/SeleniumDocs/SeleniumDocs.csproj package Selenium.Support --version $latest_nightly
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Java
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 11
- name: Run tests
- uses: nick-invision/retry@v2.8.3
+ uses: nick-fields/retry@v3.0.2
with:
timeout_minutes: 20
max_attempts: 3
diff --git a/.github/workflows/java-examples.yml b/.github/workflows/java-examples.yml
index 0c68bb1a7371..d78c625faae3 100644
--- a/.github/workflows/java-examples.yml
+++ b/.github/workflows/java-examples.yml
@@ -21,38 +21,74 @@ env:
GH_TOKEN: ${{ secrets.SELENIUM_CI_TOKEN }}
jobs:
- test_examples:
+ tests:
strategy:
fail-fast: false
matrix:
- os: [ ubuntu-latest, windows-latest, macos-latest ]
- runs-on: ${{ matrix.os }}
+ os: [ ubuntu, windows, macos ]
+ release: [ stable, nightly ]
+ runs-on: ${{ format('{0}-latest', matrix.os) }}
steps:
- name: Checkout GitHub repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Remove driver directories Windows
- if: matrix.os == 'windows-latest'
+ if: matrix.os == 'windows'
run: |
rm "$env:ChromeWebDriver" -r -v
rm "$env:EdgeWebDriver" -r -v
rm "$env:GeckoWebDriver" -r -v
- name: Remove driver directories Non-Windows
- if: matrix.os != 'windows-latest'
+ if: matrix.os != 'windows'
run: |
sudo rm -rf $CHROMEWEBDRIVER $EDGEWEBDRIVER $GECKOWEBDRIVER
- name: Start Xvfb
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu'
run: Xvfb :99 &
- name: Set up Java
- uses: actions/setup-java@v3
+ id: java
+ uses: actions/setup-java@v4
with:
distribution: 'temurin'
- java-version: 11
- - name: Run Tests
- uses: nick-invision/retry@v2.8.3
+ java-version: 17
+ - name: Import test cert non-Windows
+ if: matrix.os != 'windows'
+ run: sudo keytool -import -noprompt -trustcacerts -alias SeleniumHQ -file examples/java/src/test/resources/tls.crt -keystore ${{ steps.java.outputs.path }}/lib/security/cacerts -storepass changeit
+ - name: Import test cert Windows
+ if: matrix.os == 'windows'
+ run: keytool -import -noprompt -trustcacerts -alias SeleniumHQ -file examples/java/src/test/resources/tls.crt -keystore ${{ steps.java.outputs.path }}/lib/security/cacerts -storepass changeit
+ - name: Run Tests Stable
+ if: matrix.release == 'stable'
+ uses: nick-invision/retry@v3.0.2
with:
- timeout_minutes: 20
+ timeout_minutes: 40
max_attempts: 3
command: |
cd examples/java
- mvn -B test
+ mvn -B test -D"jdk.internal.httpclient.disableHostnameVerification=true"
+ - name: Run Tests Nightly Linux/macOS
+ if: matrix.release == 'nightly' && matrix.os != 'windows'
+ uses: nick-invision/retry@v3.0.2
+ with:
+ timeout_minutes: 40
+ max_attempts: 3
+ command: |
+ pip install yq
+ xml_content=$(curl -sf https://oss.sonatype.org/service/local/repositories/snapshots/content/org/seleniumhq/selenium/selenium-java/)
+ latest_snapshot=$(echo "$xml_content" | xq '.content.data."content-item"' | jq -r 'sort_by(.lastModified) | last | .text')
+ echo "Latest Selenium Snapshot: $latest_snapshot"
+ cd examples/java
+ mvn -B -U test -D"jdk.internal.httpclient.disableHostnameVerification=true"
+
+ - name: Run Tests Nightly Windows
+ if: matrix.release == 'nightly' && matrix.os == 'windows'
+ uses: nick-invision/retry@v3.0.2
+ with:
+ timeout_minutes: 40
+ max_attempts: 3
+ command: |
+ pip install yq
+ $xml_content = Invoke-WebRequest -Uri "https://oss.sonatype.org/service/local/repositories/snapshots/content/org/seleniumhq/selenium/selenium-java/"
+ $latest_snapshot = $xml_content.Content | xq '.content.data.\"content-item\"' | jq -r 'sort_by(.lastModified) | last | .text'
+ Write-Output "Latest Selenium Snapshot: $latest_snapshot"
+ cd examples/java
+ mvn -B -U test -D"jdk.internal.httpclient.disableHostnameVerification=true"
diff --git a/.github/workflows/js-examples.yml b/.github/workflows/js-examples.yml
index 6f655ce8620d..2003ee2a4ab6 100644
--- a/.github/workflows/js-examples.yml
+++ b/.github/workflows/js-examples.yml
@@ -21,15 +21,16 @@ env:
GH_TOKEN: ${{ secrets.SELENIUM_CI_TOKEN }}
jobs:
- test_examples:
+ tests:
strategy:
fail-fast: false
matrix:
- os: [ ubuntu-latest, windows-latest, macos-latest ]
- runs-on: ${{ matrix.os }}
+ os: [ ubuntu, windows, macos ]
+ release: [ stable, nightly ]
+ runs-on: ${{ format('{0}-latest', matrix.os) }}
steps:
- name: Checkout GitHub repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Install Chrome for set binary test
uses: browser-actions/setup-chrome@v1
with:
@@ -41,47 +42,81 @@ jobs:
edge-version: stable
id: setup-edge
- name: Install Firefox for set binary test
- if: matrix.os != 'windows-latest'
+ if: matrix.os != 'windows'
uses: browser-actions/setup-firefox@v1
with:
firefox-version: latest
id: setup-firefox
- name: Set ENV Windows
- if: matrix.os == 'windows-latest'
+ if: matrix.os == 'windows'
run: |
echo "CHROME_BIN=${{ steps.setup-chrome.outputs.chrome-path }}" >> $env:GITHUB_ENV
echo "EDGE_BIN=C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" >> $env:GITHUB_ENV
echo "FF_BIN=C:\Program Files (x86)\Mozilla Firefox\firefox-browser.exe" >> $env:GITHUB_ENV
- name: Set ENV Mac
- if: matrix.os == 'macos-latest'
+ if: matrix.os == 'macos'
run: |
echo "CHROME_BIN=${{ steps.setup-chrome.outputs.chrome-path }}" >> "$GITHUB_ENV"
echo "EDGE_BIN=/Users/runner/hostedtoolcache/msedge/stable/x64/Contents/MacOS/Microsoft Edge" >> "$GITHUB_ENV"
echo "FF_BIN=/Users/runner/hostedtoolcache/firefox/latest/x64/Contents/MacOS/firefox" >> "$GITHUB_ENV"
- name: Set ENV Linux
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu'
run: |
echo "CHROME_BIN=${{ steps.setup-chrome.outputs.chrome-path }}" >> "$GITHUB_ENV"
echo "EDGE_BIN=/opt/hostedtoolcache/msedge/stable/x64/msedge" >> "$GITHUB_ENV"
echo "FF_BIN=/opt/hostedtoolcache/firefox/latest/x64/firefox" >> "$GITHUB_ENV"
- name: Remove driver directories Windows
- if: matrix.os == 'windows-latest'
+ if: matrix.os == 'windows'
run: |
rm "$env:ChromeWebDriver" -r -v
rm "$env:EdgeWebDriver" -r -v
rm "$env:GeckoWebDriver" -r -v
- name: Remove driver directories Non-Windows
- if: matrix.os != 'windows-latest'
+ if: matrix.os != 'windows'
run: |
sudo rm -rf $CHROMEWEBDRIVER $EDGEWEBDRIVER $GECKOWEBDRIVER
- name: Start Xvfb
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu'
run: Xvfb :99 &
+ - name: Setup Node Stable
+ if: matrix.release == 'stable'
+ uses: actions/setup-node@v4
+ with:
+ node-version: '22.x'
+ - name: Setup Node Nightly
+ if: matrix.release == 'nightly'
+ uses: actions/setup-node@v4
+ with:
+ node-version: '22.x'
+ registry-url: 'https://npm.pkg.github.com/'
+ - name: Use Nightly package.json in Ubuntu/macOS
+ if: matrix.release == 'nightly' && matrix.os != 'windows'
+ run:
+ |
+ pip install -r ./scripts/requirements.txt
+ latest_nightly=$(python ./scripts/latest-nightly-version.py npm selenium-webdriver)
+ echo $latest_nightly
+ npm install --prefix ./examples/javascript --save selenium-webdriver@npm:@seleniumhq/selenium-webdriver@$latest_nightly
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Use Nightly package.json in Windows
+ if: matrix.release == 'nightly' && matrix.os == 'windows'
+ run:
+ |
+ pip install -r ./scripts/requirements.txt
+ $latest_nightly = python ./scripts/latest-nightly-version.py npm selenium-webdriver
+ npm install --prefix ./examples/javascript --save selenium-webdriver@npm:@seleniumhq/selenium-webdriver@$latest_nightly
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install Requirements
working-directory: ./examples/javascript
run: npm install
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Run tests
- uses: nick-invision/retry@v2.8.3
+ uses: nick-invision/retry@v3.0.2
with:
timeout_minutes: 20
max_attempts: 3
diff --git a/.github/workflows/kotlin-examples.yml b/.github/workflows/kotlin-examples.yml
index fb595ee6ceca..ce53e7052e6e 100644
--- a/.github/workflows/kotlin-examples.yml
+++ b/.github/workflows/kotlin-examples.yml
@@ -21,15 +21,15 @@ env:
GH_TOKEN: ${{ secrets.SELENIUM_CI_TOKEN }}
jobs:
- test_examples:
+ tests:
strategy:
fail-fast: false
matrix:
- os: [ ubuntu-latest, windows-latest, macos-latest ]
- runs-on: ${{ matrix.os }}
+ os: [ ubuntu, windows, macos ]
+ runs-on: ${{ format('{0}-latest', matrix.os) }}
steps:
- name: Checkout GitHub repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Install Chrome for set binary test
uses: browser-actions/setup-chrome@v1
with:
@@ -41,49 +41,49 @@ jobs:
edge-version: stable
id: setup-edge
- name: Install Firefox for set binary test
- if: matrix.os != 'windows-latest'
+ if: matrix.os != 'windows'
uses: browser-actions/setup-firefox@v1
with:
firefox-version: latest
id: setup-firefox
- name: Set ENV Windows
- if: matrix.os == 'windows-latest'
+ if: matrix.os == 'windows'
run: |
echo "CHROME_BIN=${{ steps.setup-chrome.outputs.chrome-path }}" >> $env:GITHUB_ENV
echo "EDGE_BIN=C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" >> $env:GITHUB_ENV
echo "FF_BIN=C:\Program Files (x86)\Mozilla Firefox\firefox-browser.exe" >> $env:GITHUB_ENV
- name: Set ENV Mac
- if: matrix.os == 'macos-latest'
+ if: matrix.os == 'macos'
run: |
echo "CHROME_BIN=${{ steps.setup-chrome.outputs.chrome-path }}" >> "$GITHUB_ENV"
echo "EDGE_BIN=/Users/runner/hostedtoolcache/msedge/stable/x64/Contents/MacOS/Microsoft Edge" >> "$GITHUB_ENV"
echo "FF_BIN=/Users/runner/hostedtoolcache/firefox/latest/x64/Contents/MacOS/firefox" >> "$GITHUB_ENV"
- name: Set ENV Linux
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu'
run: |
echo "CHROME_BIN=${{ steps.setup-chrome.outputs.chrome-path }}" >> "$GITHUB_ENV"
echo "EDGE_BIN=/opt/hostedtoolcache/msedge/stable/x64/msedge" >> "$GITHUB_ENV"
echo "FF_BIN=/opt/hostedtoolcache/firefox/latest/x64/firefox" >> "$GITHUB_ENV"
- name: Remove driver directories Windows
- if: matrix.os == 'windows-latest'
+ if: matrix.os == 'windows'
run: |
rm "$env:ChromeWebDriver" -r -v
rm "$env:EdgeWebDriver" -r -v
rm "$env:GeckoWebDriver" -r -v
- name: Remove driver directories Non-Windows
- if: matrix.os != 'windows-latest'
+ if: matrix.os != 'windows'
run: |
sudo rm -rf $CHROMEWEBDRIVER $EDGEWEBDRIVER $GECKOWEBDRIVER
- name: Start Xvfb
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu'
run: Xvfb :99 &
- name: Set up Java
- uses: actions/setup-java@v2
+ uses: actions/setup-java@v4
with:
distribution: 'temurin'
- java-version: 8
+ java-version: 11
- name: Run tests
- uses: nick-invision/retry@v2.8.3
+ uses: nick-invision/retry@v3.0.2
with:
timeout_minutes: 20
max_attempts: 3
diff --git a/.github/workflows/label-commenter.yml b/.github/workflows/label-commenter.yml
index 576e6f9e5889..df36c74c6fab 100644
--- a/.github/workflows/label-commenter.yml
+++ b/.github/workflows/label-commenter.yml
@@ -11,8 +11,8 @@ permissions:
jobs:
comment:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Label Commenter
uses: peaceiris/actions-label-commenter@v1
diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml
index b40bf0d3c807..243c75765a84 100644
--- a/.github/workflows/link-check.yml
+++ b/.github/workflows/link-check.yml
@@ -16,18 +16,18 @@ jobs:
group: ${{ github.workflow }}-${{ github.ref }}
steps:
- name: Check out repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up Hugo
- uses: peaceiris/actions-hugo@v2
+ uses: peaceiris/actions-hugo@v3
with:
- hugo-version: "0.110.0"
+ hugo-version: ' 0.125.4'
extended: true
- name: Setup Node
- uses: actions/setup-node@v3
+ uses: actions/setup-node@v4
with:
- node-version: '18.14.2'
+ node-version: '22.15.0'
cache: 'npm'
# The action defaults to search for the dependency file (package-lock.json,
# npm-shrinkwrap.json or yarn.lock) in the repository root, and uses its
@@ -42,13 +42,13 @@ jobs:
- name: Link check
continue-on-error: true # <- If set to false, run fails with broken links
- uses: untitaker/hyperlink@0.1.27
+ uses: untitaker/hyperlink@0.1.44
with:
args: website_and_docs/public/ --check-anchors
- name: Archive hyperlink results
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: hyperlink-report
path: website_and_docs/tmp/.hyperlink/hyperlink.log
- retention-days: 7 # default is 90 days
\ No newline at end of file
+ retention-days: 7 # default is 90 days
diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml
index 8d7bd8cb2d4b..c5180609e8ed 100644
--- a/.github/workflows/lock.yml
+++ b/.github/workflows/lock.yml
@@ -14,7 +14,7 @@ jobs:
action:
runs-on: ubuntu-latest
steps:
- - uses: dessant/lock-threads@v4
+ - uses: dessant/lock-threads@v5
with:
process-only: 'issues'
issue-lock-inactive-days: '30'
diff --git a/.github/workflows/python-examples.yml b/.github/workflows/python-examples.yml
index 6ee0f573ca8b..c910df4b11cf 100644
--- a/.github/workflows/python-examples.yml
+++ b/.github/workflows/python-examples.yml
@@ -21,47 +21,84 @@ env:
GH_TOKEN: ${{ secrets.SELENIUM_CI_TOKEN }}
jobs:
- test_examples:
+ tests:
strategy:
fail-fast: false
matrix:
- os: [ ubuntu-latest, windows-latest, macos-latest ]
- runs-on: ${{ matrix.os }}
+ include:
+ - os: ubuntu
+ release: stable
+ python: '3.9'
+ - os: ubuntu
+ release: nightly
+ python: '3.11'
+ - os: windows
+ release: stable
+ python: '3.9'
+ - os: windows
+ release: nightly
+ python: '3.12'
+ - os: macos
+ release: stable
+ python: '3.10'
+ - os: macos
+ release: nightly
+ python: '3.13'
+ runs-on: ${{ format('{0}-latest', matrix.os) }}
steps:
- name: Checkout GitHub repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Remove driver directories Windows
- if: matrix.os == 'windows-latest'
+ if: matrix.os == 'windows'
run: |
rm "$env:ChromeWebDriver" -r -v
rm "$env:EdgeWebDriver" -r -v
rm "$env:GeckoWebDriver" -r -v
- name: Remove driver directories Non-Windows
- if: matrix.os != 'windows-latest'
+ if: matrix.os != 'windows'
run: |
sudo rm -rf $CHROMEWEBDRIVER $EDGEWEBDRIVER $GECKOWEBDRIVER
- name: Start Xvfb
- if: matrix.os == 'ubuntu-latest'
+ if: matrix.os == 'ubuntu'
run: Xvfb :99 &
- name: Set up Python
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v5
with:
- python-version: 3.8
- - name: Install dependencies
+ python-version: ${{ matrix.python }}
+ - name: Install dependencies nightly non-Windows
+ if: matrix.release == 'nightly' && matrix.os != 'windows'
+ run: |
+ pip install -r ./scripts/requirements.txt
+ latest_nightly_python=$(python ./scripts/latest-python-nightly-version.py)
+ cd examples/python
+ python -m pip install --upgrade pip
+ pip install -r requirements.txt
+ pip install --index-url https://test.pypi.org/simple/ selenium==$latest_nightly_python --extra-index-url https://pypi.org/simple/ --upgrade --force-reinstall --break-system-packages
+ - name: Install dependencies nightly Windows
+ if: matrix.release == 'nightly' && matrix.os == 'windows'
+ run: |
+ pip install -r ./scripts/requirements.txt
+ $latest_nightly_python = python ./scripts/latest-python-nightly-version.py
+ cd examples/python
+ python -m pip install --upgrade pip
+ pip install -r requirements.txt
+ pip install --index-url https://test.pypi.org/simple/ selenium==$latest_nightly_python --extra-index-url https://pypi.org/simple/ --upgrade --force-reinstall --break-system-packages
+ - name: Install dependencies stable
+ if: matrix.release == 'stable'
working-directory: ./examples/python
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Set up Java
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 11
- name: Run tests
- uses: nick-invision/retry@v2.8.3
+ uses: nick-invision/retry@v3.0.2
with:
- timeout_minutes: 20
+ timeout_minutes: 60
max_attempts: 3
command: |
cd examples/python
- pytest
+ pytest --reruns 3
diff --git a/.github/workflows/ruby-examples.yml b/.github/workflows/ruby-examples.yml
index a4de4331c645..b0717816e088 100644
--- a/.github/workflows/ruby-examples.yml
+++ b/.github/workflows/ruby-examples.yml
@@ -21,46 +21,109 @@ env:
GH_TOKEN: ${{ secrets.SELENIUM_CI_TOKEN }}
jobs:
- test_examples:
+ tests:
strategy:
fail-fast: false
matrix:
- os: [ ubuntu-latest, windows-latest, macos-latest ]
- runs-on: ${{ matrix.os }}
+ os: [ ubuntu, windows, macos ]
+ release: [ stable, nightly ]
+ runs-on: ${{ format('{0}-latest', matrix.os) }}
steps:
- name: Checkout GitHub repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Remove driver directories Windows
- if: matrix.os == 'windows-latest'
+ if: matrix.os == 'windows'
run: |
rm "$env:ChromeWebDriver" -r -v
rm "$env:EdgeWebDriver" -r -v
rm "$env:GeckoWebDriver" -r -v
- name: Remove driver directories Non-Windows
- if: matrix.os != 'windows-latest'
+ if: matrix.os != 'windows'
run: |
sudo rm -rf $CHROMEWEBDRIVER $EDGEWEBDRIVER $GECKOWEBDRIVER
- - name: Start Xvfb
- if: matrix.os == 'ubuntu-latest'
- run: Xvfb :99 &
+ - name: Setup Fluxbox and Xvfb
+ if: matrix.os == 'ubuntu'
+ run: |
+ sudo apt-get -y install fluxbox libxss1 libappindicator3-1 libindicator7
+ Xvfb :99 &
+ fluxbox -display :99 &
+ echo "DISPLAY=:99" >> "$GITHUB_ENV"
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
- ruby-version: 3.0
+ ruby-version: 3.1
bundler-cache: true
- - name: Install Gems
+ - name: Install Gems Nightly non-Windows
+ if: matrix.release == 'nightly' && matrix.os != 'windows'
+ run:
+ |
+ pip install -r ./scripts/requirements.txt
+ latest_nightly_webdriver=$(python ./scripts/latest-nightly-version.py rubygems selenium-webdriver)
+ echo $latest_nightly_webdriver
+ cd examples/ruby
+ bundle install
+ bundle remove selenium-webdriver
+ bundle add selenium-webdriver --version $latest_nightly_webdriver --source "https://token:$%7B%7Bsecrets.GITHUB_TOKEN%7D%7D@rubygems.pkg.github.com/seleniumhq"
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Install Gems Nightly Windows
+ if: matrix.release == 'nightly' && matrix.os == 'windows'
+ run:
+ |
+ pip install -r ./scripts/requirements.txt
+ $latest_nightly_webdriver = python ./scripts/latest-nightly-version.py rubygems selenium-webdriver
+ cd examples/ruby
+ bundle install
+ bundle remove selenium-webdriver
+ bundle add selenium-webdriver --version $latest_nightly_webdriver --source "https://token:$%7B%7Bsecrets.GITHUB_TOKEN%7D%7D@rubygems.pkg.github.com/seleniumhq"
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Install Gems Stable
+ if: matrix.release == 'stable'
working-directory: ./examples/ruby
run: bundle install
- name: Set up Java
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: 11
- - name: Run tests
- uses: nick-invision/retry@v2.8.3
+ - name: Run tests on Windows
+ if: matrix.os == 'windows'
+ uses: nick-invision/retry@v3.0.2
with:
timeout_minutes: 20
- max_attempts: 3
+ max_attempts: 2
command: |
cd examples/ruby
bundle exec rspec
+ new_command_on_retry: |
+ cd examples/ruby; $env:DEBUG="true"; bundle exec rspec --only-failures --backtrace
+ - name: Run tests on ${{ matrix.os }}
+ if: matrix.os != 'windows'
+ uses: nick-invision/retry@v3.0.2
+ with:
+ timeout_minutes: 20
+ max_attempts: 2
+ command: |
+ cd examples/ruby
+ bundle exec rspec
+ new_command_on_retry: |
+ cd examples/ruby
+ DEBUG=true bundle exec rspec --only-failures --backtrace
+
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout GitHub repo
+ uses: actions/checkout@v4
+ - name: Set up Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: 3.1
+ bundler-cache: true
+ - name: Install dependencies
+ working-directory: ./examples/ruby
+ run: bundle install
+ - name: Run RuboCop
+ working-directory: ./examples/ruby
+ run: bundle exec rubocop
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 18f98f7c3a2b..e92e293f41ee 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -10,14 +10,14 @@ on:
jobs:
test_build:
- runs-on: ubuntu-20.04
+ runs-on: ubuntu-24.04
steps:
- name: Checkout repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup Hugo
- uses: peaceiris/actions-hugo@v2
+ uses: peaceiris/actions-hugo@v3
with:
- hugo-version: '0.110.0'
+ hugo-version: '0.125.4'
extended: true
- name: Build
run: chmod +x build-site.sh && ./build-site.sh
diff --git a/.gitignore b/.gitignore
index 43ede48a62fd..c828c5469d5d 100755
--- a/.gitignore
+++ b/.gitignore
@@ -11,3 +11,5 @@ website_and_docs/resources
.settings
.gitignore
.pydevproject
+**/*.iml
+**/.gradle
diff --git a/.gitpod.yml b/.gitpod.yml
index 0938b32433b6..c5bf57fb4d95 100644
--- a/.gitpod.yml
+++ b/.gitpod.yml
@@ -1,12 +1,12 @@
tasks:
- name: Install Hugo, init submodules and start website
init: |
- curl -LO https://github.com/gohugoio/hugo/releases/download/v0.110.0/hugo_extended_0.110.0_linux-amd64.deb && \
- sudo dpkg -i hugo_extended_0.110.0_linux-amd64.deb && \
- sudo rm hugo_extended_0.110.0_linux-amd64.deb
+ curl -LO https://github.com/gohugoio/hugo/releases/download/v0.125.4/hugo_extended_0.125.4_linux-amd64.deb && \
+ sudo dpkg -i hugo_extended_0.125.4_linux-amd64.deb && \
+ sudo rm hugo_extended_0.125.4_linux-amd64.deb
command: |
cd website_and_docs
- hugo server --baseUrl $(gp url 1313) --appendPort=false
+ hugo server --baseURL $(gp url 1313) --appendPort=false
# List the ports you want to expose and what to do when they are served. See https://www.gitpod.io/docs/config-ports/
ports:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 37b19be3a79b..f9fd866c46e6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,4 +1,3 @@
# Contributing to the Selenium site and docs
-Please follow this [link](https://selenium.dev/documentation/about/contributing/)
-for all the contribution details.
+Please follow this [link](https://selenium.dev/documentation/about/contributing/) for all the contribution details.
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
index f93f63a77a3b..da798cca98c0 100644
--- a/GOVERNANCE.md
+++ b/GOVERNANCE.md
@@ -1,3 +1,3 @@
# Governance
-Content moved to https://www.selenium.dev/governance/
+Content moved to
diff --git a/LICENSE b/LICENSE
index 6ff5cc6fe3f8..75b9810f863a 100644
--- a/LICENSE
+++ b/LICENSE
@@ -187,7 +187,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright 2023 Software Freedom Conservancy (SFC)
+ Copyright 2025 Software Freedom Conservancy (SFC)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/README.md b/README.md
index 9cf6125e7dac..b58633891dfa 100755
--- a/README.md
+++ b/README.md
@@ -1,4 +1,10 @@
[](https://github.com/SeleniumHQ/seleniumhq.github.io/actions?query=workflow%3A%22Publish+Selenium+Site%22)
+[](https://github.com/SeleniumHQ/seleniumhq.github.io/actions/workflows/java-examples.yml)
+[](https://github.com/SeleniumHQ/seleniumhq.github.io/actions/workflows/kotlin-examples.yml)
+[](https://github.com/SeleniumHQ/seleniumhq.github.io/actions/workflows/python-examples.yml)
+[](https://github.com/SeleniumHQ/seleniumhq.github.io/actions/workflows/js-examples.yml)
+[](https://github.com/SeleniumHQ/seleniumhq.github.io/actions/workflows/ruby-examples.yml)
+[](https://github.com/SeleniumHQ/seleniumhq.github.io/actions/workflows/dotnet-examples.yml)
@@ -11,11 +17,11 @@ This is the repository used to build and publish the official Selenium [website]
We use [Hugo](https://gohugo.io/) and the [Docsy theme](https://www.docsy.dev/)
to build and render the site. You will need the **extended**
Sass/SCSS version of the Hugo binary to work on this site. We recommend
-to use Hugo 0.110.0.
+to use **[Hugo 0.125.4](https://github.com/gohugoio/hugo/releases/tag/v0.125.4)**
Steps needed to have this working locally and work on it:
-- Follow the [Install Hugo](https://www.docsy.dev/docs/get-started/other-options/#install-hugo) instructions from Docsy
+- [Install Hugo](https://gohugo.io/installation/) and follow the [Get Started](https://www.docsy.dev/docs/get-started/) instructions from Docsy
- [Install go](https://go.dev/doc/install)
- Clone this repository
- Run `cd website_and_docs`
@@ -25,31 +31,26 @@ A full contribution guideline can be seen at [contributing](https://selenium.dev
## How to get involved?
-Please check all the information available at https://selenium.dev/getinvolved/
+Please check all the information available at
-### Do not want to clone the repository to contribute? Use GitPod.
+### Do not want to clone the repository to contribute? Use GitPod
[](https://gitpod.io/#https://github.com/SeleniumHQ/seleniumhq.github.io)
-
## For Selenium Site and Documentation maintainers
### How does the site and docs get build?
GitHub actions runs for every commit on each PR and protected branch. The regular CI execution will
build the site with Hugo to verify that the commit works. The description of these steps can be seen
-at the actions configuration file, [one for testing a PR](./.github/workflows/test.yml), and
-[one for deploying the site](./.github/workflows/deploy.yml)
+at the actions configuration file, [one for testing a PR](./.github/workflows/test.yml), and [one for deploying the site](./.github/workflows/deploy.yml)
### How are the site and docs deployed?
-After each CI execution that happens in the `trunk` branch, the script [build-site.sh](./build-site.sh)
-is executed for deployment. This script checks for the string `[deploy site]` in the commit message.
+After each CI execution that happens in the `trunk` branch, the script [build-site.sh](./build-site.sh) is executed for deployment. This script checks for the string `[deploy site]` in the commit message.
-If the commit message contains that string, and the commit is in `trunk`, a
-[GitHub action](./.github/workflows/deploy.yml) is triggered to build and deploy the site.
-The site and docs will be built, and the changes will be committed to the branch `publish`
-by the user [Selenium-CI](https://github.com/selenium-ci/).
+If the commit message contains that string, and the commit is in `trunk`, a [GitHub action](./.github/workflows/deploy.yml) is triggered to build and deploy the site.
+The site and docs will be built, and the changes will be committed to the branch `publish` by the user [Selenium-CI](https://github.com/selenium-ci/).
*What is important to take into account is that the source files for the site are in the `trunk`
branch, and the files that get deployed are pushed to the `publish` branch.*
@@ -59,11 +60,9 @@ repo [settings](https://github.com/SeleniumHQ/seleniumhq.github.io/settings) (if
you should be able to access the link).
The selenium.
-domain is managed at https://www.gandi.net/en, if you need access to it, reach out to
-any of the [PLC](https://www.selenium.dev/project/structure/#plc) or [TLC](https://www.selenium.dev/project/structure/#tlc)
+domain is managed at , if you need access to it, reach out to any of the [PLC](https://www.selenium.dev/project/structure/#plc) or [TLC](https://www.selenium.dev/project/structure/#tlc)
members, who can help you with that.
If for any reason, you need to setup the domain redirection again,
we followed this [guide](http://spector.io/how-to-set-up-github-pages-with-a-custom-domain-on-gandi/),
-but any tutorial/guide showing how to redirect a domain to GitHub pages should do.
-
+but any tutorial/guide showing how to redirect a domain to GitHub pages should do.
diff --git a/examples/dotnet/SeleniumDocs/BaseChromeTest.cs b/examples/dotnet/SeleniumDocs/BaseChromeTest.cs
index 6b5695d8c47f..415525c07158 100644
--- a/examples/dotnet/SeleniumDocs/BaseChromeTest.cs
+++ b/examples/dotnet/SeleniumDocs/BaseChromeTest.cs
@@ -6,9 +6,9 @@ namespace SeleniumDocs
public class BaseChromeTest : BaseTest
{
[TestInitialize]
- public void CreateDriver()
+ public void AutoStartDriver()
{
- driver = new ChromeDriver();
+ StartDriver();
}
}
}
\ No newline at end of file
diff --git a/examples/dotnet/SeleniumDocs/BaseTest.cs b/examples/dotnet/SeleniumDocs/BaseTest.cs
index be17872f1e65..e8d439c9d804 100644
--- a/examples/dotnet/SeleniumDocs/BaseTest.cs
+++ b/examples/dotnet/SeleniumDocs/BaseTest.cs
@@ -17,7 +17,7 @@ public class BaseTest
protected IWebDriver driver;
protected Uri GridUrl;
private Process _webserverProcess;
- private const string ServerJarName = "selenium-server-4.15.0.jar";
+ private const string ServerJarName = "selenium-server-4.32.0.jar";
private static readonly string BaseDirectory = AppContext.BaseDirectory;
private const string RelativePathToGrid = "../../../../../";
private readonly string _examplesDirectory = Path.GetFullPath(Path.Combine(BaseDirectory, RelativePathToGrid));
@@ -33,12 +33,7 @@ public void Cleanup()
}
}
- protected void StartDriver()
- {
- driver = new ChromeDriver();
- }
-
- protected void StartDriver(string browserVersion)
+ protected void StartDriver(string browserVersion = "stable")
{
ChromeOptions options = new ChromeOptions
{
diff --git a/examples/dotnet/SeleniumDocs/BiDi/CDP/CDPTest.cs b/examples/dotnet/SeleniumDocs/BiDi/CDP/CDPTest.cs
new file mode 100644
index 000000000000..3188d183d748
--- /dev/null
+++ b/examples/dotnet/SeleniumDocs/BiDi/CDP/CDPTest.cs
@@ -0,0 +1,29 @@
+using System.Collections.Generic;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using OpenQA.Selenium;
+using OpenQA.Selenium.Chrome;
+
+namespace SeleniumDocs.BiDi.CDP
+{
+ [TestClass]
+ public class CDPTest : BaseChromeTest
+ {
+ [TestMethod]
+ public void SetCookie()
+ {
+ var cookie = new Dictionary
+ {
+ { "name", "cheese" },
+ { "value", "gouda" },
+ { "domain", "www.selenium.dev" },
+ { "secure", true }
+ };
+ ((ChromeDriver)driver).ExecuteCdpCommand("Network.setCookie", cookie);
+
+ driver.Url = "https://www.selenium.dev/";
+ Cookie cheese = driver.Manage().Cookies.GetCookieNamed("cheese");
+ Assert.AreEqual("gouda", cheese.Value);
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/examples/dotnet/SeleniumDocs/BiDi/CDP/LoggingTest.cs b/examples/dotnet/SeleniumDocs/BiDi/CDP/LoggingTest.cs
new file mode 100644
index 000000000000..c7f912be43da
--- /dev/null
+++ b/examples/dotnet/SeleniumDocs/BiDi/CDP/LoggingTest.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.IdentityModel.Tokens;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using OpenQA.Selenium;
+using OpenQA.Selenium.Support.UI;
+
+namespace SeleniumDocs.BiDi.CDP
+{
+ [TestClass]
+ public class LoggingTest : BaseChromeTest
+ {
+ [TestMethod]
+ public async Task ConsoleLogs()
+ {
+ driver.Url = "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html";
+
+ using IJavaScriptEngine monitor = new JavaScriptEngine(driver);
+ var messages = new List();
+ monitor.JavaScriptConsoleApiCalled += (_, e) =>
+ {
+ messages.Add(e.MessageContent);
+ };
+ await monitor.StartEventMonitoring();
+
+ driver.FindElement(By.Id("consoleLog")).Click();
+ driver.FindElement(By.Id("consoleError")).Click();
+ new WebDriverWait(driver, TimeSpan.FromSeconds(5)).Until(_ => messages.Count > 1);
+ monitor.StopEventMonitoring();
+
+ Assert.IsTrue(messages.Contains("Hello, world!"));
+ Assert.IsTrue(messages.Contains("I am console error"));
+ }
+
+ [TestMethod]
+ public async Task JsErrors()
+ {
+ driver.Url = "https://www.selenium.dev/selenium/web/bidi/logEntryAdded.html";
+
+ using IJavaScriptEngine monitor = new JavaScriptEngine(driver);
+ var messages = new List();
+ monitor.JavaScriptExceptionThrown += (_, e) =>
+ {
+ messages.Add(e.Message);
+ };
+ await monitor.StartEventMonitoring();
+
+ driver.FindElement(By.Id("jsException")).Click();
+ new WebDriverWait(driver, TimeSpan.FromSeconds(5)).Until(_ => !messages.IsNullOrEmpty());
+ monitor.StopEventMonitoring();
+
+ Assert.IsTrue(messages.Contains("Uncaught"));
+ }
+ }
+}
\ No newline at end of file
diff --git a/examples/dotnet/SeleniumDocs/Bidirectional/ChromeDevtools/BidiApiTest.cs b/examples/dotnet/SeleniumDocs/BiDi/CDP/NetworkTest.cs
similarity index 52%
rename from examples/dotnet/SeleniumDocs/Bidirectional/ChromeDevtools/BidiApiTest.cs
rename to examples/dotnet/SeleniumDocs/BiDi/CDP/NetworkTest.cs
index f088fb915cab..b51b60d7d1b0 100644
--- a/examples/dotnet/SeleniumDocs/Bidirectional/ChromeDevtools/BidiApiTest.cs
+++ b/examples/dotnet/SeleniumDocs/BiDi/CDP/NetworkTest.cs
@@ -1,17 +1,24 @@
-using System;
-using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
-using Microsoft.IdentityModel.Tokens;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
-using OpenQA.Selenium.Support.UI;
+using OpenQA.Selenium.DevTools;
+using System.Linq;
+using OpenQA.Selenium.DevTools.V132.Network;
+using OpenQA.Selenium.DevTools.V132.Performance;
-namespace SeleniumDocs.Bidirectional.ChromeDevTools
+
+namespace SeleniumDocs.BiDi.CDP
{
[TestClass]
- public class BidiApiTest : BaseChromeTest
+ public class NetworkTest : BaseTest
{
+ [TestInitialize]
+ public void Startup()
+ {
+ StartDriver("132");
+ }
+
[TestMethod]
public async Task BasicAuthentication()
{
@@ -20,11 +27,10 @@ public async Task BasicAuthentication()
UriMatcher = uri => uri.AbsoluteUri.Contains("herokuapp"),
Credentials = new PasswordCredentials("admin", "admin")
};
-
var networkInterceptor = driver.Manage().Network;
networkInterceptor.AddAuthenticationHandler(handler);
-
await networkInterceptor.StartMonitoring();
+
driver.Navigate().GoToUrl("https://the-internet.herokuapp.com/basic_auth");
await networkInterceptor.StopMonitoring();
@@ -32,93 +38,6 @@ public async Task BasicAuthentication()
driver.FindElement(By.TagName("p")).Text);
}
- [TestMethod]
- public async Task PinScript()
- {
- driver.Url = "https://www.selenium.dev/selenium/web/xhtmlTest.html";
- var element = driver.FindElement(By.Id("id1"));
-
- var key = await new JavaScriptEngine(driver).PinScript("return arguments;");
-
- var arguments = ((WebDriver)driver).ExecuteScript(key, 1, true, element);
-
- var expected = new List