Skip to content

[#205] Added selenium-less headless Chrome driver for JavaScript steps.#689

Merged
AlexSkrypnyk merged 8 commits into
mainfrom
feature/chrome-mink
Jul 9, 2026
Merged

[#205] Added selenium-less headless Chrome driver for JavaScript steps.#689
AlexSkrypnyk merged 8 commits into
mainfrom
feature/chrome-mink

Conversation

@AlexSkrypnyk

@AlexSkrypnyk AlexSkrypnyk commented Jul 8, 2026

Copy link
Copy Markdown
Member

Closes #205

Summary

JavaScript-dependent Behat steps previously assumed a Selenium2/WebDriver session, hard-checking instanceof Selenium2Driver and reaching into WebDriver-specific APIs, so they broke under any other driver. This change makes six traits driver-agnostic and adds a selenium-less chrome_headless Behat profile that drives headless Chrome directly over the Chrome DevTools Protocol via dmore/chrome-mink-driver, with no Selenium server in the loop. CI now runs the full suite through both the existing Selenium2 profile and the new chrome_headless profile, proving step definitions behave identically on either driver.

Changes

Driver-agnostic traits

  • CookieTrait: reads cookies via getCookies() when the driver exposes it (CDP-based drivers), alongside the existing WebDriver and BrowserKit branches.
  • FileDownloadTrait: replaced the hard Selenium2Driver instance check with capability checks - getWebDriverSession() for WebDriver drivers, getCookies() for CDP-based drivers, and the BrowserKit branch as fallback.
  • KeyboardTrait: keyboardTriggerKey() keeps the Syn-library/reflection path for Selenium2Driver and adds a native DevTools key-event path for other JavaScript drivers, mapping special keys (arrows, escape, enter, etc.) to keycodes sent via keyDown()/keyUp(), and printable characters via keyPress(). keyboardPressKeyOnElementSingle() now only rejects non-JavaScript (BrowserKitDriver) sessions instead of anything that isn't Selenium2Driver.
  • ResponsiveTrait: removed the Selenium2Driver guards in responsiveGetCurrentDimensions() and responsiveResize() so viewport inspection and resizing run under any JavaScript driver.
  • AccessibilityTrait: serializes the axe-core results to a JSON string inside the browser (JSON.stringify(...)) before decoding, since some CDP drivers cannot marshal the raw nested result object back through evaluateScript().
  • DropzoneTrait: sets the synthetic file input's name attribute (previously only id was set), which chrome-mink's file upload handling requires to locate the input.

Test harness

  • behat.yml: new chrome_headless profile that inherits the default profile and swaps in DMore\ChromeExtension with javascript_session: chrome pointed at http://chrome_headless:9222.
  • docker-compose.yml: new chrome_headless service running chromedp/headless-shell, exposing port 9222 for the DevTools Protocol.
  • composer.json: added the dmore/behat-chrome-extension dependency (pulls in dmore/chrome-mink-driver).
  • tests/behat/bootstrap/FeatureContextTrait.php: added matching getCookies()/setCookie() branches to the test harness's own cookie helpers so its @trait scenarios pass under both drivers.
  • tests/behat/features/keyboard.feature: updated the negative-assertion scenario title and expected exception message to reflect the new "JavaScript drivers" wording rather than "Selenium2 driver".

CI

  • .github/workflows/test.yml: added two chrome_headless matrix legs (PHP 8.3, Drupal 10 and 11, normal deps) that run the BDD suite through the new driver, with the existing unit/BDD steps guarded on matrix.driver != 'chrome_headless' so the new legs run only the driver-specific step.
  • The Drupal 11 chrome_headless leg runs with coverage (ahoy test-bdd-coverage -- -p chrome_headless) so the selenium-less branches - reachable only through chrome-mink - are measured and merged into the Codecov report alongside the Selenium2 coverage. This keeps patch coverage at 100% (a line covered by either driver counts).
  • The job name and the uploaded-artifact name both include matrix.driver, so the new legs stay distinct from the Selenium2 legs at the same PHP/Drupal/deps combination and do not collide on the immutable-artifact-name rule.
  • The existing wait_dependencies service now waits on the chrome_headless:9222 port (added to its command, with chrome_headless added to its depends_on), so the CDP endpoint is reachable by the time the chrome legs run - reusing the repo's own dependency-wait mechanism rather than a bespoke CI step.

Docs

  • README.md: new "JavaScript drivers" section documenting that @javascript steps work with both Selenium/WebDriver and selenium-less CDP drivers, with a behat.yml snippet for wiring up DMore\ChromeExtension and a note on overriding api_url for local visual debugging.

Screenshots

N/A

Before / After

BEFORE - one driver, hard instanceof checks
┌───────────────────────────────────────┐
│         @javascript scenario          │
└───────────────────────────────────────┘
                    ▼
┌───────────────────────────────────────┐
│    instanceof Selenium2Driver only    │
│     (hard-checked in every trait)     │
│  other drivers: throw / silent no-op  │
└───────────────────────────────────────┘
                    ▼
┌───────────────────────────────────────┐
│            Selenium server            │
└───────────────────────────────────────┘
                    ▼
┌───────────────────────────────────────┐
│                Chrome                 │
└───────────────────────────────────────┘

AFTER - capability checks, two profiles, one suite
┌─────────────────────────┐  ┌───────────────────────────┐
│     default profile     │  │  chrome_headless profile  │
│  (Selenium2/WebDriver)  │  │    (chrome-mink / CDP)    │
└─────────────────────────┘  └───────────────────────────┘
             ▼                             ▼
┌─────────────────────────┐  ┌───────────────────────────┐
│     Selenium server     │  │    No Selenium server     │
└─────────────────────────┘  │  (direct CDP to Chrome)   │
                             └───────────────────────────┘
             ▼                             ▼
┌─────────────────────────┐  ┌───────────────────────────┐
│         Chrome          │  │      headless Chrome      │
└─────────────────────────┘  └───────────────────────────┘

Traits use capability checks (getWebDriverSession(), getCookies(), etc.)
instead of `instanceof Selenium2Driver`, so the same suite passes both paths.
CI runs both legs; Codecov merges their coverage, so driver-specific branches
covered by only one driver still count toward 100% patch coverage.

Added selenium-less headless Chrome support for JavaScript-dependent Behat steps, including a new chrome_headless Behat profile that drives headless Chrome directly via the Chrome DevTools Protocol. Updated Docker and CI to run the suite against both the existing Selenium/WebDriver-based profile and the new CDP-based headless Chrome profile (with dedicated BDD steps for chrome_headless coverage vs non-coverage legs), and documented the new "JavaScript drivers" configuration approach. Also added the dmore/behat-chrome-extension dependency.

Driver compatibility was broadened across six updated traits and related test helpers so steps work with Selenium/WebDriver sessions and CDP/Chrome-style drivers:

  • cookie handling supports CDP-based drivers
  • file download cookie extraction is driver-agnostic (WebDriver-like, CDP/Chrome-like, and BrowserKit)
  • keyboard interactions work with JS-capable non-Selenium drivers (native key dispatch for non-Selenium drivers)
  • accessibility, responsive, and dropzone helpers were adjusted accordingly

Updated the keyboard Behat feature to align expectations with the "keyboard interaction is only supported by JavaScript drivers (Selenium2 or Chrome)" constraint.

Made the JavaScript-dependent traits driver-agnostic so '@javascript' scenarios run through 'dmore/chrome-mink-driver' over the Chrome DevTools Protocol as well as Selenium2. Added a 'chrome_headless' Behat profile and a 'chromedp/headless-shell' service, wired two CI matrix legs that run the suite through the new driver, and documented the setup.

Claude-Session: https://claude.ai/code/session_012WhCKmn7GbhNCQgfXmWqXC
@coderabbitai

coderabbitai Bot commented Jul 8, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This PR adds a headless Chrome driver path alongside Selenium2, updating CI, Docker, Behat configuration, docs, and helper traits to support CDP-based browser automation and related test flows.

Changes

Selenium-less Chrome (CDP) driver support

Layer / File(s) Summary
CI, Docker, Behat profile, and dependency setup
.github/workflows/test.yml, docker-compose.yml, behat.yml, composer.json, README.md
Adds the chrome_headless matrix leg, dedicated BDD execution, a Chrome headless service, a Behat profile for CDP Chrome, the required package dependency, and usage docs.
Cookie handling for CDP drivers
src/CookieTrait.php, src/FileDownloadTrait.php, tests/behat/bootstrap/FeatureContextTrait.php
Adds getCookies()-based branches for CDP drivers in cookie collection, cookie export, and download handling, while decoding cookie values.
Keyboard interaction for JS-capable drivers
src/KeyboardTrait.php, tests/behat/features/keyboard.feature
Updates key pressing to support JS-capable Chrome drivers, keeps Selenium2 Syn-based dispatch, adds native key event dispatch for other JS drivers, and adjusts the feature expectation text.
Driver-agnostic behavior in Responsive, Accessibility, and Dropzone traits
src/ResponsiveTrait.php, src/AccessibilityTrait.php, src/DropzoneTrait.php
Removes Selenium2-specific checks from responsive sizing, serializes accessibility results through JSON, and assigns the generated file input name in dropzone uploads.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Sequence Diagram(s)

sequenceDiagram
  participant GitHub Actions
  participant Matrix
  participant ahoy CLI
  participant chrome_headless service

  GitHub Actions->>Matrix: select matrix.driver = chrome_headless
  Matrix->>ahoy CLI: run test-bdd -p chrome_headless
  ahoy CLI->>chrome_headless service: connect via CDP api_url
  chrome_headless service-->>ahoy CLI: BDD test results
  ahoy CLI-->>GitHub Actions: report results
Loading

Possibly related PRs

Poem

I hop through Chrome with nary a cord,
CDP cookies now are stored.
Keys go tap, and tests go bright,
Headless shells run through the night.
🐰✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR implements selenium-less driver support and adds the requested Behat configuration, Composer dependency, docs, and test coverage for #205.
Out of Scope Changes check ✅ Passed The changes stay focused on enabling and documenting the new Chrome DevTools-based Behat driver and its related tests/configuration.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: adding a selenium-less headless Chrome driver for JavaScript steps.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/chrome-mink

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
composer.json (1)

19-24: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider require-dev/suggest instead of hard require for the CDP extension.

Unlike Selenium2Driver, the CDP-driver support added in this cohort detects the driver via method_exists($driver, 'getCookies') duck-typing rather than an instanceof check on a class from dmore/behat-chrome-extension/dmore/chrome-mink-driver. That means the package isn't needed at runtime by every consumer of this library — only by those opting into the chrome_headless profile. Making it a hard require forces all consumers to pull in this extra dependency tree, even projects that only use Selenium2 or BrowserKit.

♻️ Proposed fix
     "require": {
         "php": ">=8.2",
         "behat/behat": "^3.14",
         "behat/mink": ">=1.11",
-        "dmore/behat-chrome-extension": "^1.4",
         "drupal/drupal-extension": "^6.0",
         "lullabot/mink-selenium2-driver": "^1.7.4",
         "softcreatr/jsonpath": "^0.10 || ^1.0"
     },
     "require-dev": {
         "alexskrypnyk/phpunit-helpers": "^0.15.0",
+        "dmore/behat-chrome-extension": "^1.4",
         "cweagans/composer-patches": "^2.0",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@composer.json` around lines 19 - 24, Move the CDP/chrome extension dependency
out of the main package requirements in composer.json and make it optional for
consumers who use the chrome_headless profile. Update the dependency declaration
around dmore/behat-chrome-extension so it is treated as a dev/suggested
integration instead of a hard require, while keeping the rest of the Behat and
Drupal extension requirements intact. Ensure any code paths that rely on the CDP
driver remain guarded by the existing duck-typing checks in the relevant
driver/profile setup.
.github/workflows/test.yml (1)

219-227: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Codecov upload runs for the chrome_headless leg with no coverage generated.

The chrome_headless leg matching (php 8.3, drupal 11, normal) skips the coverage-producing BDD step (gated on matrix.driver != 'chrome_headless' at Lines 184-187), but this Codecov if condition doesn't exclude matrix.driver == 'chrome_headless', so the step still runs and attempts an upload with no fresh coverage data.

🛠️ Proposed fix
-        if: matrix.php_version == '8.3' && matrix.drupal_version == '11' && matrix.deps == 'normal' && env.CODECOV_TOKEN != '' && !startsWith(github.head_ref, 'deps/')
+        if: matrix.php_version == '8.3' && matrix.drupal_version == '11' && matrix.deps == 'normal' && matrix.driver != 'chrome_headless' && env.CODECOV_TOKEN != '' && !startsWith(github.head_ref, 'deps/')
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/test.yml around lines 219 - 227, The Codecov upload step
in the workflow is still running for the chrome_headless matrix leg even though
that leg skips generating coverage, so update the Upload code coverage reports
to Codecov condition to also exclude matrix.driver == 'chrome_headless'. Keep
the existing gating on php_version, drupal_version, deps, CODECOV_TOKEN, and
deps/ branches, but add the driver check so this step only runs when coverage
data was actually produced.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/test.yml:
- Around line 119-130: The artifact upload in the workflow uses a name that is
no longer unique across matrix jobs, causing collisions when `chrome_headless`
and non-driver legs share the same php_version, drupal_version, and deps values.
Update the upload logic in the test workflow to include matrix.driver in the
artifact name (or another unique matrix field) so each job path under the upload
step remains distinct and the `actions/upload-artifact@v4` step in the test job
can succeed without duplicate-name failures.

---

Outside diff comments:
In @.github/workflows/test.yml:
- Around line 219-227: The Codecov upload step in the workflow is still running
for the chrome_headless matrix leg even though that leg skips generating
coverage, so update the Upload code coverage reports to Codecov condition to
also exclude matrix.driver == 'chrome_headless'. Keep the existing gating on
php_version, drupal_version, deps, CODECOV_TOKEN, and deps/ branches, but add
the driver check so this step only runs when coverage data was actually
produced.

In `@composer.json`:
- Around line 19-24: Move the CDP/chrome extension dependency out of the main
package requirements in composer.json and make it optional for consumers who use
the chrome_headless profile. Update the dependency declaration around
dmore/behat-chrome-extension so it is treated as a dev/suggested integration
instead of a hard require, while keeping the rest of the Behat and Drupal
extension requirements intact. Ensure any code paths that rely on the CDP driver
remain guarded by the existing duck-typing checks in the relevant driver/profile
setup.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f06cf716-5181-4c3d-9fab-814690bcaac4

📥 Commits

Reviewing files that changed from the base of the PR and between 3d645bd and 3ef424e.

📒 Files selected for processing (13)
  • .github/workflows/test.yml
  • README.md
  • behat.yml
  • composer.json
  • docker-compose.yml
  • src/AccessibilityTrait.php
  • src/CookieTrait.php
  • src/DropzoneTrait.php
  • src/FileDownloadTrait.php
  • src/KeyboardTrait.php
  • src/ResponsiveTrait.php
  • tests/behat/bootstrap/FeatureContextTrait.php
  • tests/behat/features/keyboard.feature
💤 Files with no reviewable changes (1)
  • src/ResponsiveTrait.php

Comment thread .github/workflows/test.yml
@codecov

codecov Bot commented Jul 8, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.29%. Comparing base (3d645bd) to head (07cec06).

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #689      +/-   ##
==========================================
+ Coverage   97.27%   97.29%   +0.02%     
==========================================
  Files          52       52              
  Lines        4404     4439      +35     
==========================================
+ Hits         4284     4319      +35     
  Misses        120      120              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/test.yml (1)

219-227: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Exclude chrome_headless from the Codecov upload step .github/workflows/test.yml:219-227
This leg skips the coverage-producing steps, so directory: .logs/coverage will be empty there. Add the same matrix.driver != 'chrome_headless' guard to avoid a no-files Codecov run.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/test.yml around lines 219 - 227, The Codecov upload step
in the workflow is still eligible for the chrome_headless matrix leg even though
that leg does not produce coverage files, so the upload runs on an empty
directory. Update the existing conditional on the Upload code coverage reports
to Codecov step to also exclude matrix.driver == 'chrome_headless', alongside
the current php_version, drupal_version, deps, token, and branch checks, so the
step only runs when .logs/coverage actually exists.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In @.github/workflows/test.yml:
- Around line 219-227: The Codecov upload step in the workflow is still eligible
for the chrome_headless matrix leg even though that leg does not produce
coverage files, so the upload runs on an empty directory. Update the existing
conditional on the Upload code coverage reports to Codecov step to also exclude
matrix.driver == 'chrome_headless', alongside the current php_version,
drupal_version, deps, token, and branch checks, so the step only runs when
.logs/coverage actually exists.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 252bd05e-089f-4739-ad18-dbd6b9cad6d7

📥 Commits

Reviewing files that changed from the base of the PR and between 3ef424e and 65b9209.

📒 Files selected for processing (1)
  • .github/workflows/test.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/test.yml:
- Around line 194-207: The chrome_headless BDD jobs can start before the CDP
endpoint is actually ready, since depends_on only waits for the container to
launch. Add a small readiness check with retries before the two chrome_headless
workflow steps so the jobs wait for http://chrome_headless:9222/json/version to
respond before running ahoy test-bdd-coverage or ahoy test-bdd. Keep the change
scoped to the chrome_headless matrix conditions in the workflow.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: beceb0c4-2dbd-4c2f-82ec-527573c6421b

📥 Commits

Reviewing files that changed from the base of the PR and between 65b9209 and fcb526d.

📒 Files selected for processing (1)
  • .github/workflows/test.yml

Comment thread .github/workflows/test.yml

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/test.yml (1)

174-224: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Repeated condition clauses across steps are a maintainability risk.

The matrix.driver != 'chrome_headless' && matrix.php_version == '8.3' && matrix.drupal_version == '11' && matrix.deps == 'normal' combination (and its negation) is duplicated across 4 if: conditions (Lines 175, 180, 185, 190), plus a similar combination reappears at Line 246 for the Codecov step. A drift between any of these copies (e.g. updating one php/drupal/deps target but not the others) would silently break coverage selection without failing CI.

Consider computing a single step output (e.g. is_coverage_leg) earlier in the job and referencing it in each subsequent if:, reducing the risk of inconsistent copies.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/test.yml around lines 174 - 224, The workflow repeats the
same coverage-leg condition in multiple if: clauses, which makes it easy for
them to drift. Add a single computed step output or job env flag (for example, a
coverage-leg boolean) before the test steps, then reference that shared value in
Run Unit tests with coverage, Run Unit tests, Run BDD tests with coverage, Run
BDD tests, and the Codecov step so the php_version/drupal_version/deps logic
lives in one place.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In @.github/workflows/test.yml:
- Around line 174-224: The workflow repeats the same coverage-leg condition in
multiple if: clauses, which makes it easy for them to drift. Add a single
computed step output or job env flag (for example, a coverage-leg boolean)
before the test steps, then reference that shared value in Run Unit tests with
coverage, Run Unit tests, Run BDD tests with coverage, Run BDD tests, and the
Codecov step so the php_version/drupal_version/deps logic lives in one place.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 28adc8cc-7662-494b-8eff-caa55d81f37c

📥 Commits

Reviewing files that changed from the base of the PR and between fcb526d and 9161afa.

📒 Files selected for processing (1)
  • .github/workflows/test.yml

@AlexSkrypnyk AlexSkrypnyk added the Needs review Pull request needs a review from assigned developers label Jul 9, 2026
@AlexSkrypnyk AlexSkrypnyk merged commit fd2f627 into main Jul 9, 2026
16 checks passed
@AlexSkrypnyk AlexSkrypnyk deleted the feature/chrome-mink branch July 9, 2026 03:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Needs review Pull request needs a review from assigned developers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for selenium-less drivers and add tests

1 participant