Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from collections.abc import Generator

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


@pytest.fixture(scope="session")
def driver() -> Generator[webdriver.Chrome, None, None]:
options = Options()
options.add_argument("--window-size=1440,900")
# options.add_argument("--headless=new")

driver = webdriver.Chrome(options=options)
yield driver
driver.quit()

42 changes: 42 additions & 0 deletions tests/test_basic_flow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from selenium.webdriver.common.by import By

from .utils import wait_for

BASE_URL = "https://the-internet.herokuapp.com"


def test_login_flow(driver):
driver.get(f"{BASE_URL}/login")

username = wait_for(driver, (By.ID, "username"))
username.send_keys("tomsmith")

password = driver.find_element(By.ID, "password")
password.send_keys("SuperSecretPassword!")

driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()

flash = wait_for(driver, (By.ID, "flash"))
assert "You logged into a secure area!" in flash.text


def test_checkboxes_and_dropdown(driver):
driver.get(f"{BASE_URL}/checkboxes")

checkbox1 = driver.find_element(By.CSS_SELECTOR, "#checkboxes input:nth-child(1)")
checkbox2 = driver.find_element(By.CSS_SELECTOR, "#checkboxes input:nth-child(3)")

if not checkbox1.is_selected():
checkbox1.click()

assert checkbox1.is_selected()
assert checkbox2.is_selected()

driver.get(f"{BASE_URL}/dropdown")
dropdown = wait_for(driver, (By.ID, "dropdown"))
dropdown.click()
dropdown.find_element(By.CSS_SELECTOR, "option[value='2']").click()

selected_text = dropdown.find_element(By.CSS_SELECTOR, "option:checked").text
assert selected_text == "Option 2"

76 changes: 76 additions & 0 deletions tests/test_corner_cases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait

from .utils import wait_for

FORM_URL = "https://www.selenium.dev/selenium/web/web-form.html"


def test_corner_case_controls(driver):
driver.get(FORM_URL)

text_input = wait_for(driver, (By.NAME, "my-text"))
text_input.send_keys("Hexlet Student")
text_input.send_keys(Keys.CONTROL, "a")
text_input.send_keys(Keys.DELETE)
text_input.send_keys("QA Student")
assert text_input.get_attribute("value") == "QA Student"

password = driver.find_element(By.NAME, "my-password")
textarea = driver.find_element(By.NAME, "my-textarea")
password.send_keys("SuperSecret123")
textarea.send_keys("Selenium corner cases demo.")

disabled = driver.find_element(By.NAME, "my-disabled")
readonly = driver.find_element(By.NAME, "my-readonly")
assert not disabled.is_enabled()
assert readonly.get_attribute("readonly") is not None

select = driver.find_element(By.NAME, "my-select")
select.find_element(By.CSS_SELECTOR, "option[value='2']").click()
selected_text = select.find_element(By.CSS_SELECTOR, "option:checked").text
assert selected_text == "Two"

datalist = wait_for(driver, (By.CSS_SELECTOR, "input[list]"))
datalist.send_keys("Ch")
WebDriverWait(driver, 5).until(
lambda drv: drv.find_element(By.CSS_SELECTOR, "input[list]").get_attribute("value").lower().startswith("ch")
)
datalist.send_keys(Keys.ARROW_DOWN)
datalist.send_keys(Keys.TAB)
datalist_value = driver.find_element(By.CSS_SELECTOR, "input[list]").get_attribute("value")
assert datalist_value.lower().startswith("ch")

checkbox = wait_for(driver, (By.NAME, "my-check"))
if not checkbox.is_selected():
checkbox.click()
assert checkbox.is_selected()

radio = driver.find_elements(By.NAME, "my-radio")[-1]
if not radio.is_selected():
radio.click()
assert radio.is_selected()

color = driver.find_element(By.NAME, "my-colors")
color.send_keys("#ff5733")
date = driver.find_element(By.NAME, "my-date")
date.clear()
date.send_keys("2025-01-15")
slider = driver.find_element(By.NAME, "my-range")
driver.execute_script(
"arguments[0].value = arguments[1]; arguments[0].dispatchEvent(new Event('input'));",
slider,
"7",
)
assert color.get_attribute("value") == "#ff5733"
assert date.get_attribute("value") == "2025-01-15"
assert slider.get_attribute("value") == "7"

submit_button = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
ActionChains(driver).move_to_element(submit_button).perform()
submit_button.click()

heading = wait_for(driver, (By.TAG_NAME, "h1"))
assert heading.text.strip() == "Form submitted"
13 changes: 13 additions & 0 deletions tests/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from typing import Tuple

from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

DEFAULT_WAIT = 10


def wait_for(driver: WebDriver, locator: Tuple[str, str], timeout: int = DEFAULT_WAIT) -> WebElement:
return WebDriverWait(driver, timeout).until(EC.visibility_of_element_located(locator))

Loading