Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Use a separate WebDriver for each test worker thread, store that reference in a ThreadLocal<WebDriver>, and call quit() followed by remove() in teardown. This keeps parallel tests from sharing a driver reference; it does not make one shared driver thread-safe. Create, use, and close each driver on the same thread.
What ThreadLocal does for Selenium WebDriver
Java’s ThreadLocal<T> gives each thread that accesses a particular ThreadLocal instance its own value. With Selenium, that means each concurrently executing test thread can hold its own WebDriver reference instead of reading a single shared static driver. The Java SE 26 API documents this per-thread behavior and the lazy initializer provided by withInitial: Java ThreadLocal API.
The key ownership rule is simple: create the driver on the test thread, use it only on that thread, and quit it there. ThreadLocal is an access and ownership pattern; it does not coordinate test data, make unrelated static state safe, or ensure a test runner uses the same thread for setup, test execution, and teardown. Confirm that your runner’s lifecycle preserves that assumption.
Use explicit setup and guaranteed teardown
For test frameworks, explicit initialization is often easiest to reason about: setup registers a driver only after construction succeeds, and teardown can inspect the current thread’s value without accidentally creating a browser session.
Recommended Free Tools
#1 Best Overall
- 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.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public final class DriverStore {
private static final ThreadLocal<WebDriver> DRIVER = new ThreadLocal<>();
private DriverStore() {}
public static void start() {
DRIVER.set(new ChromeDriver());
}
public static WebDriver getDriver() {
WebDriver driver = DRIVER.get();
if (driver == null) {
throw new IllegalStateException(
"WebDriver has not been started on this thread");
}
return driver;
}
public static void quitDriver() {
WebDriver driver = DRIVER.get();
try {
if (driver != null) {
driver.quit();
}
} finally {
DRIVER.remove();
}
}
}
This example uses Selenium’s ChromeDriver; adapt driver construction to the browser and Selenium configuration in your project. It is an implementation pattern assembled from Java’s API contract and Selenium’s guidance, not a Selenium-provided sample.
Wire it into the test lifecycle
Call start() in the runner’s per-test setup hook, and put quitDriver() in an always-run teardown hook. The teardown must run after assertion failures and exceptions as well as successful tests.
Rank #2
- 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.
// Framework-neutral lifecycle sketch
beforeEach(() -> DriverStore.start());
try {
runTestBody();
} finally {
DriverStore.quitDriver();
}
The sketch shows the required ordering, not a specific JUnit or TestNG API. Selenium’s organization page lists both JUnit and TestNG for Java, and notes that its test-runner information is incomplete; use the documentation for the runner version pinned in your project when selecting exact annotations or hooks: Selenium test runners.
Why both quit() and remove() are necessary
driver.quit()closes the browser session.DRIVER.remove()clears the value associated with the current worker thread.
Thread pools keep worker threads alive and reuse them. Java’s guidance warns that thread-local values can remain for a thread’s lifetime unless removed, potentially allowing state from one task to be encountered by a later task. See Oracle’s thread-local lifecycle guidance. Putting remove() in finally ensures it still runs if quit() throws.
Free tools Windows power users keep installed
One-click scans. No signup required.
Rank #3
- 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.
When lazy initialization is appropriate
ThreadLocal.withInitial can create a value on the first get() for each thread. That can be convenient when every access should start a browser:
private static final ThreadLocal<WebDriver> DRIVER =
ThreadLocal.withInitial(ChromeDriver::new);
public static WebDriver getDriver() {
return DRIVER.get();
}
But get() invokes the initializer when the current thread has no value. If teardown calls get() before setup ever opened a browser, it can create a new session just to close it. Prefer explicit initialization and a plain new ThreadLocal<>() when setup and cleanup must be distinct, or otherwise design teardown so it can check whether a value exists without triggering initialization.
Rank #4
- 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
Use ThreadGuard as a diagnostic, not a substitute
Selenium’s Java ThreadGuard checks that calls to a driver are made on the thread that created it. It can help expose accidental cross-thread use:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ThreadGuard;
WebDriver driver = ThreadGuard.protect(new ChromeDriver());
Do not pass that driver reference to a different worker thread. Selenium explicitly says ThreadGuard “does not replace the need for using ThreadLocal to manage drivers when running parallel.” See the Selenium ThreadGuard documentation.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchPC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Best Value
- 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.
Local drivers and Selenium Grid solve different problems
ThreadLocal organizes driver references inside the test process. Grid handles where browser sessions run: Selenium Grid routes commands to remote browser instances and supports parallel execution across machines and browser/platform combinations. A remote driver still belongs to the test thread that created and uses it.
| Execution choice | Where the browser runs | Main purpose | ThreadLocal implication |
|---|---|---|---|
| Local WebDriver | On the test machine | Local development or a single-machine test suite | Keep one driver per concurrently executing test thread. |
| RemoteWebDriver through Grid | On a remote Grid node | Parallel execution across machines, browsers, or platforms | Keep each test’s driver reference on its executing thread. |
See Selenium Grid documentation and the Selenium WebDriver overview. Choosing local versus remote execution does not remove the need to manage each session’s lifecycle.
Common errors and fixes
- Cross-thread access error: a test or helper invoked a driver from a thread other than its creator. Keep driver operations on the owning test thread; pass test data between threads, not the driver reference. ThreadGuard can help identify this mistake.
- A later test sees the wrong browser or state: teardown likely failed to remove the thread-local value, or lifecycle hooks are not running as expected. Ensure
quit()andremove()execute in an always-run cleanup path. - A browser opens during teardown: cleanup likely called
get()on awithInitialThreadLocal with no value. Use explicit setup, or avoid invoking the lazy initializer during cleanup. - No driver has been started on this thread:
getDriver()ran before setup, or setup ran on another thread. Start the driver in the same worker thread that will use it, and verify that setup, test body, and teardown stay on that thread. - Browser session remains open after a failed test: cleanup was skipped or interrupted. Place
remove()infinally, and ensure the runner invokes teardown for failed tests.
Or skip the browser setup
If your goal is to capture a webpage rather than run browser automation tests, ScreenshotNeo offers a one-request screenshot API. It is separate from Selenium and does not replace a WebDriver test suite.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo API documentation. Cookie banners, popups, and chat widgets are removed before capture; bot checks, blank pages, and failed loads are never billed. An MCP server lets AI agents take screenshots, and the free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000. Learn about ScreenshotNeo, or sign up free.
Frequently Asked Questions
Does ThreadLocal make WebDriver thread-safe?
No. It gives each thread its own driver reference; the driver should still be used only by the thread that created it.
Does ThreadGuard replace ThreadLocal?
No. ThreadGuard detects cross-thread driver calls; Selenium says parallel driver management still needs ThreadLocal.
Quick Recap
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.

