The $ command is a short way to call the findElement command in order to fetch a single element on the page. It returns an object that with an extended prototype to call action commands without passing in a selector. However if you still pass in a selector it will look for that element first and call the action on that element. You can also pass in an object as selector where the object contains a property element-6066-11e4-a52e-4f735466cecf with the value of a reference to an element. The command will then transform the reference to an extended WebdriverIO element.

Using the wdio testrunner this command is a global variable else it will be located on the browser object instead.

You can chain $ or $$ together in order to walk down the DOM tree.


For more information on how to select specific elements, check out the Selectors guide.

selectorString, Function, Objectselector or JS Function to fetch a certain element
<ul id="menu">
<li><a href="/">Home</a></li>
<li><a href="/">Developer Guide</a></li>
<li><a href="/">API</a></li>
<li><a href="/">Contribute</a></li>
it('should get text a menu link', () => {
const text = $('#menu');
console.log(text.$$('li')[2].$('a').getText()); // outputs: "API"
it('should get text a menu link - JS Function', () => {
const text = $(function() { // Arrow function is not allowed here.
// this is Window https://developer.mozilla.org/en-US/docs/Web/API/Window
// TypeScript users may do something like this
// return (this as Window).document.querySelector('#menu')
return this.document.querySelector('#menu'); // Element
console.log(text.$$('li')[2].$('a').getText()); // outputs: "API"
it('should allow to convert protocol result of an element into a WebdriverIO element', () => {
const activeElement = browser.getActiveElement();
console.log($(activeElement).getTagName()); // outputs active element