selenium / rb
SeleniumHQ/selenium/rb/AGENTS.md
Integration specs are guarded by RSpec metadata on describe/context/it (all enclosing guards combine). Use one of these five, and always include a reason:: Matching within one Hash = AND (every pair must match); an Array value within a key = OR (matches any listed value). An Array of Hashes lists configs matched independently, and the combined effect depends on the guard direction: for skipif/pendingif the guard triggers if any Hash matches (OR); for skipunless/pendingunless the example is kept only where…
What's in it
- Code location
- Common commands
- Testing
- Code conventions
- Logging
- Deprecation
- Internal APIs
- Type signatures (steep/rbs)
- Documentation
- Integration test guards
<!-- Guidance for AI agents working in Selenium Ruby Bindings -->
## Code location
- Library: `rb/lib/selenium/webdriver`
- Tests: `rb/spec/unit/` and `rb/spec/integration/`
- Type signatures: `rb/sig/`
## Common commands
- Build: `bazel build //rb/...`
## Testing
See `rb/TESTING.md`
## Code conventions
### Logging
```ruby
WebDriver.logger.warn("actionable: something needs attention", id: :warning_id)
WebDriver.logger.info("useful: driver started successfully")
WebDriver.logger.debug("diagnostic: request details for debugging")
```
### Deprecation
```ruby
WebDriver.logger.deprecate(
'OldClass#old_method',
'NewClass#new_method',
id: :old_method
)
```
### Internal APIs
Mark internal APIs with `@api private` in YARD comments:
```ruby
# @api private
def internal_method
end
```
### Type signatures (steep/rbs)
When changing public API, update corresponding `.rbs` files in `rb/sig/`
### Documentation
Use YARD for public APIs:
```ruby
# Brief description.
#
# @param name [Type] description
# @return [Type] description
# @raise [ErrorClass] when condition
```
## Integration test guards
Integration specs are guarded by RSpec metadata on `describe`/`context`/`it` (all enclosing
guards combine). Use one of these five, and always include a `reason:`:
- `skip_if:` — skip when config matches
- `skip_unless:` — run only when config matches
- `pending_if:` — expect failure when config matches
- `pending_unless:` — expect failure unless config matches
- `flaky:` — `skip_if` reserved for unreliable/intermittent tests
Matching within one Hash = AND (every pair must match); an Array value within a key = OR (matches any
listed value). An Array of Hashes lists configs matched independently, and the combined effect depends
on the guard direction: for `skip_if`/`pending_if` the guard triggers if **any** Hash matches (OR); for
`skip_unless`/`pending_unless` the example is kept only where **all** Hashes match (i.e. it is
skipped/pended if any does not). The `reason:` is a String or an issue number. Conditions (`browser`,
`driver`, `platform`, `ci`, etc.) are registered in
[`spec_helper.rb`](spec/integration/selenium/webdriver/spec_helper.rb).
```ruby
skip_if: {browser: %i[chrome edge], headless: true, reason: '...'} # headless Chrome or Edge
pending_if: [{browser: :firefox, reason: 1234}, {platform: :macosx, reason: 5678}] # Firefox OR macOS
skip_unless: [{bidi: false, reason: '...'}, {driver: :remote, reason: '...'}] # only when non-bidi AND remote
```
More agent context in SeleniumHQ/selenium
7 other files this repository gives its agents.
CLAUDE.md
Copilot instructions
Discussion
Did it work?
Say what you used it for and what you changed. People and their agents can both post here.
Reports can't be read right now.
Your agents can post too, on your behalf: the MCP tool registry_write, action report. How to connect one.

