Chapter 16Lesson 03190–250 min

SeleniumLibrary and Browser Automation Integration: Configuration, Design Patterns, and Trade-Offs

Choose deliberately between SeleniumLibrary and Browser, explicit waiting and auto-waiting, low-level library keywords and domain resources, session reuse and isolation, and headed/headless execution.

ArchitectureIsolationHeadlessLocatorsTrade-offs

Learning objectives

  • Select SeleniumLibrary or Browser based on engine/runtime/estate constraints rather than popularity.
  • Place locators and synchronization at the resource/library boundary that owns them.
  • Balance browser reuse and per-test isolation using observable state and failure blast radius.
  • Separate headed/headless execution from semantic correctness.
  • Explain why mixed browser stacks increase dependency and diagnostic surface.

Current compatibility baseline — verified 2026-08-31. Robot Framework 7.4.2 is the stable course baseline. SeleniumLibrary 6.9.0 is paired in these labs with Selenium 4.44.0 because 6.9.0 documents support through that Selenium version; use Python 3.10+ for this chapter. Browser 20.4.0 requires Python 3.10+ and Robot Framework 7.1.1+, and its release is tested with Playwright 1.62.1. The easiest Browser path uses robotframework-browser[bb] plus rfbrowser install; the Node-managed path supports Node 22/24 LTS and Node 26. Re-check current compatibility before upgrading any layer. No paid browser cloud, production site, real credential, Pabot, container, or CI account is required.

1. Architecture starts with state ownership, not keyword preference

Both stacks can automate modern web applications. The useful question is not “which has the nicer Click keyword?” It is “which runtime, browser lifecycle, waiting model, ecosystem constraints, evidence APIs, and existing team investments fit this automation boundary?” A mature Selenium/WebDriver estate may favor SeleniumLibrary. A new suite may prefer Browser for Playwright contexts, actionability waiting, and tracing. Either can be badly designed if tests expose raw selectors everywhere or share dirty state.

2. SeleniumLibrary versus Browser

Decision driver Prefer SeleniumLibrary when… Prefer Browser when…
Existing estate WebDriver/Selenium infrastructure, plugins, knowledge, or remote-grid compatibility is already governed Playwright is already the standard and new suites can use its browser/context model
Runtime dependencies Installed browsers + Selenium Manager/managed drivers fit the environment BrowserBatteries/Playwright binaries or supported Node runtime fit the environment
Isolation model WebDriver session-per-test is acceptable and explicit Context isolation is valuable and page/context lifecycle is part of the design
Synchronization Team is disciplined about explicit condition waits Team understands Playwright actionability and Browser retrying assertions without assuming universal readiness
Evidence Screenshots/logs satisfy needs or external Selenium tracing already exists Playwright trace and Browser-specific evidence improve diagnosis
Migration risk Rewriting a stable Selenium estate would add more risk than value Greenfield or deliberate migration can absorb dependency/runtime change

Do not import both stacks into one suite “just in case.” A mixed estate is sometimes legitimate, but the boundary should be explicit: separate suites/resources, clear owners, and no ambiguous keywords.

3. Explicit waits versus auto-waiting

SeleniumLibrary exposes explicit waiting keywords because WebDriver calls and application readiness are separate concerns. Use waits that name the real condition: element visible, enabled, text present, location changed, or another supported state.

Browser/Playwright automatically waits for actionability before actions such as click. Browser assertions can also retry. That reduces boilerplate but does not remove the need to model business readiness. An order appearing in a backend, a job completing, or a spinner disappearing may require an explicit condition even though the click itself was perfectly actionable.

Situation SeleniumLibrary pattern Browser pattern
Target must be visible Wait Until Element Is Visible then action Action often auto-waits; explicit wait only if needed for a distinct state
Text becomes expected later Wait Until Element Contains Getter assertion such as Get Text … == … retries
Overlay must disappear Wait on overlay not visible before click if it intercepts Wait/assert the overlay state if Playwright actionability alone does not model the app rule
Unknown fixed delay Do not use Sleep Do not use Sleep

4. Direct library keywords versus domain resources

Direct library keywords are appropriate inside a small technical resource or a highly localized exploratory case. They are poor business vocabulary when every test repeats selectors and mechanics. The resource is the anti-corruption layer: it maps Submit Valid Credentials to whichever library and selectors are current.

A useful rule is: if a browser locator changes, how many business tests should change? The target answer is usually zero.

5. Browser reuse versus per-test isolation

Model Benefit Risk Production default
Per-test WebDriver/browser Strong isolation; clear ownership; easy failure attribution Higher startup cost Default for correctness-sensitive suites
Shared browser, separate context/page where supported Lower startup cost while keeping some isolation Global browser failure affects multiple tests; context cleanup must be exact Reasonable Browser optimization after measurement
Shared session/context across tests Fastest apparent startup Cookies/storage/order dependence; parallel contention; false positives Avoid unless scenario semantics explicitly require one durable user journey

Optimization belongs after measurement. Browser startup time, library/runtime startup, page navigation, AUT latency, logging, and CI/container startup are different costs. Do not trade correctness for an unmeasured speed gain.

6. Headed versus headless

Headed mode is useful locally for diagnosis and demonstrations. Headless mode is often more practical in CI. Neither is inherently more “correct.” Treat mode as runtime configuration and keep assertions identical. If a test passes only headed, investigate viewport, timing, focus, download, graphics, or platform differences rather than adding alternate assertions.

Record browser engine/version, headless/headed mode, viewport/context settings, and relevant OS/runtime versions with failure evidence.

7. One standard stack versus mixed estates

Standardization reduces dependency and diagnostic surface. A mixed estate may be justified during migration or when a specific protocol/feature requires it, but it carries two sets of runtime dependencies, browser semantics, locators, waiting behavior, artifact formats, and expertise. Keep the business keyword contract stable so migration can happen beneath it.

8. Keep configuration layers distinct

Layer Owns Does not own
Robot Framework core suite/test selection, variables, outputdir, resource/library import WebDriver/Playwright implementation
SeleniumLibrary Selenium browser keywords, driver cache, Selenium timeout/config Robot CLI policy or AUT configuration
Browser Playwright browser/context/page keywords, Browser timeouts/assertion retries Selenium Manager or Selenium grid policy
Python environment package versions and virtualenv browser session identity
Browser runtime Chrome/Firefox/Chromium binaries, browser profiles Robot variable scope
AUT application behavior and test fixture state Robot result semantics
RobotCode/editor editor/profile convenience if used browser-library core semantics
CI/container/cloud runtime scheduling/image/network/secrets test intent

9. Worked design scenario

A team has 400 Selenium-based Robot tests and wants faster greenfield UI checks. Do not rewrite all 400 by default. Preserve existing SeleniumLibrary suites, introduce Browser for one isolated new feature behind the same domain-resource conventions, collect startup/runtime/failure evidence, and decide migration based on maintenance and diagnostic outcomes. Keep both stacks in separate dependency groups or lockfiles if practical.

Question Decision
Existing stable Selenium tests? Keep them on SeleniumLibrary while compatibility remains supported.
New feature needs isolated contexts/trace? Pilot Browser in a separate suite/resource boundary.
Can the same domain wording be used? Yes; keep tests business-facing and let resources differ.
Should both libraries be imported in the same suite? Not unless there is a deliberate, documented need and every collision/ownership boundary is explicit.
How is success judged? Failure rate, diagnosis time, maintenance churn, runtime, and evidence quality—not syntax preference.

10. Security/privacy trade-offs

Browser artifacts are observability tools and potential data-leak channels. More detailed logging/tracing can improve diagnosis while increasing privacy risk and artifact size. Mask or avoid sensitive fixtures, prefer fake data in test environments, scope artifact access, and define retention. Never lower TLS/SSH/browser verification or put production credentials into a browser test to make automation easier.

Knowledge check

A test repeats the same CSS selector in 30 business cases. What design change has the highest leverage?

Is Browser auto-wait a reason to remove all explicit waits?

When is shared browser state acceptable?

Why can mixing SeleniumLibrary and Browser in one suite hurt diagnosis?

11. Summary and bridge

Production browser architecture is a set of explicit trade-offs: engine, lifecycle, synchronization, abstraction, isolation, evidence, and runtime dependencies. Lesson 4 intentionally breaks those contracts and applies a layered diagnostic sequence.

Next lesson

SeleniumLibrary and Browser Automation Integration: Diagnostics, Failure Modes, and Production Practices

Continue with SeleniumLibrary and Browser Automation Integration: Diagnostics, Failure Modes, and Production Practices. It builds directly on the state, evidence, and operating assumptions established here, so carry those constraints forward rather than treating the next page as an isolated topic.

References and version anchors

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0 Send only Ethereum/ERC-20 compatible assets to this address.