Skip to content

[rb] fix using environment variables to set drivers#17571

Open
titusfortner wants to merge 2 commits into
trunkfrom
sm-safari
Open

[rb] fix using environment variables to set drivers#17571
titusfortner wants to merge 2 commits into
trunkfrom
sm-safari

Conversation

@titusfortner
Copy link
Copy Markdown
Member

🔗 Related Issues

the current implementation doesn't apply to the typical use case
Unless a user is attempting to start the driver service before initializing the driver, the environment variable won't be used

💥 What does this PR do?

Builds on #17564 to put the environment variable check where the service class check is in the DriverFinder

🤖 AI assistance

  • No substantial AI assistance used
  • AI assisted (complete below)
    • Tool(s):
    • What was generated:
    • I reviewed all AI output and can explain the change

💡 Additional Considerations

🔄 Types of changes

  • Bug fix (backwards compatible)

@selenium-ci selenium-ci added the C-rb Ruby Bindings label May 25, 2026
@qodo-code-review
Copy link
Copy Markdown
Contributor

Review Summary by Qodo

Fix environment variables in driver path resolution

🐞 Bug fix

Grey Divider

Walkthroughs

Description
• Move environment variable check to DriverFinder for consistent resolution
• Remove redundant env_path calls from Service initialization
• Ensure environment variables apply in typical driver usage patterns
• Refactor path resolution order: service path, env vars, then class path
Diagram
flowchart LR
  A["Service.initialize"] -->|removed env_path| B["Service.launch"]
  B -->|calls DriverFinder| C["DriverFinder.paths"]
  C -->|checks in order| D["service.executable_path"]
  D -->|or| E["env_path"]
  E -->|or| F["class_path"]
  F -->|returns| G["driver executable"]

Loading

File Changes

1. rb/lib/selenium/webdriver/common/driver_finder.rb 🐞 Bug fix +6/-2

Add environment variable check to path resolution

• Refactored path resolution to check environment variables before class path
• Renamed resolve_class_path to class_path for clarity
• Added new env_path method to fetch driver path from environment variables
• Updated resolution order: service executable, env vars, then class path

rb/lib/selenium/webdriver/common/driver_finder.rb


2. rb/lib/selenium/webdriver/common/service.rb 🐞 Bug fix +1/-6

Remove environment variable handling from Service

• Removed env_path call from Service.initialize method
• Removed env_path call from Service.launch method
• Removed env_path private method definition
• Delegated all path resolution to DriverFinder

rb/lib/selenium/webdriver/common/service.rb


3. rb/sig/lib/selenium/webdriver/common/driver_finder.rbs 📝 Documentation +3/-1

Update type signatures for refactored methods

• Renamed method signature from resolve_class_path to class_path
• Added new env_path method signature
• Updated type hints to reflect new method structure

rb/sig/lib/selenium/webdriver/common/driver_finder.rbs


Grey Divider

Qodo Logo

@qodo-code-review
Copy link
Copy Markdown
Contributor

qodo-code-review Bot commented May 25, 2026

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (4)

Grey Divider


Action required

1. Missing Safari::Options#browser_name= 📘 Rule violation ≡ Correctness ⭐ New
Description
Defining Safari::Options#browser_name prevents the base Options.set_capabilities from generating
the standard browser_name= writer, breaking API compatibility for consumers who set W3C
capabilities via the normal setter. It also forces a computed value on every read, making overrides
impossible and potentially changing downstream capability payloads.
Code

rb/lib/selenium/webdriver/safari/options.rb[R39-40]

Evidence
In Safari::Options, def browser_name is newly defined, which causes the base
Options.set_capabilities to skip defining the browser_name getter/setter pair (it uses `next if
method_defined? key). This breaks API compatibility by removing browser_name=` specifically for
Safari options.

AGENTS.md: Maintain API/ABI compatibility (no breaking changes without explicit instruction)
rb/lib/selenium/webdriver/safari/options.rb[39-41]
rb/lib/selenium/webdriver/common/options.rb[54-66]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`Safari::Options` now defines a custom `browser_name` method, which prevents `Selenium::WebDriver::Options.set_capabilities` from generating the normal `browser_name=` writer. This is a backward-incompatible API change and also makes it impossible for callers to override `browser_name`.

## Issue Context
`Options.set_capabilities` only defines both getter and setter when the getter method is not already defined. Because `Safari::Options` defines `browser_name`, the pair is skipped.

## Fix Focus Areas
- rb/lib/selenium/webdriver/safari/options.rb[39-41]
- rb/lib/selenium/webdriver/common/options.rb[54-66]

## Suggested approach
- Prefer restoring the prior pattern: remove the `browser_name` override and instead override `as_json` (or another serialization hook) to set `@options[:browser_name]` based on `Safari.technology_preview?` right before serialization; this keeps the standard accessor pair (`browser_name` and `browser_name=`) available.
- If keeping `browser_name` is required, explicitly add a compatible `browser_name=` writer and ensure `browser_name` does not overwrite user-provided values unintentionally.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Safari.path now nil 📘 Rule violation ≡ Correctness ⭐ New
Description
Selenium::WebDriver::Safari.path now defaults to nil, removing the previous behavior of
providing/validating a default Safari binary path and raising actionable errors. This is a
user-visible behavior change that can break callers relying on a non-nil default or on the earlier
deterministic exceptions.
Code

rb/lib/selenium/webdriver/safari.rb[49]

Evidence
The updated implementation of Safari.path explicitly memoizes nil (@path ||= nil), which
changes the method’s default return value/behavior in a user-visible way and can break existing
consumers that relied on a default path or early validation.

AGENTS.md: Maintain API/ABI compatibility (no breaking changes without explicit instruction)
rb/lib/selenium/webdriver/safari.rb[48-50]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`Safari.path` now memoizes `nil`, changing the public method’s behavior so it no longer provides a default Safari path nor performs early validation/OS checks. This is a backward-incompatible, user-visible behavior change.

## Issue Context
`Safari.path` is a public singleton method. With the new implementation, any caller expecting a default path (or early, actionable errors) will instead receive `nil` and may fail later with less clear errors.

## Fix Focus Areas
- rb/lib/selenium/webdriver/safari.rb[48-50]

## Suggested approach
- Reintroduce the previous default path and validation/error behavior (e.g., default to the Safari binary on macOS and raise a clear `WebDriverError` when unsupported/unavailable).
- If the new `nil` default is intentional, add a deprecation path and update callers/documentation accordingly so upgrades do not silently change behavior.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Safari TP browserName not set 🐞 Bug ≡ Correctness ⭐ New
Description
Safari::Options#browser_name now mutates @options[:browser_name], but the driver creation path
serializes capabilities via options.as_json without ever calling browser_name, so browserName
remains the initialize default 'safari' even when Safari.technology_preview! is enabled. This
breaks the Safari Technology Preview flow that expects browser_name to be `'Safari Technology
Preview'` when the flag is set before or after options are created.
Code

rb/lib/selenium/webdriver/safari/options.rb[R39-40]

Evidence
Safari::Options now sets browserName only inside browser_name, but local driver initialization
calls options.as_json directly; WebDriver::Options#as_json reads from @options without calling
browser_name, while the integration spec expects Safari Technology Preview to be applied even if
the flag is set after Options.safari is created.

rb/lib/selenium/webdriver/safari/options.rb[26-41]
rb/lib/selenium/webdriver/common/local_driver.rb[43-56]
rb/lib/selenium/webdriver/common/options.rb[71-78]
rb/lib/selenium/webdriver/common/options.rb[116-134]
rb/spec/integration/selenium/webdriver/safari/driver_spec.rb[40-51]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`Safari::Options#browser_name` updates `@options[:browser_name]`, but the code path that builds capabilities for a local driver uses `options.as_json` and does not call `browser_name`. As a result, enabling `Safari.technology_preview!` does not change the serialized W3C `browserName` from `'safari'` to `'Safari Technology Preview'`.

## Issue Context
`WebDriver::Options#as_json` serializes from a dup of `@options` and does not invoke getters, so any logic placed only in `Safari::Options#browser_name` is skipped unless called explicitly.

## Fix Focus Areas
- rb/lib/selenium/webdriver/safari/options.rb[29-41]

## Suggested fix
Add/restore a Safari::Options `as_json` override that ensures the `browser_name` logic runs before calling `super`, e.g.:

```ruby
def as_json(*)
 browser_name # ensures @options[:browser_name] reflects technology_preview?
 super
end
```

(Alternatively, set `@options[:browser_name]` in a hook that is guaranteed to run before serialization, but `as_json` is the minimal, spec-aligned place given existing driver initialization flow.)

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


View more (2)
4. Service#env_path removed 📘 Rule violation ≡ Correctness
Description
Selenium::WebDriver::Service#env_path was removed without a deprecation path, which is a breaking
change for callers and leaves the RBI/RBS contract inconsistent with the runtime implementation.
This can trigger runtime NoMethodError for existing consumers and also break RBS/Steep validation
during upgrades.
Code

rb/lib/selenium/webdriver/common/service.rb[L99-102]

Evidence
Compliance requires preserving public APIs and deprecating them before removal, yet the current
Service implementation no longer defines env_path while the public RBS signature still declares
def env_path. This mismatch between rb/lib/.../service.rb and rb/sig/.../service.rbs
demonstrates that the method was deleted from runtime code but remains part of the declared public
interface, causing both runtime failures for callers and signature/type-checking errors.

AGENTS.md: Maintain API/ABI compatibility for public functionality
AGENTS.md: Deprecate public functionality before removal, including guidance to alternatives
rb/lib/selenium/webdriver/common/service.rb[89-103]
rb/sig/lib/selenium/webdriver/common/service.rbs[48-56]
rb/sig/lib/selenium/webdriver/common/service.rbs[48-60]
rb/lib/selenium/webdriver/common/service.rb[89-105]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`Selenium::WebDriver::Service#env_path` was removed from the Ruby implementation without a deprecation path, but the corresponding RBS signature still declares it, creating an API break for callers and leaving the type/signature contract out of sync with runtime behavior.

## Issue Context
- The Ruby signature file still exposes `env_path` as a public method (`def env_path`).
- The `Service` implementation no longer defines `env_path`, so existing callers will hit `NoMethodError` at runtime.
- The mismatch will also fail RBS/Steep (or other signature validation) because the method is declared but not implemented.
- Compliance requires maintaining API compatibility and deprecating public functionality before removal.

## Fix Focus Areas
- rb/lib/selenium/webdriver/common/service.rb[89-105]
- rb/sig/lib/selenium/webdriver/common/service.rbs[48-60]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Env var Service init regression 🐞 Bug ≡ Correctness
Description
Service#initialize no longer applies the DRIVER_PATH_ENV_KEY environment variable, but existing unit
specs expect Service.new.executable_path to reflect that env var immediately. This will fail
multiple unit tests and is a behavioral break for any caller reading executable_path before
DriverFinder/launch runs.
Code

rb/lib/selenium/webdriver/common/service.rb[72]

Evidence
Service now only assigns the passed path to @executable_path, while unit specs explicitly set
ENV['SE_*DRIVER'] and expect service.executable_path to match the driver name immediately after
construction.

rb/lib/selenium/webdriver/common/service.rb[69-87]
rb/spec/unit/selenium/webdriver/chrome/service_spec.rb[153-165]
rb/spec/unit/selenium/webdriver/safari/service_spec.rb[118-130]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`Service#initialize` no longer reads the driver-path environment variable (e.g., `SE_CHROMEDRIVER`) to populate `@executable_path`. The repo’s unit specs currently assert that `Service.new.executable_path` is derived from the env var, so the change will cause test failures and breaks the previously-tested behavior.

## Issue Context
The env-var lookup was removed from `Service#initialize` and moved into `DriverFinder`. That makes env vars apply later (when DriverFinder runs), but it also means `service.executable_path` stays `nil` after construction.

## Fix Focus Areas
Choose one consistent behavior and align code + tests:

- **Preserve existing behavior (least breaking):** make `Service#executable_path` (reader) fall back to ENV when `@executable_path` is nil (or re-introduce env assignment in `initialize`).
- **If behavior change is intended:** update the affected unit specs to assert env usage via `DriverFinder` or `Service#launch`, not via `Service#executable_path` immediately after `new`.

Relevant locations:
- rb/lib/selenium/webdriver/common/service.rb[69-92]
- rb/spec/unit/selenium/webdriver/chrome/service_spec.rb[153-173]
- rb/spec/unit/selenium/webdriver/safari/service_spec.rb[118-138]
- rb/spec/unit/selenium/webdriver/edge/service_spec.rb[163-183]
- rb/spec/unit/selenium/webdriver/firefox/service_spec.rb[215-236]
- rb/spec/unit/selenium/webdriver/ie/service_spec.rb[153-173]
- rb/spec/unit/selenium/webdriver/common/driver_finder_spec.rb[22-99]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

6. No test for env_path 📘 Rule violation ☼ Reliability
Description
The new behavior that prioritizes the driver environment variable in DriverFinder#paths is not
covered by unit tests. This risks regressions and CI behavior differences across environments.
Code

rb/lib/selenium/webdriver/common/driver_finder.rb[R50-55]

Evidence
ID 12 requires updating/extending unit tests when production behavior changes. The driver resolution
logic now includes env_path, but the existing DriverFinder unit tests do not cover any
environment-variable-driven resolution path.

rb/lib/selenium/webdriver/common/driver_finder.rb[50-68]
rb/spec/unit/selenium/webdriver/common/driver_finder_spec.rb[24-99]
Best Practice: Learned patterns

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`DriverFinder` now checks an environment variable (`DRIVER_PATH_ENV_KEY`) when resolving the driver path, but there is no unit test asserting this precedence and behavior.

## Issue Context
There are existing unit tests for `DriverFinder` behavior (class path, proc path, Selenium Manager calls), so adding a small/unit test for ENV precedence is feasible and keeps tests aligned with the changed behavior.

## Fix Focus Areas
- rb/lib/selenium/webdriver/common/driver_finder.rb[50-68]
- rb/spec/unit/selenium/webdriver/common/driver_finder_spec.rb[24-99]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


7. Misleading log for env path 🐞 Bug ◔ Observability
Description
When the driver path comes from an environment variable, DriverFinder routes through
paths_from_service and logs that the path was "specified in service class", which is inaccurate.
This can mislead debugging/telemetry when env vars are used.
Code

rb/lib/selenium/webdriver/common/driver_finder.rb[52]

Evidence
env_path is now part of the resolution chain and any non-nil value flows into
paths_from_service, which emits a "specified in service class" message even when the source is
ENV.

rb/lib/selenium/webdriver/common/driver_finder.rb[50-75]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`DriverFinder#paths` now checks `env_path` before `class_path`, but it still calls `paths_from_service` for any explicit path. `paths_from_service` logs that the path was specified in the service class, which becomes misleading when the path actually came from ENV.

## Issue Context
This impacts only debug output but makes it harder to understand how the driver path was resolved.

## Fix Focus Areas
- Update logging to distinguish sources (e.g., ENV vs service instance vs class driver_path), or pass a "source" argument into `paths_from_service`.

- rb/lib/selenium/webdriver/common/driver_finder.rb[50-75]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Previous review results

Review updated until commit afac4b5

Results up to commit ab591c4


🐞 Bugs (2) 📘 Rule violations (2) 📎 Requirement gaps (0)


Action required
1. Service#env_path removed 📘 Rule violation ≡ Correctness
Description
Selenium::WebDriver::Service#env_path was removed without a deprecation path, which is a breaking
change for callers and leaves the RBI/RBS contract inconsistent with the runtime implementation.
This can trigger runtime NoMethodError for existing consumers and also break RBS/Steep validation
during upgrades.
Code

rb/lib/selenium/webdriver/common/service.rb[L99-102]

Evidence
Compliance requires preserving public APIs and deprecating them before removal, yet the current
Service implementation no longer defines env_path while the public RBS signature still declares
def env_path. This mismatch between rb/lib/.../service.rb and rb/sig/.../service.rbs
demonstrates that the method was deleted from runtime code but remains part of the declared public
interface, causing both runtime failures for callers and signature/type-checking errors.

AGENTS.md: Maintain API/ABI compatibility for public functionality
AGENTS.md: Deprecate public functionality before removal, including guidance to alternatives
rb/lib/selenium/webdriver/common/service.rb[89-103]
rb/sig/lib/selenium/webdriver/common/service.rbs[48-56]
rb/sig/lib/selenium/webdriver/common/service.rbs[48-60]
rb/lib/selenium/webdriver/common/service.rb[89-105]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`Selenium::WebDriver::Service#env_path` was removed from the Ruby implementation without a deprecation path, but the corresponding RBS signature still declares it, creating an API break for callers and leaving the type/signature contract out of sync with runtime behavior.

## Issue Context
- The Ruby signature file still exposes `env_path` as a public method (`def env_path`).
- The `Service` implementation no longer defines `env_path`, so existing callers will hit `NoMethodError` at runtime.
- The mismatch will also fail RBS/Steep (or other signature validation) because the method is declared but not implemented.
- Compliance requires maintaining API compatibility and deprecating public functionality before removal.

## Fix Focus Areas
- rb/lib/selenium/webdriver/common/service.rb[89-105]
- rb/sig/lib/selenium/webdriver/common/service.rbs[48-60]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Env var Service init regression 🐞 Bug ≡ Correctness
Description
Service#initialize no longer applies the DRIVER_PATH_ENV_KEY environment variable, but existing unit
specs expect Service.new.executable_path to reflect that env var immediately. This will fail
multiple unit tests and is a behavioral break for any caller reading executable_path before
DriverFinder/launch runs.
Code

rb/lib/selenium/webdriver/common/service.rb[72]

Evidence
Service now only assigns the passed path to @executable_path, while unit specs explicitly set
ENV['SE_*DRIVER'] and expect service.executable_path to match the driver name immediately after
construction.

rb/lib/selenium/webdriver/common/service.rb[69-87]
rb/spec/unit/selenium/webdriver/chrome/service_spec.rb[153-165]
rb/spec/unit/selenium/webdriver/safari/service_spec.rb[118-130]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`Service#initialize` no longer reads the driver-path environment variable (e.g., `SE_CHROMEDRIVER`) to populate `@executable_path`. The repo’s unit specs currently assert that `Service.new.executable_path` is derived from the env var, so the change will cause test failures and breaks the previously-tested behavior.

## Issue Context
The env-var lookup was removed from `Service#initialize` and moved into `DriverFinder`. That makes env vars apply later (when DriverFinder runs), but it also means `service.executable_path` stays `nil` after construction.

## Fix Focus Areas
Choose one consistent behavior and align code + tests:

- **Preserve existing behavior (least breaking):** make `Service#executable_path` (reader) fall back to ENV when `@executable_path` is nil (or re-introduce env assignment in `initialize`).
- **If behavior change is intended:** update the affected unit specs to assert env usage via `DriverFinder` or `Service#launch`, not via `Service#executable_path` immediately after `new`.

Relevant locations:
- rb/lib/selenium/webdriver/common/service.rb[69-92]
- rb/spec/unit/selenium/webdriver/chrome/service_spec.rb[153-173]
- rb/spec/unit/selenium/webdriver/safari/service_spec.rb[118-138]
- rb/spec/unit/selenium/webdriver/edge/service_spec.rb[163-183]
- rb/spec/unit/selenium/webdriver/firefox/service_spec.rb[215-236]
- rb/spec/unit/selenium/webdriver/ie/service_spec.rb[153-173]
- rb/spec/unit/selenium/webdriver/common/driver_finder_spec.rb[22-99]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended
3. No test for env_path 📘 Rule violation ☼ Reliability
Description
The new behavior that prioritizes the driver environment variable in DriverFinder#paths is not
covered by unit tests. This risks regressions and CI behavior differences across environments.
Code

rb/lib/selenium/webdriver/common/driver_finder.rb[R50-55]

Evidence
ID 12 requires updating/extending unit tests when production behavior changes. The driver resolution
logic now includes env_path, but the existing DriverFinder unit tests do not cover any
environment-variable-driven resolution path.

rb/lib/selenium/webdriver/common/driver_finder.rb[50-68]
rb/spec/unit/selenium/webdriver/common/driver_finder_spec.rb[24-99]
Best Practice: Learned patterns

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`DriverFinder` now checks an environment variable (`DRIVER_PATH_ENV_KEY`) when resolving the driver path, but there is no unit test asserting this precedence and behavior.

## Issue Context
There are existing unit tests for `DriverFinder` behavior (class path, proc path, Selenium Manager calls), so adding a small/unit test for ENV precedence is feasible and keeps tests aligned with the changed behavior.

## Fix Focus Areas
- rb/lib/selenium/webdriver/common/driver_finder.rb[50-68]
- rb/spec/unit/selenium/webdriver/common/driver_finder_spec.rb[24-99]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Misleading log for env path 🐞 Bug ◔ Observability
Description
When the driver path comes from an environment variable, DriverFinder routes through
paths_from_service and logs that the path was "specified in service class", which is inaccurate.
This can mislead debugging/telemetry when env vars are used.
Code

rb/lib/selenium/webdriver/common/driver_finder.rb[52]

Evidence
env_path is now part of the resolution chain and any non-nil value flows into
paths_from_service, which emits a "specified in service class" message even when the source is
ENV.

rb/lib/selenium/webdriver/common/driver_finder.rb[50-75]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`DriverFinder#paths` now checks `env_path` before `class_path`, but it still calls `paths_from_service` for any explicit path. `paths_from_service` logs that the path was specified in the service class, which becomes misleading when the path actually came from ENV.

## Issue Context
This impacts only debug output but makes it harder to understand how the driver path was resolved.

## Fix Focus Areas
- Update logging to distinguish sources (e.g., ENV vs service instance vs class driver_path), or pass a "source" argument into `paths_from_service`.

- rb/lib/selenium/webdriver/common/driver_finder.rb[50-75]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Qodo Logo

def initialize(path: nil, port: nil, log: nil, args: nil)
port ||= self.class::DEFAULT_PORT
args ||= []
path ||= env_path
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Action required

2. Env var service init regression 🐞 Bug ≡ Correctness

Service#initialize no longer applies the DRIVER_PATH_ENV_KEY environment variable, but existing unit
specs expect Service.new.executable_path to reflect that env var immediately. This will fail
multiple unit tests and is a behavioral break for any caller reading executable_path before
DriverFinder/launch runs.
Agent Prompt
## Issue description
`Service#initialize` no longer reads the driver-path environment variable (e.g., `SE_CHROMEDRIVER`) to populate `@executable_path`. The repo’s unit specs currently assert that `Service.new.executable_path` is derived from the env var, so the change will cause test failures and breaks the previously-tested behavior.

## Issue Context
The env-var lookup was removed from `Service#initialize` and moved into `DriverFinder`. That makes env vars apply later (when DriverFinder runs), but it also means `service.executable_path` stays `nil` after construction.

## Fix Focus Areas
Choose one consistent behavior and align code + tests:

- **Preserve existing behavior (least breaking):** make `Service#executable_path` (reader) fall back to ENV when `@executable_path` is nil (or re-introduce env assignment in `initialize`).
- **If behavior change is intended:** update the affected unit specs to assert env usage via `DriverFinder` or `Service#launch`, not via `Service#executable_path` immediately after `new`.

Relevant locations:
- rb/lib/selenium/webdriver/common/service.rb[69-92]
- rb/spec/unit/selenium/webdriver/chrome/service_spec.rb[153-173]
- rb/spec/unit/selenium/webdriver/safari/service_spec.rb[118-138]
- rb/spec/unit/selenium/webdriver/edge/service_spec.rb[163-183]
- rb/spec/unit/selenium/webdriver/firefox/service_spec.rb[215-236]
- rb/spec/unit/selenium/webdriver/ie/service_spec.rb[153-173]
- rb/spec/unit/selenium/webdriver/common/driver_finder_spec.rb[22-99]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

self.class::SHUTDOWN_SUPPORTED
end

def env_path
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Action required

1. service#env_path removed 📘 Rule violation ≡ Correctness

Selenium::WebDriver::Service#env_path was removed without a deprecation path, which is a breaking
change for callers and leaves the RBI/RBS contract inconsistent with the runtime implementation.
This can trigger runtime NoMethodError for existing consumers and also break RBS/Steep validation
during upgrades.
Agent Prompt
## Issue description
`Selenium::WebDriver::Service#env_path` was removed from the Ruby implementation without a deprecation path, but the corresponding RBS signature still declares it, creating an API break for callers and leaving the type/signature contract out of sync with runtime behavior.

## Issue Context
- The Ruby signature file still exposes `env_path` as a public method (`def env_path`).
- The `Service` implementation no longer defines `env_path`, so existing callers will hit `NoMethodError` at runtime.
- The mismatch will also fail RBS/Steep (or other signature validation) because the method is declared but not implemented.
- Compliance requires maintaining API compatibility and deprecating public functionality before removal.

## Fix Focus Areas
- rb/lib/selenium/webdriver/common/service.rb[89-105]
- rb/sig/lib/selenium/webdriver/common/service.rbs[48-60]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-code-review
Copy link
Copy Markdown
Contributor

qodo-code-review Bot commented May 25, 2026

Persistent review updated to latest commit afac4b5

Comment on lines +39 to +40
def browser_name
@options[:browser_name] = Safari.technology_preview? ? TECHNOLOGY_PREVIEW : BROWSER
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Action required

1. Missing safari::options#browser_name= 📘 Rule violation ≡ Correctness

Defining Safari::Options#browser_name prevents the base Options.set_capabilities from generating
the standard browser_name= writer, breaking API compatibility for consumers who set W3C
capabilities via the normal setter. It also forces a computed value on every read, making overrides
impossible and potentially changing downstream capability payloads.
Agent Prompt
## Issue description
`Safari::Options` now defines a custom `browser_name` method, which prevents `Selenium::WebDriver::Options.set_capabilities` from generating the normal `browser_name=` writer. This is a backward-incompatible API change and also makes it impossible for callers to override `browser_name`.

## Issue Context
`Options.set_capabilities` only defines both getter and setter when the getter method is not already defined. Because `Safari::Options` defines `browser_name`, the pair is skipped.

## Fix Focus Areas
- rb/lib/selenium/webdriver/safari/options.rb[39-41]
- rb/lib/selenium/webdriver/common/options.rb[54-66]

## Suggested approach
- Prefer restoring the prior pattern: remove the `browser_name` override and instead override `as_json` (or another serialization hook) to set `@options[:browser_name]` based on `Safari.technology_preview?` right before serialization; this keeps the standard accessor pair (`browser_name` and `browser_name=`) available.
- If keeping `browser_name` is required, explicitly add a compatible `browser_name=` writer and ensure `browser_name` does not overwrite user-provided values unintentionally.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

raise Error::WebDriverError, 'Safari is only supported on Mac' unless Platform.os.mac?

raise Error::WebDriverError, 'Unable to find Safari'
@path ||= nil
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Action required

2. safari.path now nil 📘 Rule violation ≡ Correctness

Selenium::WebDriver::Safari.path now defaults to nil, removing the previous behavior of
providing/validating a default Safari binary path and raising actionable errors. This is a
user-visible behavior change that can break callers relying on a non-nil default or on the earlier
deterministic exceptions.
Agent Prompt
## Issue description
`Safari.path` now memoizes `nil`, changing the public method’s behavior so it no longer provides a default Safari path nor performs early validation/OS checks. This is a backward-incompatible, user-visible behavior change.

## Issue Context
`Safari.path` is a public singleton method. With the new implementation, any caller expecting a default path (or early, actionable errors) will instead receive `nil` and may fail later with less clear errors.

## Fix Focus Areas
- rb/lib/selenium/webdriver/safari.rb[48-50]

## Suggested approach
- Reintroduce the previous default path and validation/error behavior (e.g., default to the Safari binary on macOS and raise a clear `WebDriverError` when unsupported/unavailable).
- If the new `nil` default is intentional, add a deprecation path and update callers/documentation accordingly so upgrades do not silently change behavior.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +39 to +40
def browser_name
@options[:browser_name] = Safari.technology_preview? ? TECHNOLOGY_PREVIEW : BROWSER
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Action required

3. Safari tp browsername not set 🐞 Bug ≡ Correctness

Safari::Options#browser_name now mutates @options[:browser_name], but the driver creation path
serializes capabilities via options.as_json without ever calling browser_name, so browserName
remains the initialize default 'safari' even when Safari.technology_preview! is enabled. This
breaks the Safari Technology Preview flow that expects browser_name to be `'Safari Technology
Preview'` when the flag is set before or after options are created.
Agent Prompt
## Issue description
`Safari::Options#browser_name` updates `@options[:browser_name]`, but the code path that builds capabilities for a local driver uses `options.as_json` and does not call `browser_name`. As a result, enabling `Safari.technology_preview!` does not change the serialized W3C `browserName` from `'safari'` to `'Safari Technology Preview'`.

## Issue Context
`WebDriver::Options#as_json` serializes from a dup of `@options` and does not invoke getters, so any logic placed only in `Safari::Options#browser_name` is skipped unless called explicitly.

## Fix Focus Areas
- rb/lib/selenium/webdriver/safari/options.rb[29-41]

## Suggested fix
Add/restore a Safari::Options `as_json` override that ensures the `browser_name` logic runs before calling `super`, e.g.:

```ruby
def as_json(*)
  browser_name # ensures @options[:browser_name] reflects technology_preview?
  super
end
```

(Alternatively, set `@options[:browser_name]` in a hook that is guaranteed to run before serialization, but `as_json` is the minimal, spec-aligned place given existing driver initialization flow.)

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@qodo-code-review
Copy link
Copy Markdown
Contributor

qodo-code-review Bot commented May 25, 2026

CI Feedback 🧐

(Feedback updated until commit afac4b5)

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Ruby / Unit Tests (4.0.4, ubuntu) / Unit Tests (4.0.4, ubuntu)

Failed stage: Run Bazel [❌]

Failed test name: Selenium::WebDriver::Chrome::Service when initializing driver with a path env variable uses the path from the environment

Failure summary:

The GitHub Action failed because Bazel/RSpec unit tests in the Ruby bindings failed (exit code 3),
not because of cache or disk space (117GB available).

The failures are concentrated in the Selenium::WebDriver::*::Service specs and indicate that service
configuration is not respecting environment/path/arg expectations:
-
Selenium::WebDriver::Chrome::Service spec failures:
-
./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:58: service.extra_args was expected to be
empty, but contained ["--verbose"].
- ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:77:
service.args was expected to be ["--log-path=/path/to/log.txt"], but included an unexpected
--verbose.
- ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:83: provided args
["--foo","--bar"] were unexpectedly appended with --verbose.
-
./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:164: service.executable_path was nil
instead of matching /chromedriver/ (env var path not being picked up).
-
Selenium::WebDriver::Edge::Service spec failures:
-
./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:57, :76, :82: unexpected --verbose present in
args.
- ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:174: service.executable_path was
nil instead of matching /edgedriver/.
- Selenium::WebDriver::IE::Service spec failures:
-
./rb/spec/unit/selenium/webdriver/ie/service_spec.rb:56 and :80: unexpected --log-level=DEBUG
present in extra_args/provided args.
- ./rb/spec/unit/selenium/webdriver/ie/service_spec.rb:164:
service.executable_path was nil instead of matching /IEDriver/.
-
Selenium::WebDriver::Firefox::Service and Safari::Service path env var tests also failed because
service.executable_path was nil instead of matching /geckodriver/ and /safaridriver/
(./rb/spec/unit/selenium/webdriver/firefox/service_spec.rb:226,
./rb/spec/unit/selenium/webdriver/safari/service_spec.rb:129).

Logs show SE_DEBUG is set and Selenium warns it is overriding driver logging settings; these
overrides (adding --verbose / --log-level=DEBUG) appear to be applied even in cases where the tests
expect default/explicit args only, and executable path resolution from the environment is not
happening (returning nil).

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

498:  Cache hit for: setup-bazel-2-linux-x64-external-yq.bzl++yq+yq_linux_amd64-6cf071859ab8d36160da3b8852ab14c16cb2d4555444ce994025cbca142923b5
499:  Received 4565112 of 4565112 (100.0%), 29.2 MBs/sec
500:  Cache Size: ~4 MB (4565112 B)
501:  Received 4434790 of 4434790 (100.0%), 49.8 MBs/sec
502:  Cache Size: ~4 MB (4434790 B)
503:  [command]/usr/bin/tar -xf /home/runner/work/_temp/2d3d32eb-9221-49d4-9aec-f96ae1cecdff/cache.tzst -P -C /home/runner/work/selenium/selenium --use-compress-program unzstd
504:  [command]/usr/bin/tar -xf /home/runner/work/_temp/7b10bdad-80db-4feb-aea3-a90992d35604/cache.tzst -P -C /home/runner/work/selenium/selenium --use-compress-program unzstd
505:  Cache restored successfully
506:  Successfully restored cache from setup-bazel-2-linux-x64-external-aspect_bazel_lib++toolchains+coreutils_linux_amd64-6cf071859ab8d36160da3b8852ab14c16cb2d4555444ce994025cbca142923b5
507:  ##[endgroup]
508:  Cache restored successfully
509:  Successfully restored cache from setup-bazel-2-linux-x64-external-yq.bzl++yq+yq_linux_amd64-6cf071859ab8d36160da3b8852ab14c16cb2d4555444ce994025cbca142923b5
510:  ##[endgroup]
511:  ##[group]Run if [[ "success" == "failure" ]]; then
512:  �[36;1mif [[ "success" == "failure" ]]; then�[0m
513:  �[36;1m  echo "::warning::Bazel cache setup failed — fell back to setup without cache"�[0m
514:  �[36;1mfi�[0m
...

524:  NUGET_API_KEY: 
525:  BAZELISK_GITHUB_TOKEN: ***
526:  ##[endgroup]
527:  === Disk space ===
528:  Filesystem      Size  Used Avail Use% Mounted on
529:  /dev/root       145G   28G  117G  20% /
530:  Available: 117GB
531:  === Bazel cache sizes ===
532:  External:                 24M
533:  Repository Cache:         401M
534:  Repo Contents Cache:      939M
535:  Bazelisk:                 63M
536:  ##[group]Run . ./scripts/github-actions/disk-status.sh
537:  �[36;1m. ./scripts/github-actions/disk-status.sh�[0m
538:  �[36;1mif [ "$AVAIL_GB" -lt 10 ]; then�[0m
539:  �[36;1m  echo "::error::Insufficient disk space: ${AVAIL_GB}GB available (need >=10GB)"�[0m
540:  �[36;1m  exit 1�[0m
...

723:  uses sets log path to stderr
724:  setting log output as a file converts to argument
725:  uses provided args
726:  when SE_DEBUG is set
727:  adds --verbose flag
728:  2026-05-25 17:59:44 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
729:  removes conflicting --log-level args
730:  2026-05-25 17:59:44 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
731:  removes conflicting --silent args
732:  when initializing driver
733:  is not created when :url is provided
734:  is created when :url is not provided
735:  accepts :service without creating a new instance
736:  setting log output as a file converts to argument
737:  with a path env variable
738:  uses the path from the environment (FAILED - 1)
739:  updates the path after setting the environment variable
740:  Failures:
741:  1) Selenium::WebDriver::Edge::Service when initializing driver with a path env variable uses the path from the environment
742:  Failure/Error: expect(service.executable_path).to match(/edgedriver/)
743:  expected nil to match /edgedriver/
744:  # ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:174:in 'block (4 levels) in <module:Edge>'
745:  Finished in 0.04694 seconds (files took 0.74568 seconds to load)
746:  16 examples, 1 failure
747:  Failed examples:
748:  rspec ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:173 # Selenium::WebDriver::Edge::Service when initializing driver with a path env variable uses the path from the environment
749:  ================================================================================
750:  �[32m[358 / 428]�[0m 3 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 6s processwrapper-sandbox ... (4 actions running)
751:  �[32m[361 / 428]�[0m 6 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 7s processwrapper-sandbox ... (4 actions running)
752:  �[32m[364 / 428]�[0m 9 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 8s processwrapper-sandbox ... (4 actions running)
753:  �[32m[366 / 428]�[0m 11 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 9s processwrapper-sandbox ... (4 actions running)
754:  �[32m[367 / 428]�[0m 12 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 10s processwrapper-sandbox ... (4 actions running)
755:  �[32m[370 / 428]�[0m 15 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 11s processwrapper-sandbox ... (4 actions running)
756:  �[32m[372 / 428]�[0m 17 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 12s processwrapper-sandbox ... (4 actions running)
757:  �[32m[374 / 428]�[0m 19 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 13s processwrapper-sandbox ... (4 actions running)
758:  �[32m[376 / 428]�[0m 21 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 14s processwrapper-sandbox ... (4 actions running)
759:  �[32m[378 / 428]�[0m 24 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 15s processwrapper-sandbox ... (4 actions running)
760:  �[32m[380 / 428]�[0m 25 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 17s processwrapper-sandbox ... (4 actions running)
761:  �[32m[383 / 428]�[0m 28 / 73 tests, �[31m�[1m1 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 18s processwrapper-sandbox ... (4 actions running)
762:  �[31m�[1mFAIL: �[0m//rb/spec/unit/selenium/webdriver/chrome:service (Exit 1) (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/chrome/service/test.log)
...

767:  #new
768:  uses nil path and default port
769:  uses provided path and port
770:  does not create args by default
771:  uses sets log path to stdout
772:  uses sets log path to stderr
773:  setting log output as a file converts to argument
774:  uses provided args
775:  when SE_DEBUG is set
776:  adds --verbose flag
777:  2026-05-25 17:59:58 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
778:  removes conflicting --log-level args
779:  2026-05-25 17:59:58 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
780:  removes conflicting --silent args
781:  when initializing driver
782:  errors when :url is provided
783:  is created when :url is not provided
784:  accepts :service without creating a new instance
785:  with a path env variable
786:  uses the path from the environment (FAILED - 1)
787:  updates the path after setting the environment variable
788:  Failures:
789:  1) Selenium::WebDriver::Chrome::Service when initializing driver with a path env variable uses the path from the environment
790:  Failure/Error: expect(service.executable_path).to match(/chromedriver/)
791:  expected nil to match /chromedriver/
792:  # ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:164:in 'block (4 levels) in <module:Chrome>'
793:  Finished in 0.03797 seconds (files took 0.72925 seconds to load)
794:  15 examples, 1 failure
795:  Failed examples:
796:  rspec ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:163 # Selenium::WebDriver::Chrome::Service when initializing driver with a path env variable uses the path from the environment
797:  ================================================================================
798:  �[32m[386 / 428]�[0m 31 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 19s processwrapper-sandbox ... (4 actions running)
799:  �[32m[388 / 428]�[0m 33 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 20s processwrapper-sandbox ... (4 actions running)
800:  �[32m[391 / 428]�[0m 36 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 21s processwrapper-sandbox ... (4 actions running)
801:  �[32m[392 / 428]�[0m 37 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 22s processwrapper-sandbox ... (4 actions running)
802:  �[32m[395 / 428]�[0m 40 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 23s processwrapper-sandbox ... (4 actions running)
803:  �[32m[397 / 428]�[0m 42 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 24s processwrapper-sandbox ... (4 actions running)
804:  �[32m[399 / 428]�[0m 44 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 25s processwrapper-sandbox ... (4 actions running)
805:  �[32m[401 / 428]�[0m 46 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 27s processwrapper-sandbox ... (4 actions running)
806:  �[32m[404 / 428]�[0m 49 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 28s processwrapper-sandbox ... (4 actions running)
807:  �[32m[407 / 428]�[0m 52 / 73 tests, �[31m�[1m2 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 29s processwrapper-sandbox ... (4 actions running)
808:  �[31m�[1mFAIL: �[0m//rb/spec/unit/selenium/webdriver/firefox:service (Exit 1) (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/firefox/service/test.log)
...

822:  with connect existing
823:  does not uses websocket-port
824:  with websocket port
825:  does not add websocket-port
826:  when SE_DEBUG is set
827:  adds -v flag
828:  preserves conflicting --log args with value and warns
829:  preserves conflicting --log= args and warns
830:  does not remove next arg if --log has no value
831:  preserves conflicting --log args added after initialization
832:  when initializing driver
833:  is not created when :url is provided
834:  is created when :url is not provided
835:  accepts :service without creating a new instance
836:  with a path env variable
837:  uses the path from the environment (FAILED - 1)
838:  updates the path after setting the environment variable
839:  Failures:
840:  1) Selenium::WebDriver::Firefox::Service when initializing driver with a path env variable uses the path from the environment
841:  Failure/Error: expect(service.executable_path).to match(/geckodriver/)
842:  expected nil to match /geckodriver/
843:  # ./rb/spec/unit/selenium/webdriver/firefox/service_spec.rb:226:in 'block (4 levels) in <module:Firefox>'
844:  Finished in 0.05373 seconds (files took 0.75118 seconds to load)
845:  20 examples, 1 failure
846:  Failed examples:
847:  rspec ./rb/spec/unit/selenium/webdriver/firefox/service_spec.rb:225 # Selenium::WebDriver::Firefox::Service when initializing driver with a path env variable uses the path from the environment
848:  ================================================================================
849:  �[32m[410 / 428]�[0m 55 / 73 tests, �[31m�[1m3 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 30s processwrapper-sandbox ... (4 actions running)
850:  �[32m[411 / 428]�[0m 56 / 73 tests, �[31m�[1m3 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 31s processwrapper-sandbox ... (4 actions running)
851:  �[32m[413 / 428]�[0m 58 / 73 tests, �[31m�[1m3 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 32s processwrapper-sandbox ... (4 actions running)
852:  �[31m�[1mFAIL: �[0m//rb/spec/unit/selenium/webdriver/safari:service (Exit 1) (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/safari/service/test.log)
...

854:  ==================== Test output for //rb/spec/unit/selenium/webdriver/safari:service:
855:  DEBUGGER: Debugger can attach via UNIX domain socket (/tmp/rdbg-1001/rdbg-15702)
856:  Selenium::WebDriver::Safari::Service
857:  #new
858:  does not allow log
859:  uses default port and nil path
860:  uses provided path and port
861:  does not create args by default
862:  does not allow log=
863:  uses provided args
864:  when initializing driver
865:  is not created when :url is provided
866:  is created when :url is not provided
867:  accepts :service without creating a new instance
868:  with a path env variable
869:  uses the path from the environment (FAILED - 1)
870:  updates the path after setting the environment variable
871:  Failures:
872:  1) Selenium::WebDriver::Safari::Service when initializing driver with a path env variable uses the path from the environment
873:  Failure/Error: expect(service.executable_path).to match(/safaridriver/)
874:  expected nil to match /safaridriver/
875:  # ./rb/spec/unit/selenium/webdriver/safari/service_spec.rb:129:in 'block (4 levels) in <module:Safari>'
876:  Finished in 0.04091 seconds (files took 0.73812 seconds to load)
877:  11 examples, 1 failure
878:  Failed examples:
879:  rspec ./rb/spec/unit/selenium/webdriver/safari/service_spec.rb:128 # Selenium::WebDriver::Safari::Service when initializing driver with a path env variable uses the path from the environment
880:  ================================================================================
881:  �[32m[416 / 428]�[0m 61 / 73 tests, �[31m�[1m4 failed�[0m;�[0m Testing //rb/spec/unit/selenium:server; 34s processwrapper-sandbox ... (4 actions running)
882:  �[31m�[1mFAIL: �[0m//rb/spec/unit/selenium/webdriver/ie:service (Exit 1) (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/ie/service/test.log)
...

891:  uses sets log path to stdout
892:  uses sets log path to stderr
893:  sets log path as file location
894:  uses provided args
895:  when SE_DEBUG is set
896:  adds --log-level=DEBUG flag
897:  2026-05-25 18:00:13 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
898:  removes conflicting --log-level args
899:  2026-05-25 18:00:13 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
900:  removes conflicting --silent args
901:  when initializing driver
902:  is not created when :url is provided
903:  is created when :url is not provided
904:  accepts :service without creating a new instance
905:  with a path env variable
906:  uses the path from the environment (FAILED - 1)
907:  updates the path after setting the environment variable
908:  Failures:
909:  1) Selenium::WebDriver::IE::Service when initializing driver with a path env variable uses the path from the environment
910:  Failure/Error: expect(service.executable_path).to match(/IEDriver/)
911:  expected nil to match /IEDriver/
912:  # ./rb/spec/unit/selenium/webdriver/ie/service_spec.rb:164:in 'block (4 levels) in <module:IE>'
913:  Finished in 0.04248 seconds (files took 0.69182 seconds to load)
914:  15 examples, 1 failure
915:  Failed examples:
916:  rspec ./rb/spec/unit/selenium/webdriver/ie/service_spec.rb:163 # Selenium::WebDriver::IE::Service when initializing driver with a path env variable uses the path from the environment
917:  ================================================================================
918:  �[32m[420 / 428]�[0m 65 / 73 tests, �[31m�[1m5 failed�[0m;�[0m Testing //rb/spec/unit/selenium/webdriver/devtools:request; 1s processwrapper-sandbox ... (4 actions running)
919:  �[32m[423 / 428]�[0m 68 / 73 tests, �[31m�[1m5 failed�[0m;�[0m Testing //rb/spec/unit/selenium/webdriver:proxy; 1s processwrapper-sandbox ... (4 actions running)
920:  �[32m[424 / 428]�[0m 69 / 73 tests, �[31m�[1m5 failed�[0m;�[0m Testing //rb/spec/unit/selenium/webdriver/safari:driver; 1s processwrapper-sandbox ... (4 actions running)
921:  �[32mINFO: �[0mFound 73 test targets...
922:  �[32mINFO: �[0mElapsed time: 91.107s, Critical Path: 67.16s
923:  �[32mINFO: �[0m428 processes: 330 internal, 171 processwrapper-sandbox.
924:  �[32mINFO: �[0mBuild completed, 5 tests FAILED, 428 total actions
925:  //rb/spec/unit/selenium:devtools                                         �[0m�[32mPASSED�[0m in 1.3s
...

978:  //rb/spec/unit/selenium/webdriver/firefox:options                        �[0m�[32mPASSED�[0m in 1.1s
979:  //rb/spec/unit/selenium/webdriver/firefox:profile                        �[0m�[32mPASSED�[0m in 1.4s
980:  //rb/spec/unit/selenium/webdriver/ie:driver                              �[0m�[32mPASSED�[0m in 1.3s
981:  //rb/spec/unit/selenium/webdriver/ie:options                             �[0m�[32mPASSED�[0m in 1.4s
982:  //rb/spec/unit/selenium/webdriver/remote:bridge                          �[0m�[32mPASSED�[0m in 1.3s
983:  //rb/spec/unit/selenium/webdriver/remote:capabilities                    �[0m�[32mPASSED�[0m in 1.2s
984:  //rb/spec/unit/selenium/webdriver/remote:driver                          �[0m�[32mPASSED�[0m in 1.4s
985:  //rb/spec/unit/selenium/webdriver/remote:features                        �[0m�[32mPASSED�[0m in 1.1s
986:  //rb/spec/unit/selenium/webdriver/remote/http:common                     �[0m�[32mPASSED�[0m in 1.2s
987:  //rb/spec/unit/selenium/webdriver/remote/http:default                    �[0m�[32mPASSED�[0m in 1.2s
988:  //rb/spec/unit/selenium/webdriver/safari:driver                          �[0m�[32mPASSED�[0m in 1.5s
989:  //rb/spec/unit/selenium/webdriver/safari:options                         �[0m�[32mPASSED�[0m in 1.4s
990:  //rb/spec/unit/selenium/webdriver/support:color                          �[0m�[32mPASSED�[0m in 1.2s
991:  //rb/spec/unit/selenium/webdriver/support:event_firing                   �[0m�[32mPASSED�[0m in 1.4s
992:  //rb/spec/unit/selenium/webdriver/support:select                         �[0m�[32mPASSED�[0m in 1.3s
993:  //rb/spec/unit/selenium/webdriver/chrome:service                         �[0m�[31m�[1mFAILED�[0m in 1.3s
994:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/chrome/service/test.log
995:  //rb/spec/unit/selenium/webdriver/edge:service                           �[0m�[31m�[1mFAILED�[0m in 1.7s
996:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/edge/service/test.log
997:  //rb/spec/unit/selenium/webdriver/firefox:service                        �[0m�[31m�[1mFAILED�[0m in 1.5s
998:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/firefox/service/test.log
999:  //rb/spec/unit/selenium/webdriver/ie:service                             �[0m�[31m�[1mFAILED�[0m in 1.4s
1000:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/ie/service/test.log
1001:  //rb/spec/unit/selenium/webdriver/safari:service                         �[0m�[31m�[1mFAILED�[0m in 1.4s
1002:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/safari/service/test.log
1003:  Executed 73 out of 73 tests: 68 tests pass and �[0m�[31m�[1m5 fail locally�[0m.
1004:  �[0m
1005:  ##[error]Process completed with exit code 3.
1006:  ##[group]Run ./scripts/github-actions/rerun-failures.sh 'bazel test --keep_going --build_tests_only --test_size_filters small //rb/spec/...
...

1043:  with connect existing
1044:  does not uses websocket-port
1045:  with websocket port
1046:  does not add websocket-port
1047:  when SE_DEBUG is set
1048:  adds -v flag
1049:  preserves conflicting --log args with value and warns
1050:  preserves conflicting --log= args and warns
1051:  does not remove next arg if --log has no value
1052:  preserves conflicting --log args added after initialization
1053:  when initializing driver
1054:  is not created when :url is provided
1055:  is created when :url is not provided
1056:  accepts :service without creating a new instance
1057:  with a path env variable
1058:  uses the path from the environment (FAILED - 1)
1059:  updates the path after setting the environment variable
1060:  Failures:
1061:  1) Selenium::WebDriver::Firefox::Service when initializing driver with a path env variable uses the path from the environment
1062:  Failure/Error: expect(service.executable_path).to match(/geckodriver/)
1063:  expected nil to match /geckodriver/
1064:  # ./rb/spec/unit/selenium/webdriver/firefox/service_spec.rb:226:in 'block (4 levels) in <module:Firefox>'
1065:  Finished in 0.07419 seconds (files took 0.77913 seconds to load)
1066:  20 examples, 1 failure
1067:  Failed examples:
1068:  rspec ./rb/spec/unit/selenium/webdriver/firefox/service_spec.rb:225 # Selenium::WebDriver::Firefox::Service when initializing driver with a path env variable uses the path from the environment
1069:  ================================================================================
1070:  �[31m�[1mFAIL: �[0m//rb/spec/unit/selenium/webdriver/ie:service (Exit 1) (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/ie/service/test.log)
1071:  �[32mINFO: �[0mFrom Testing //rb/spec/unit/selenium/webdriver/ie:service:
1072:  ==================== Test output for //rb/spec/unit/selenium/webdriver/ie:service:
1073:  DEBUGGER: Debugger can attach via UNIX domain socket (/tmp/rdbg-1001/rdbg-19147)
1074:  Selenium::WebDriver::IE::Service
1075:  #new
1076:  uses default port and nil path
1077:  uses provided path and port
1078:  does not create args by default (FAILED - 1)
1079:  uses sets log path to stdout
1080:  uses sets log path to stderr
1081:  sets log path as file location
1082:  uses provided args (FAILED - 2)
1083:  when SE_DEBUG is set
1084:  adds --log-level=DEBUG flag
1085:  2026-05-25 18:00:21 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
1086:  removes conflicting --log-level args
1087:  2026-05-25 18:00:21 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
1088:  removes conflicting --silent args
1089:  when initializing driver
1090:  is not created when :url is provided
1091:  is created when :url is not provided
1092:  accepts :service without creating a new instance
1093:  with a path env variable
1094:  uses the path from the environment (FAILED - 3)
1095:  updates the path after setting the environment variable
1096:  Failures:
1097:  1) Selenium::WebDriver::IE::Service#new does not create args by default
1098:  Failure/Error: expect(service.extra_args).to be_empty
1099:  expected `["--log-level=DEBUG"].empty?` to be truthy, got false
1100:  # ./rb/spec/unit/selenium/webdriver/ie/service_spec.rb:56:in 'block (3 levels) in <module:IE>'
1101:  2) Selenium::WebDriver::IE::Service#new uses provided args
1102:  Failure/Error: expect(service.extra_args).to eq ['--foo', '--bar']
1103:  expected: ["--foo", "--bar"]
1104:  got: ["--foo", "--bar", "--log-level=DEBUG"]
1105:  (compared using ==)
1106:  # ./rb/spec/unit/selenium/webdriver/ie/service_spec.rb:80:in 'block (3 levels) in <module:IE>'
1107:  3) Selenium::WebDriver::IE::Service when initializing driver with a path env variable uses the path from the environment
1108:  Failure/Error: expect(service.executable_path).to match(/IEDriver/)
1109:  expected nil to match /IEDriver/
1110:  # ./rb/spec/unit/selenium/webdriver/ie/service_spec.rb:164:in 'block (4 levels) in <module:IE>'
1111:  Finished in 0.04964 seconds (files took 0.85762 seconds to load)
1112:  15 examples, 3 failures
1113:  Failed examples:
1114:  rspec ./rb/spec/unit/selenium/webdriver/ie/service_spec.rb:53 # Selenium::WebDriver::IE::Service#new does not create args by default
...

1120:  ==================== Test output for //rb/spec/unit/selenium/webdriver/safari:service:
1121:  DEBUGGER: Debugger can attach via UNIX domain socket (/tmp/rdbg-1001/rdbg-19328)
1122:  Selenium::WebDriver::Safari::Service
1123:  #new
1124:  does not allow log
1125:  uses default port and nil path
1126:  uses provided path and port
1127:  does not create args by default
1128:  does not allow log=
1129:  uses provided args
1130:  when initializing driver
1131:  is not created when :url is provided
1132:  is created when :url is not provided
1133:  accepts :service without creating a new instance
1134:  with a path env variable
1135:  uses the path from the environment (FAILED - 1)
1136:  updates the path after setting the environment variable
1137:  Failures:
1138:  1) Selenium::WebDriver::Safari::Service when initializing driver with a path env variable uses the path from the environment
1139:  Failure/Error: expect(service.executable_path).to match(/safaridriver/)
1140:  expected nil to match /safaridriver/
1141:  # ./rb/spec/unit/selenium/webdriver/safari/service_spec.rb:129:in 'block (4 levels) in <module:Safari>'
1142:  Finished in 0.04495 seconds (files took 0.75077 seconds to load)
1143:  11 examples, 1 failure
1144:  Failed examples:
1145:  rspec ./rb/spec/unit/selenium/webdriver/safari/service_spec.rb:128 # Selenium::WebDriver::Safari::Service when initializing driver with a path env variable uses the path from the environment
1146:  ================================================================================
1147:  �[31m�[1mFAIL: �[0m//rb/spec/unit/selenium/webdriver/chrome:service (Exit 1) (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/chrome/service/test.log)
1148:  �[32mINFO: �[0mFrom Testing //rb/spec/unit/selenium/webdriver/chrome:service:
1149:  ==================== Test output for //rb/spec/unit/selenium/webdriver/chrome:service:
1150:  DEBUGGER: Debugger can attach via UNIX domain socket (/tmp/rdbg-1001/rdbg-19144)
1151:  Selenium::WebDriver::Chrome::Service
1152:  #new
1153:  uses nil path and default port
1154:  uses provided path and port
1155:  does not create args by default (FAILED - 1)
1156:  uses sets log path to stdout
1157:  uses sets log path to stderr
1158:  setting log output as a file converts to argument (FAILED - 2)
1159:  uses provided args (FAILED - 3)
1160:  when SE_DEBUG is set
1161:  adds --verbose flag
1162:  2026-05-25 18:00:21 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
1163:  removes conflicting --log-level args
1164:  2026-05-25 18:00:21 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
1165:  removes conflicting --silent args
1166:  when initializing driver
1167:  errors when :url is provided
1168:  is created when :url is not provided
1169:  accepts :service without creating a new instance
1170:  with a path env variable
1171:  uses the path from the environment (FAILED - 4)
1172:  updates the path after setting the environment variable
1173:  Failures:
1174:  1) Selenium::WebDriver::Chrome::Service#new does not create args by default
1175:  Failure/Error: expect(service.extra_args).to be_empty
1176:  expected `["--verbose"].empty?` to be truthy, got false
1177:  # ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:58:in 'block (3 levels) in <module:Chrome>'
1178:  2) Selenium::WebDriver::Chrome::Service#new setting log output as a file converts to argument
1179:  Failure/Error: expect(service.args).to eq ['--log-path=/path/to/log.txt']
1180:  expected: ["--log-path=/path/to/log.txt"]
1181:  got: ["--verbose", "--log-path=/path/to/log.txt"]
1182:  (compared using ==)
1183:  # ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:77:in 'block (3 levels) in <module:Chrome>'
1184:  3) Selenium::WebDriver::Chrome::Service#new uses provided args
1185:  Failure/Error: expect(service.extra_args).to eq ['--foo', '--bar']
1186:  expected: ["--foo", "--bar"]
1187:  got: ["--foo", "--bar", "--verbose"]
1188:  (compared using ==)
1189:  # ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:83:in 'block (3 levels) in <module:Chrome>'
1190:  4) Selenium::WebDriver::Chrome::Service when initializing driver with a path env variable uses the path from the environment
1191:  Failure/Error: expect(service.executable_path).to match(/chromedriver/)
1192:  expected nil to match /chromedriver/
1193:  # ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:164:in 'block (4 levels) in <module:Chrome>'
1194:  Finished in 0.0548 seconds (files took 0.81798 seconds to load)
1195:  15 examples, 4 failures
1196:  Failed examples:
1197:  rspec ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:55 # Selenium::WebDriver::Chrome::Service#new does not create args by default
1198:  rspec ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:73 # Selenium::WebDriver::Chrome::Service#new setting log output as a file converts to argument
1199:  rspec ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:80 # Selenium::WebDriver::Chrome::Service#new uses provided args
1200:  rspec ./rb/spec/unit/selenium/webdriver/chrome/service_spec.rb:163 # Selenium::WebDriver::Chrome::Service when initializing driver with a path env variable uses the path from the environment
1201:  ================================================================================
1202:  �[32m[64 / 65]�[0m 4 / 5 tests, �[31m�[1m4 failed�[0m;�[0m Testing //rb/spec/unit/selenium/webdriver/edge:service; 1s processwrapper-sandbox
1203:  �[31m�[1mFAIL: �[0m//rb/spec/unit/selenium/webdriver/edge:service (Exit 1) (see /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/edge/service/test.log)
1204:  �[32mINFO: �[0mFrom Testing //rb/spec/unit/selenium/webdriver/edge:service:
1205:  ==================== Test output for //rb/spec/unit/selenium/webdriver/edge:service:
1206:  DEBUGGER: Debugger can attach via UNIX domain socket (/tmp/rdbg-1001/rdbg-19916)
1207:  Selenium::WebDriver::Edge::Service
1208:  #new
1209:  uses default port and nil path
1210:  uses provided path and port
1211:  does not create args by default (FAILED - 1)
1212:  uses sets log path to stdout
1213:  uses sets log path to stderr
1214:  setting log output as a file converts to argument (FAILED - 2)
1215:  uses provided args (FAILED - 3)
1216:  when SE_DEBUG is set
1217:  adds --verbose flag
1218:  2026-05-25 18:00:22 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
1219:  removes conflicting --log-level args
1220:  2026-05-25 18:00:22 WARN Selenium [:se_debug] SE_DEBUG is set; overriding user-specified driver logging settings 
1221:  removes conflicting --silent args
1222:  when initializing driver
1223:  is not created when :url is provided
1224:  is created when :url is not provided
1225:  accepts :service without creating a new instance
1226:  setting log output as a file converts to argument
1227:  with a path env variable
1228:  uses the path from the environment (FAILED - 4)
1229:  updates the path after setting the environment variable
1230:  Failures:
1231:  1) Selenium::WebDriver::Edge::Service#new does not create args by default
1232:  Failure/Error: expect(service.extra_args).to be_empty
1233:  expected `["--verbose"].empty?` to be truthy, got false
1234:  # ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:57:in 'block (3 levels) in <module:Edge>'
1235:  2) Selenium::WebDriver::Edge::Service#new setting log output as a file converts to argument
1236:  Failure/Error: expect(service.args).to eq ['--log-path=/path/to/log.txt']
1237:  expected: ["--log-path=/path/to/log.txt"]
1238:  got: ["--verbose", "--log-path=/path/to/log.txt"]
1239:  (compared using ==)
1240:  # ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:76:in 'block (3 levels) in <module:Edge>'
1241:  3) Selenium::WebDriver::Edge::Service#new uses provided args
1242:  Failure/Error: expect(service.extra_args).to eq ['--foo', '--bar']
1243:  expected: ["--foo", "--bar"]
1244:  got: ["--foo", "--bar", "--verbose"]
1245:  (compared using ==)
1246:  # ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:82:in 'block (3 levels) in <module:Edge>'
1247:  4) Selenium::WebDriver::Edge::Service when initializing driver with a path env variable uses the path from the environment
1248:  Failure/Error: expect(service.executable_path).to match(/edgedriver/)
1249:  expected nil to match /edgedriver/
1250:  # ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:174:in 'block (4 levels) in <module:Edge>'
1251:  Finished in 0.03724 seconds (files took 0.55364 seconds to load)
1252:  16 examples, 4 failures
1253:  Failed examples:
1254:  rspec ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:54 # Selenium::WebDriver::Edge::Service#new does not create args by default
1255:  rspec ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:72 # Selenium::WebDriver::Edge::Service#new setting log output as a file converts to argument
1256:  rspec ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:79 # Selenium::WebDriver::Edge::Service#new uses provided args
1257:  rspec ./rb/spec/unit/selenium/webdriver/edge/service_spec.rb:173 # Selenium::WebDriver::Edge::Service when initializing driver with a path env variable uses the path from the environment
1258:  ================================================================================
1259:  �[32mINFO: �[0mFound 5 test targets...
1260:  �[32mINFO: �[0mElapsed time: 5.145s, Critical Path: 2.58s
1261:  �[32mINFO: �[0m6 processes: 20 action cache hit, 1 internal, 10 processwrapper-sandbox.
1262:  �[32mINFO: �[0mBuild completed, 5 tests FAILED, 6 total actions
1263:  //rb/spec/unit/selenium/webdriver/chrome:service                         �[0m�[31m�[1mFAILED�[0m in 2.2s
1264:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/chrome/service/test.log
1265:  //rb/spec/unit/selenium/webdriver/edge:service                           �[0m�[31m�[1mFAILED�[0m in 1.1s
1266:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/edge/service/test.log
1267:  //rb/spec/unit/selenium/webdriver/firefox:service                        �[0m�[31m�[1mFAILED�[0m in 2.0s
1268:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/firefox/service/test.log
1269:  //rb/spec/unit/selenium/webdriver/ie:service                             �[0m�[31m�[1mFAILED�[0m in 2.0s
1270:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/ie/service/test.log
1271:  //rb/spec/unit/selenium/webdriver/safari:service                         �[0m�[31m�[1mFAILED�[0m in 2.0s
1272:  /home/runner/.bazel/execroot/_main/bazel-out/k8-fastbuild/testlogs/rb/spec/unit/selenium/webdriver/safari/service/test.log
1273:  Executed 5 out of 5 tests: �[0m�[31m�[1m5 fail locally�[0m.
1274:  �[0m
1275:  ##[error]Process completed with exit code 3.
1276:  ##[group]Run ./scripts/github-actions/collect-test-logs.sh

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

C-rb Ruby Bindings

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants