Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The Page Object Model (POM) keeps Selenium tests readable by giving each page or reusable UI component a Java class that owns its locators and exposes useful actions or information. Pass the class a WebDriver, keep page details private, and let the test assert whether the observed result matches the scenario. You can use direct By locators; Selenium’s PageFactory is optional.

What the Page Object Model does

A page object represents a page, or a distinct reusable part of one, in test code. It centralizes knowledge of that part of the interface: its locators and the operations a user can perform there. If a page’s markup changes, the page-specific locator can usually be repaired in its object rather than in every test that interacts with it.

Tests use public methods such as loginAs or messageText instead of finding elements themselves. That gives a test a vocabulary closer to the user journey and keeps Selenium mechanics out of scenario code.

Build a simple page object with Java and Selenium

This example uses private By locators and receives the existing WebDriver through its constructor. The selector names and expected page title are examples: replace them with values from your application.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Elebase USB to USB C Adapter for iPhone 18 Pro Max,USBC Car Charger Adapter
  • Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
  • Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
  • Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
  • Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
  • 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class SignInPage {
  private final WebDriver driver;
  private final By username = By.name("user_name");
  private final By password = By.name("password");
  private final By signIn = By.name("sign_in");

  public SignInPage(WebDriver driver) {
    this.driver = driver;
    if (!"Sign In Page".equals(driver.getTitle())) {
      throw new IllegalStateException("Expected the sign-in page, got: "
          + driver.getCurrentUrl());
    }
  }

  public HomePage loginAs(String userName, String passwordText) {
    driver.findElement(username).sendKeys(userName);
    driver.findElement(password).sendKeys(passwordText);
    driver.findElement(signIn).click();
    return new HomePage(driver);
  }
}

public class HomePage {
  private final WebDriver driver;
  private final By message = By.tagName("h1");

  public HomePage(WebDriver driver) {
    this.driver = driver;
  }

  public String messageText() {
    return driver.findElement(message).getText();
  }
}

In a real Java project, put each public class in its own correspondingly named .java file. The code assumes the caller has already created and navigated the driver to the sign-in page; it does not establish a browser, test framework, or application fixture.

Use the page objects from a test

SignInPage signInPage = new SignInPage(driver);
HomePage homePage = signInPage.loginAs("userName", "password");
assertEquals("Hello userName", homePage.messageText());

The page method performs the interaction and returns the object for the resulting page. The test owns the behavioral assertion. The exact assertion import and setup depend on the test framework, which this example does not prescribe.

Design page objects around responsibilities

  1. Start with the screens or sections the test uses. Represent their useful services, not the entire application in one class.
  2. Put page-specific selectors in the object. Keep them private so tests do not depend on page structure.
  3. Expose user-level operations and observations. Methods such as loginAs, openProfile, and messageText communicate intent without exposing raw element-finding steps.
  4. Return the next page object for a transition. A method that navigates can return the object representing the destination, making the expected flow visible in the method signature.
  5. Keep scenario checks in the test. Page methods can return text, lists, booleans, or another page object; the test decides whether those results meet its expectations.
  6. Extract components when repetition warrants it. A shared navigation bar, inventory card, or other discrete repeated area can have a component object. A page can compose component objects, and components can be nested.

Keep assertions in tests, with a narrow page-readiness exception

Selenium’s page-object guidance says page objects should not make scenario verifications or assertions. A limited exception is checking during construction that the object corresponds to the expected page or that a critical element has loaded. That protects against using a page object on the wrong screen; it should not encode the scenario’s expected outcome.

Rank #2
Anker USB-C Hub, 5-in-1 USB Hub for Laptops, 4K HDMI Multiport Adapter
  • 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
  • 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
  • Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
  • 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
  • What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.

“Page objects themselves should never make verifications or assertions.” — Selenium project documentation, “Page object models.”

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

For example, the SignInPage constructor checks the page title, while the test checks the post-login message. Avoid putting an assertion such as “the user must have administrator access” inside a general page method.

Direct By locators or PageFactory?

Page Object Model is a design pattern. org.openqa.selenium.support.PageFactory is a Java helper for initializing fields in a page object; using it is not required for POM. Selenium’s own model example uses direct By locators.

Rank #3
Sale
Anker USB C Hub, 7in1 Multi-Port USB Adapter, 4K@60Hz USBC to HDMI Splitter
  • Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
  • Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
  • Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
  • Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
  • What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
Decision Direct By fields PageFactory fields
How a locator is declared Declare a locator such as By.name("user_name"), then pass it to findElement. Decorate fields; by default a field name can correspond to an element’s HTML id or name. Use annotations such as @FindBy for other lookup rules.
Lookup behavior The page method explicitly calls WebDriver’s lookup when it needs the element. The API describes lazy proxies that locate an element when a method is called on the field, unless caching behavior is changed with @CacheLookup.
When it fits Useful when the lookup is clearer as an explicit operation in the page method. Useful when the team prefers decorated fields and the documented proxy behavior suits its code.

These are differences in declaration and lookup mechanics, not evidence that one style is universally faster or more reliable.

Minimal PageFactory example

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class SignInPageWithFactory {
  private final WebDriver driver;

  @FindBy(name = "user_name")
  private WebElement username;

  @FindBy(name = "password")
  private WebElement password;

  @FindBy(name = "sign_in")
  private WebElement signIn;

  public SignInPageWithFactory(WebDriver driver) {
    this.driver = driver;
    PageFactory.initElements(driver, this);
  }

  public void enterCredentials(String userName, String passwordText) {
    username.sendKeys(userName);
    password.sendKeys(passwordText);
    signIn.click();
  }
}

PageFactory’s documented default is to look up proxied fields when their methods are called. @CacheLookup changes that behavior; it does not make a changing element stable. Avoid caching dynamic elements without a specific reason.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Represent outcomes and reusable UI clearly

Not every action leads to a different page. A rejected login, for example, may leave the user on the sign-in page. Model that outcome with an operation and an observation that make sense for the page, then let the test assert the expected error text. Likewise, factor repeated page regions into components when doing so reduces selector duplication and keeps responsibilities understandable.

Rank #4
Sale
UGREEN USB to USB C Adapter Combo 4-Pack, 10Gbps USB C Converter Space Gray
  • Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
  • Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
  • Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
  • Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
  • Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft

Page objects should expose the page’s services rather than the underlying driver as a general-purpose escape hatch. If tests routinely reach through a page object to use its driver or raw locators, the object may not be providing a useful interface.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Common implementation problems

  • Selectors appear in tests and page classes. Move page-specific selectors into the relevant page or component object so a UI change has one natural repair point.
  • Page methods contain scenario assertions. Return observations or destination objects and make the test responsible for deciding whether the scenario passed.
  • One class represents an entire complex screen. Split out repeated, discrete sections when that improves reuse and clarity.
  • Every page exposes WebDriver. Prefer page-level operations; broad driver access weakens encapsulation.
  • PageFactory is treated as mandatory. It is optional; direct By locators are a supported POM approach.
  • A tutorial’s old dependency versions are copied without checking. The Selenium material cited here does not establish a current dependency version or Java minimum. Consult Selenium’s official installation and getting-started documentation before choosing build settings.

Setup and version considerations

Selenium describes WebDriver as its browser-driving interface, and its project overview says Selenium Manager handles browser and driver management by default in Selenium bindings. The Page Object design itself does not depend on a particular browser driver or test framework. The official documentation site reported a modification date of September 16, 2026; that date is not a Selenium release number.

This guide therefore does not prescribe a Selenium version, Java minimum, Maven coordinate, JUnit or TestNG choice, browser compatibility matrix, or timing strategy. Those details are version- and project-dependent; verify them against the current Selenium documentation and your application’s test environment.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Anker USB C Hub, 5-in-1 USBC to HDMI Splitter with 4K Display
  • 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
  • Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
  • Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
  • HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
  • What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.

Or skip the browser setup

If your goal is to capture a website rather than exercise it as an interactive Selenium test, ScreenshotNeo provides a screenshot API and MCP server. One GET request can return a screenshot or PDF. Its clean-shot processing can accept consent banners and remove known consent platforms, newsletter popups, and chat widgets before capture. Bot checks, blank pages, and failed loads are not billed; responses identify page verdict and billing headers. An MCP server exposes screenshot tools for AI agents.

Here is the cURL call; see the ScreenshotNeo API documentation for options.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. These captures do not replace Selenium when you need to interact with a browser, validate application behavior, or assert a test scenario.

Sign up for ScreenshotNeo’s free plan to get 1,000 screenshots a month with no card.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Frequently Asked Questions

Can I use the Page Object Model without PageFactory?

Yes. Direct private `By` locators in page classes are a valid approach and appear in Selenium’s official Page Object example.

Should each test have its own page object?

No. Page objects represent pages or reusable components, not individual tests; multiple tests can use the same page services.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.