Skip to main content
SeleniumDecoded

Selenium Cheat Sheet

Quick reference for common Selenium commands

Setup

ChromeDriver

J WebDriver driver = new ChromeDriver();
Py driver = webdriver.Chrome()
JS const driver = new Builder().forBrowser('chrome').build();
C# IWebDriver driver = new ChromeDriver();

FirefoxDriver

J WebDriver driver = new FirefoxDriver();
Py driver = webdriver.Firefox()
JS const driver = new Builder().forBrowser('firefox').build();
C# IWebDriver driver = new FirefoxDriver();

Headless Mode

J options.addArguments("--headless");
Py options.add_argument("--headless")
JS options.addArguments("--headless");
C# options.AddArgument("--headless");

Navigation

Open URL

J driver.get("https://example.com");
Py driver.get("https://example.com")
JS await driver.get("https://example.com");
C# driver.Navigate().GoToUrl("https://example.com");

Back

J driver.navigate().back();
Py driver.back()
JS await driver.navigate().back();
C# driver.Navigate().Back();

Forward

J driver.navigate().forward();
Py driver.forward()
JS await driver.navigate().forward();
C# driver.Navigate().Forward();

Refresh

J driver.navigate().refresh();
Py driver.refresh()
JS await driver.navigate().refresh();
C# driver.Navigate().Refresh();

Locators

By ID

J driver.findElement(By.id("id"));
Py driver.find_element(By.ID, "id")
JS await driver.findElement(By.id("id"));
C# driver.FindElement(By.Id("id"));

By Name

J driver.findElement(By.name("name"));
Py driver.find_element(By.NAME, "name")
JS await driver.findElement(By.name("name"));
C# driver.FindElement(By.Name("name"));

By CSS

J driver.findElement(By.cssSelector(".class"));
Py driver.find_element(By.CSS_SELECTOR, ".class")
JS await driver.findElement(By.css(".class"));
C# driver.FindElement(By.CssSelector(".class"));

By XPath

J driver.findElement(By.xpath("//div[@id='x']"));
Py driver.find_element(By.XPATH, "//div[@id='x']")
JS await driver.findElement(By.xpath("//div[@id='x']"));
C# driver.FindElement(By.XPath("//div[@id='x']"));

By Link Text

J driver.findElement(By.linkText("Click me"));
Py driver.find_element(By.LINK_TEXT, "Click me")
JS await driver.findElement(By.linkText("Click me"));
C# driver.FindElement(By.LinkText("Click me"));

By Class Name

J driver.findElement(By.className("class"));
Py driver.find_element(By.CLASS_NAME, "class")
JS await driver.findElement(By.className("class"));
C# driver.FindElement(By.ClassName("class"));

Actions

Click

J element.click();
Py element.click()
JS await element.click();
C# element.Click();

Type Text

J element.sendKeys("text");
Py element.send_keys("text")
JS await element.sendKeys("text");
C# element.SendKeys("text");

Clear Input

J element.clear();
Py element.clear()
JS await element.clear();
C# element.Clear();

Get Text

J String text = element.getText();
Py text = element.text
JS const text = await element.getText();
C# string text = element.Text;

Get Attribute

J String value = element.getAttribute("href");
Py value = element.get_attribute("href")
JS const value = await element.getAttribute("href");
C# string value = element.GetAttribute("href");

Submit Form

J element.submit();
Py element.submit()
JS await element.submit();
C# element.Submit();

Waits

Implicit Wait

J driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
Py driver.implicitly_wait(10)
JS await driver.manage().setTimeouts({ implicit: 10000 });
C# driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);

Explicit Wait

J WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
Py wait = WebDriverWait(driver, 10)
JS const wait = new WebDriverWait(driver, 10000);
C# WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

Wait for Visible

J wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("id")));
Py wait.until(EC.visibility_of_element_located((By.ID, "id")))
JS await wait.until(until.elementIsVisible(el));
C# wait.Until(ExpectedConditions.ElementIsVisible(By.Id("id")));

Wait for Clickable

J wait.until(ExpectedConditions.elementToBeClickable(By.id("id")));
Py wait.until(EC.element_to_be_clickable((By.ID, "id")))
JS await wait.until(until.elementIsEnabled(el));
C# wait.Until(ExpectedConditions.ElementToBeClickable(By.Id("id")));

Browser Info

Page Title

J String title = driver.getTitle();
Py title = driver.title
JS const title = await driver.getTitle();
C# string title = driver.Title;

Current URL

J String url = driver.getCurrentUrl();
Py url = driver.current_url
JS const url = await driver.getCurrentUrl();
C# string url = driver.Url;

Page Source

J String source = driver.getPageSource();
Py source = driver.page_source
JS const source = await driver.getPageSource();
C# string source = driver.PageSource;

Windows & Frames

Switch to Frame

J driver.switchTo().frame("frameName");
Py driver.switch_to.frame("frameName")
JS await driver.switchTo().frame("frameName");
C# driver.SwitchTo().Frame("frameName");

Switch to Default

J driver.switchTo().defaultContent();
Py driver.switch_to.default_content()
JS await driver.switchTo().defaultContent();
C# driver.SwitchTo().DefaultContent();

New Window

J driver.switchTo().newWindow(WindowType.WINDOW);
Py driver.switch_to.new_window("window")
JS await driver.switchTo().newWindow("window");
C# driver.SwitchTo().NewWindow(WindowType.Window);

Get Window Handle

J String handle = driver.getWindowHandle();
Py handle = driver.current_window_handle
JS const handle = await driver.getWindowHandle();
C# string handle = driver.CurrentWindowHandle;

Cleanup

Close Window

J driver.close();
Py driver.close()
JS await driver.close();
C# driver.Close();

Quit Browser

J driver.quit();
Py driver.quit()
JS await driver.quit();
C# driver.Quit();

Explicit Waits

Create Wait

J WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
Py wait = WebDriverWait(driver, 10)
JS // await driver.wait(condition, 10000)
C# var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

Wait Visible

J wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("x")));
Py wait.until(EC.visibility_of_element_located((By.ID, "x")))
JS await driver.wait(until.elementIsVisible(driver.findElement(By.id("x"))), 10000);
C# wait.Until(d => d.FindElement(By.Id("x")).Displayed);

Wait Clickable

J wait.until(ExpectedConditions.elementToBeClickable(By.id("x")));
Py wait.until(EC.element_to_be_clickable((By.ID, "x")))
JS await driver.wait(until.elementIsEnabled(el), 10000);
C# wait.Until(d => { var e = d.FindElement(By.Id("x")); return e.Displayed && e.Enabled; });

Wait Invisible

J wait.until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector(".spinner")));
Py wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".spinner")))
JS await driver.wait(async () => !(await driver.findElements(By.css(".spinner"))).length, 10000);
C# wait.Until(d => d.FindElements(By.CssSelector(".spinner")).All(e => !e.Displayed));

Wait URL / Text

J wait.until(ExpectedConditions.urlContains("/done")); wait.until(ExpectedConditions.textToBe(By.id("t"), "OK"));
Py wait.until(EC.url_contains("/done")); wait.until(EC.text_to_be_present_in_element((By.ID, "t"), "OK"))
JS await driver.wait(until.urlContains("/done"), 10000);
C# wait.Until(d => d.Url.Contains("/done"));

Custom Lambda

J wait.until(d -> d.findElements(By.cssSelector("tr")).size() >= 5);
Py wait.until(lambda d: len(d.find_elements(By.CSS_SELECTOR, "tr")) >= 5)
JS await driver.wait(async () => (await driver.findElements(By.css("tr"))).length >= 5, 10000);
C# wait.Until(d => d.FindElements(By.CssSelector("tr")).Count >= 5);

Timeouts & Load Strategy

Page Load Timeout

J driver.manage().timeouts().pageLoadTimeout(Duration.ofSeconds(30));
Py driver.set_page_load_timeout(30)
JS await driver.manage().setTimeouts({ pageLoad: 30000 });
C# driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(30);

Implicit Wait (keep 0)

J driver.manage().timeouts().implicitlyWait(Duration.ZERO);
Py driver.implicitly_wait(0)
JS await driver.manage().setTimeouts({ implicit: 0 });
C# driver.Manage().Timeouts().ImplicitWait = TimeSpan.Zero;

Eager Load Strategy

J options.setPageLoadStrategy(PageLoadStrategy.EAGER);
Py options.page_load_strategy = "eager"
JS options.setPageLoadStrategy("eager");
C# options.PageLoadStrategy = PageLoadStrategy.Eager;

Element Info

Text

J String t = element.getText();
Py t = element.text
JS const t = await element.getText();
C# string t = element.Text;

Attribute / Property

J element.getDomAttribute("href"); element.getDomProperty("value");
Py element.get_dom_attribute("href"); element.get_property("value")
JS await element.getAttribute("href"); await element.getProperty("value");
C# element.GetDomAttribute("href"); element.GetDomProperty("value");

Displayed / Enabled / Selected

J element.isDisplayed(); element.isEnabled(); element.isSelected();
Py element.is_displayed(); element.is_enabled(); element.is_selected()
JS await element.isDisplayed(); await element.isEnabled(); await element.isSelected();
C# element.Displayed; element.Enabled; element.Selected;

CSS Value / Rect

J element.getCssValue("color"); element.getRect();
Py element.value_of_css_property("color"); element.rect
JS await element.getCssValue("color"); await element.getRect();
C# element.GetCssValue("color"); element.Size; element.Location;

Element Screenshot

J element.getScreenshotAs(OutputType.FILE);
Py element.screenshot("el.png")
JS await element.takeScreenshot();
C# ((ITakesScreenshot)element).GetScreenshot().SaveAsFile("el.png");

Select Dropdowns

By Visible Text

J new Select(el).selectByVisibleText("UK");
Py Select(el).select_by_visible_text("UK")
JS await new Select(el).selectByVisibleText("UK");
C# new SelectElement(el).SelectByText("UK");

By Value / Index

J select.selectByValue("uk"); select.selectByIndex(2);
Py select.select_by_value("uk"); select.select_by_index(2)
JS await select.selectByValue("uk"); await select.selectByIndex(2);
C# select.SelectByValue("uk"); select.SelectByIndex(2);

Selected Option

J select.getFirstSelectedOption().getText();
Py select.first_selected_option.text
JS await (await select.getFirstSelectedOption()).getText();
C# select.SelectedOption.Text;

Actions API

Hover

J new Actions(driver).moveToElement(el).perform();
Py ActionChains(driver).move_to_element(el).perform()
JS await driver.actions().move({ origin: el }).perform();
C# new Actions(driver).MoveToElement(el).Perform();

Right / Double Click

J actions.contextClick(el).perform(); actions.doubleClick(el).perform();
Py actions.context_click(el).perform(); actions.double_click(el).perform()
JS await driver.actions().contextClick(el).perform(); await driver.actions().doubleClick(el).perform();
C# actions.ContextClick(el).Perform(); actions.DoubleClick(el).Perform();

Drag and Drop

J actions.dragAndDrop(source, target).perform();
Py actions.drag_and_drop(source, target).perform()
JS await driver.actions().dragAndDrop(source, target).perform();
C# actions.DragAndDrop(source, target).Perform();

Scroll (4.2+)

J actions.scrollToElement(el).perform(); actions.scrollByAmount(0, 500).perform();
Py actions.scroll_to_element(el).perform(); actions.scroll_by_amount(0, 500).perform()
JS await driver.actions().scroll(0, 0, 0, 500).perform();
C# actions.ScrollToElement(el).Perform(); actions.ScrollByAmount(0, 500).Perform();

Key Chord

J el.sendKeys(Keys.chord(Keys.CONTROL, "a"));
Py el.send_keys(Keys.CONTROL + "a")
JS await el.sendKeys(Key.chord(Key.CONTROL, "a"));
C# el.SendKeys(Keys.Control + "a");

Alerts

Wait & Switch

J Alert a = wait.until(ExpectedConditions.alertIsPresent());
Py a = wait.until(EC.alert_is_present())
JS await driver.wait(until.alertIsPresent(), 5000); const a = await driver.switchTo().alert();
C# var a = wait.Until(d => d.SwitchTo().Alert());

Accept / Dismiss

J a.accept(); a.dismiss();
Py a.accept(); a.dismiss()
JS await a.accept(); await a.dismiss();
C# a.Accept(); a.Dismiss();

Text / Type

J a.getText(); a.sendKeys("yes");
Py a.text; a.send_keys("yes")
JS await a.getText(); await a.sendKeys("yes");
C# a.Text; a.SendKeys("yes");

Unhandled Policy

J options.setUnhandledPromptBehaviour(UnexpectedAlertBehaviour.DISMISS_AND_NOTIFY);
Py options.unhandled_prompt_behavior = "dismiss and notify"
JS .withCapabilities({ unhandledPromptBehavior: "dismiss and notify" })
C# options.UnhandledPromptBehavior = UnhandledPromptBehavior.DismissAndNotify;

Cookies & Storage

Get Cookie

J driver.manage().getCookieNamed("session");
Py driver.get_cookie("session")
JS await driver.manage().getCookie("session");
C# driver.Manage().Cookies.GetCookieNamed("session");

Add Cookie

J driver.manage().addCookie(new Cookie("k", "v"));
Py driver.add_cookie({"name": "k", "value": "v"})
JS await driver.manage().addCookie({ name: "k", value: "v" });
C# driver.Manage().Cookies.AddCookie(new Cookie("k", "v"));

Delete All

J driver.manage().deleteAllCookies();
Py driver.delete_all_cookies()
JS await driver.manage().deleteAllCookies();
C# driver.Manage().Cookies.DeleteAllCookies();

localStorage

J js.executeScript("localStorage.setItem(arguments[0], arguments[1])", "k", "v");
Py driver.execute_script("localStorage.setItem(arguments[0], arguments[1])", "k", "v")
JS await driver.executeScript("localStorage.setItem(arguments[0], arguments[1])", "k", "v");
C# js.ExecuteScript("localStorage.setItem(arguments[0], arguments[1])", "k", "v");

JavaScript & Screenshots

Execute Script

J ((JavascriptExecutor) driver).executeScript("return document.title");
Py driver.execute_script("return document.title")
JS await driver.executeScript("return document.title");
C# ((IJavaScriptExecutor)driver).ExecuteScript("return document.title");

Scroll Into View

J js.executeScript("arguments[0].scrollIntoView({block:'center'})", el);
Py driver.execute_script("arguments[0].scrollIntoView({block:'center'})", el)
JS await driver.executeScript("arguments[0].scrollIntoView({block:'center'})", el);
C# js.ExecuteScript("arguments[0].scrollIntoView({block:'center'})", el);

Page Screenshot

J ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
Py driver.save_screenshot("page.png")
JS fs.writeFileSync("page.png", await driver.takeScreenshot(), "base64");
C# ((ITakesScreenshot)driver).GetScreenshot().SaveAsFile("page.png");

Print to PDF (4.x)

J Pdf pdf = ((PrintsPage) driver).print(new PrintOptions());
Py pdf = driver.print_page(PrintOptions())
JS const pdf = await driver.printPage({});
C# var pdf = driver.Print(new PrintOptions());

Shadow DOM & Relative Locators

Shadow Root

J host.getShadowRoot().findElement(By.cssSelector("input"));
Py host.shadow_root.find_element(By.CSS_SELECTOR, "input")
JS (await host.getShadowRoot()).findElement(By.css("input"));
C# host.GetShadowRoot().FindElement(By.CssSelector("input"));

Relative: Above

J driver.findElement(with(By.tagName("input")).above(password));
Py driver.find_element(locate_with(By.TAG_NAME, "input").above(password))
JS await driver.findElement(locateWith(By.tagName("input")).above(password));
C# driver.FindElement(RelativeBy.WithLocator(By.TagName("input")).Above(password));

Relative: Near

J with(By.tagName("button")).near(label)
Py locate_with(By.TAG_NAME, "button").near(label)
JS locateWith(By.tagName("button")).near(label)
C# RelativeBy.WithLocator(By.TagName("button")).Near(label)

BiDi Essentials (4.x)

Enable BiDi

J options.setCapability("webSocketUrl", true);
Py options.enable_bidi = True
JS options.enableBidi();
C# new ChromeOptions { UseWebSocketUrl = true }

Console Messages

J driver.script().addConsoleMessageHandler(e -> log(e.getText()));
Py driver.script.add_console_message_handler(lambda e: print(e.text))
JS await driver.script().addConsoleMessageHandler(e => console.log(e.text));
C# await bidi.Log.OnEntryAddedAsync(e => Console.WriteLine(e.Text));

JS Errors

J driver.script().addJavaScriptErrorHandler(e -> errors.add(e.getText()));
Py driver.script.add_javascript_error_handler(errors.append)
JS await driver.script().addJavaScriptErrorHandler(e => errors.push(e.text));
C# // filter Log entries where Level == "error"

Basic Auth

J driver.network().addAuthenticationHandler(new UsernameAndPassword("u", "p"));
Py driver.network.add_auth_handler("u", "p")
JS await driver.network().addAuthenticationHandler("u", "p");
C# await bidi.Network.OnAuthRequiredAsync(e => e.Request.ContinueWithAuthAsync(new AuthCredentials("u", "p")));

Block Request

J network.onBeforeRequestSent(e -> network.failRequest(e.getRequest().getRequestId()));
Py driver.network.add_request_handler(["**/analytics/**"], lambda r: r.fail())
JS await network.beforeRequestSent(e => network.failRequest(e.request.request));
C# await bidi.Network.InterceptRequestAsync(e => e.Request.FailAsync());

Browser Options

Window Size Arg

J options.addArguments("--window-size=1366,768");
Py options.add_argument("--window-size=1366,768")
JS options.addArguments("--window-size=1366,768");
C# options.AddArgument("--window-size=1366,768");

Pin Browser Version

J options.setBrowserVersion("128");
Py options.browser_version = "128"
JS options.setBrowserVersion("128");
C# options.BrowserVersion = "128";

Accept Insecure Certs

J options.setAcceptInsecureCerts(true);
Py options.accept_insecure_certs = True
JS options.setAcceptInsecureCerts(true);
C# options.AcceptInsecureCertificates = true;

Mobile Emulation (Chrome)

J options.setExperimentalOption("mobileEmulation", Map.of("deviceName", "Pixel 7"));
Py options.add_experimental_option("mobileEmulation", {"deviceName": "Pixel 7"})
JS options.setMobileEmulation({ deviceName: "Pixel 7" });
C# options.EnableMobileEmulation("Pixel 7");

Remote / Grid

J new RemoteWebDriver(new URL("http://grid:4444"), options);
Py webdriver.Remote("http://grid:4444", options=options)
JS new Builder().usingServer("http://grid:4444").setChromeOptions(options).build();
C# new RemoteWebDriver(new Uri("http://grid:4444"), options);