What is $$ and $x in Chrome Javascript console?
Categories:
Demystifying $$ and $x in Chrome's JavaScript Console

Uncover the powerful, yet often overlooked, utility functions $$
and $x
available directly within the Chrome DevTools JavaScript console for efficient DOM manipulation and XPath queries.
The Chrome DevTools JavaScript console is a powerful environment for debugging, testing, and interacting with web pages. Beyond standard JavaScript, it offers a suite of command-line utilities that can significantly boost your productivity. Among these, $$
and $x
are particularly useful for quickly selecting and inspecting DOM elements. This article will dive into what these functions are, how they work, and when to use them to streamline your development workflow.
Understanding $$ (CSS Selector Query)
The $$
function in the Chrome console is a shorthand for document.querySelectorAll()
. It allows you to select all elements that match a given CSS selector and returns them as an array of DOM nodes. This is incredibly useful for quickly finding multiple elements on a page without having to type out the full document.querySelectorAll
method.
// Select all <a> tags on the page
$$('a');
// Select all elements with the class 'item'
$$('.item');
// Select all <li> elements inside a <ul> with id 'myList'
$$('#myList li');
// Select all buttons that are direct children of a div
$$('div > button');
Examples of using $$
with various CSS selectors.
$$
returns an array, it's not a live NodeList
like document.querySelectorAll()
. It's a static Array
of elements. This means if the DOM changes after you run $$
, the returned array won't automatically update.Understanding $x (XPath Query)
The $x
function is a specialized utility for querying the DOM using XPath expressions. XPath is a powerful language for navigating XML (and HTML) documents, allowing for more complex and flexible selections than CSS selectors in some scenarios. It returns an array of matching DOM elements.
// Select all <a> tags
$x('//a');
// Select all <div> elements that have a 'data-id' attribute
$x('//div[@data-id]');
// Select all <li> elements whose text content contains 'Example'
$x("//li[contains(text(), 'Example')]");
// Select the parent of an element with id 'myElement'
$x('//*[@id="myElement"]/..');
Examples of using $x
with various XPath expressions.
When to Use Which: $$ vs. $x
Choosing between $$
and $x
depends on the complexity and nature of your DOM query. Generally, $$
(CSS selectors) is preferred for its simplicity and readability when the selection can be achieved with standard CSS. $x
(XPath) becomes invaluable for more advanced scenarios where CSS selectors fall short.
flowchart TD A[Start Query] --> B{Can CSS Selector achieve this?} B -- Yes --> C[Use $$ (CSS Selector)] B -- No --> D{Need complex text/attribute/relationship query?} D -- Yes --> E[Use $x (XPath)] D -- No --> F[Re-evaluate query or consider other methods] C --> G[End] E --> G[End]
Decision flow for choosing between $$
and $x
.
Consider the following use cases:
1. Simple Element Selection
If you need to select elements by tag name, class, ID, or basic attribute, $$
is usually the faster and more readable choice. For example, finding all div
elements or all elements with a specific class.
2. Text Content Based Selection
When you need to find elements based on their inner text content (e.g., an <a>
tag that says 'Click Me'), $x
with contains(text(), '...')
or text() = '...'
is the way to go, as CSS selectors cannot directly query text content.
3. Complex Attribute Matching
For attributes with specific values or patterns that are hard to express with CSS (e.g., an attribute that starts with a certain string, but not just [attr^='value']
), XPath offers more flexibility.
4. Navigating Relative to Other Elements
If you need to select an element based on its relationship to another element (e.g., 'find the parent of this element', 'find the sibling after this one'), XPath's axis navigators (like parent::
, following-sibling::
) are extremely powerful.
$x
for simple selections can make your console commands less intuitive for others (or your future self) who might be more familiar with CSS selectors. Use the right tool for the job.