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

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

To hide a div in Selenium, locate it and run JavaScript that changes its inline style. Selenium has no separate hide() method:

from selenium.webdriver.common.by import By

element = driver.find_element(By.CSS_SELECTOR, "div#target")
driver.execute_script(
    "arguments[0].style.display = 'none';",
    element,
)

display: none removes the element from layout while leaving its node in the DOM. The sections below show reliable selectors, waits for dynamic pages, verification, iframe and shadow-DOM handling, alternatives such as visibility: hidden or removal, and fixes for changes that a framework later overwrites.

Hide a div with execute_script

WebDriver.execute_script(script, *args) runs JavaScript synchronously in the current browsing context. Passing the located WebElement as an argument is safer than interpolating a selector into JavaScript because WebDriver supplies the node directly.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
from selenium import webdriver
from selenium.webdriver.common.by import By

# driver is already configured and the page has been opened
driver.get("https://example.com")

target = driver.find_element(By.CSS_SELECTOR, "div#target")
driver.execute_script("arguments[0].style.display = 'none';", target)

After this call, the element remains queryable in the DOM, but the browser does not render it and it occupies no layout space. If the page has several matching elements, use a more specific selector or select the intended item from find_elements.

Use a stable locator

  • Prefer an ID, a data-* attribute, or a short class-and-attribute selector supplied by the application.
  • Avoid absolute XPath such as /html/body/div[3]/div[2]; small layout changes can invalidate it.
  • Confirm that the selector identifies the component you intend to hide, not a wrapper containing unrelated content.

Wait for a dynamically rendered div

Single-page applications often create the element after the initial navigation. Locate it only after Selenium observes it in the DOM:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

locator = (By.CSS_SELECTOR, "div#target")
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located(locator)
)
driver.execute_script("arguments[0].style.display = 'none';", element)

presence_of_element_located waits for a node to exist; it does not require the node to be visible. That makes it useful when the page inserts a hidden or transitioning component before showing it. If you need the element to be interactable before changing it, wait for visibility_of_element_located instead.

When the page replaces the node

React, Vue, and other rendering systems can reconcile the DOM after your script runs. A replacement node does not inherit the old node’s inline style. Wait for the final render, apply the mutation after the state change that creates the component, or use the component’s own hidden-state class or UI action. If the page repeatedly recreates the node, a one-time script is not a durable state change.

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

Verify that Selenium hid the element

The most useful postcondition is Selenium’s expected condition for invisibility:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 10).until(
    EC.invisibility_of_element_located(locator)
)

This condition succeeds when the located element is invisible or no longer present. It therefore covers both display: none and a framework that removes the node. For a direct assertion, keep the element reference and inspect its displayed state:

assert not element.is_displayed(), "The div is still displayed"

Use the locator-based wait when re-rendering is possible: an old WebElement can become stale, while the locator can find the replacement.

Check the computed result in the browser

An inline declaration can be inspected with JavaScript:

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
display_value = driver.execute_script(
    "return getComputedStyle(arguments[0]).display;",
    element,
)
assert display_value == "none"

This checks the browser’s computed style, not merely whether your assignment was written to the style attribute.

Choose the right hiding technique

Technique Layout space DOM node Typical use Main caveat
style.display = 'none' Removed Retained Temporarily suppress a panel, banner, or test fixture A later render or stronger rule can overwrite it
style.visibility = 'hidden' Retained Retained Hide pixels while preserving the page’s geometry The blank space remains
Toggle a page-defined class Defined by the class Retained Application-owned visual state The class must be part of the page’s CSS contract
arguments[0].remove() Removed Deleted When the test specifically needs the node gone Later locators cannot find that node

Set visibility: hidden

driver.execute_script(
    "arguments[0].style.visibility = 'hidden';",
    element,
)

Unlike display: none, this keeps the element’s layout footprint. It can be appropriate when removing the element would shift content and invalidate coordinate-sensitive checks.

Toggle an application class

driver.execute_script(
    "arguments[0].classList.add('is-hidden');",
    element,
)

Use this when the application already defines .is-hidden. Its CSS may include transitions, accessibility behavior, or framework state that a raw inline style would bypass. If the page exposes a normal close button or menu action, exercising that UI is usually more representative of a user’s path.

Remove the node

driver.execute_script("arguments[0].remove();", element)

Removal is not hiding. It changes the DOM structure and can affect scripts that expect the node to exist. Verify absence with EC.invisibility_of_element_located or an explicit absence check rather than attempting to use the stale reference.

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

Handle iframes and shadow DOM

Div inside an iframe

WebDriver searches the current browsing context only. Switch to the frame before locating the target, then return to the top-level document when finished:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

frame = WebDriverWait(driver, 10).until(
    EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe#content"))
)
target = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "div#target"))
)
driver.execute_script("arguments[0].style.display = 'none';", target)
driver.switch_to.default_content()

The iframe element itself belongs to the parent document; its contents belong to the frame context. A selector that works in one context will not find a node in the other.

Div inside a shadow root

For an open shadow root, obtain the host’s shadow root and search within it:

host = driver.find_element(By.CSS_SELECTOR, "custom-panel")
shadow_root = host.shadow_root
target = shadow_root.find_element(By.CSS_SELECTOR, "div.target")
driver.execute_script("arguments[0].style.display = 'none';", target)

Closed shadow roots intentionally prevent ordinary WebDriver access. In that case, use a supported application hook or test the component through its public UI rather than trying to pierce the boundary.

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

Why the style may appear not to work

The selector raises NoSuchElementException

The node may not exist yet, the selector may be wrong, or you may be in the wrong frame. Confirm the current URL and document, use an explicit wait, and switch into the relevant iframe before searching.

The wait times out

presence_of_element_located times out when the page never creates a matching node. Inspect the rendered markup in browser developer tools, check for a changed ID or class, and distinguish an element hidden by CSS from one that is absent entirely.

StaleElementReferenceException appears

The framework replaced the node after you located it. Discard the old reference, wait for the replacement using the locator, and run the script again. A locator-based invisibility wait is safer than asserting on a reference that may no longer belong to the document.

The div becomes visible again

A later render, navigation, animation, or stylesheet rule may restore visibility. Apply the change after the render that matters, toggle the application’s own state class, or wait for the state transition to finish. If a stylesheet uses a stronger declaration, inspect getComputedStyle and correct the page-owned rule rather than repeatedly fighting it with inline JavaScript.

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.

JavaScript executes in the wrong place

execute_script runs in the current window and document. It does not automatically cross an iframe boundary, and an element from another browsing context cannot be passed as though it were in the current one. Switch context first.

Hiding changes the test unexpectedly

display: none changes layout, hit testing, and the result of visibility conditions. If the test is about preserving geometry, use visibility: hidden; if it is about authentic user behavior, trigger the page’s close or dismiss control instead.

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

Make the operation reliable in a test suite

  • Encapsulate the action in a page-object method that accepts a locator.
  • Use one explicit wait with a bounded timeout instead of arbitrary sleeps.
  • Verify the postcondition immediately, before another action changes the page.
  • Capture the current frame and URL in failure logs so context errors are diagnosable.
  • Reapply the mutation only when a known render replaces the node; an uncontrolled polling loop can mask a real application bug.
  • Keep JavaScript small and pass values through WebDriver arguments rather than string-concatenating user data.

Or skip the browser setup

If your goal is a clean image or PDF rather than an interactive Selenium test, ScreenshotNeo provides a website screenshot API. It accepts a URL in one request and can hide selectors, wait for a selector or network idle, run custom JavaScript, and capture a full page or a selected element. Before capture it accepts cookie/consent banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be disabled.

Only clean shots are billed. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and the response identifies the result with X-Page-Verdict and X-Billed headers. An MCP server supplies take_screenshot, get_page_info, and capture_pdf to Claude, Cursor, and other MCP clients.

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

cURL

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

Python

import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const fs = await import('node:fs/promises');
await fs.writeFile('shot.webp', Buffer.from(await res.arrayBuffer()));

See the ScreenshotNeo documentation for the complete option set, including dark mode, device presets, retina scale, PDF page ranges, custom headers and cookies, geolocation, request blocking, caching TTLs, signed links, asynchronous webhooks, bulk capture of up to 100 URLs per call, usage data, and the OpenAPI specification. The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots, and every feature is available on every plan. Create a free ScreenshotNeo account.

Frequently Asked Questions

Does Selenium have a built-in hide method for elements?

No. Use WebDriver’s JavaScript execution API to change CSS or DOM state, or invoke the page’s own control.

Will a hidden div still be found by a Selenium locator?

With display: none or visibility: hidden, the node remains in the DOM and can normally be located; visibility checks will report it as not displayed.

Should I hide a div or close it through the UI?

Use the UI action when you are testing user behavior. Use a direct style mutation when the test or capture specifically requires a controlled visual state.

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

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.