53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
"""Hand-written fakes of the Selenium driver and elements."""
|
|
|
|
from typing import Any
|
|
|
|
from selenium.common.exceptions import ElementClickInterceptedException
|
|
|
|
|
|
class FakeElement:
|
|
def __init__(
|
|
self, intercepted: bool = False, children: list["FakeElement"] | None = None
|
|
) -> None:
|
|
self.intercepted = intercepted
|
|
self.children = children or []
|
|
self.clicks = 0
|
|
self.typed: list[str] = []
|
|
|
|
def click(self) -> None:
|
|
if self.intercepted:
|
|
raise ElementClickInterceptedException("blocked")
|
|
self.clicks += 1
|
|
|
|
def send_keys(self, text: str) -> None:
|
|
self.typed.append(text)
|
|
|
|
def find_elements(self, by: str, value: str) -> list["FakeElement"]:
|
|
return self.children
|
|
|
|
|
|
class FakeDriver:
|
|
def __init__(self, present: dict[str, list[FakeElement]]) -> None:
|
|
self.present = present
|
|
self.visited: list[str] = []
|
|
self.scripts: list[tuple[str, Any]] = []
|
|
self.quit_calls = 0
|
|
|
|
def quit(self) -> None:
|
|
self.quit_calls += 1
|
|
|
|
def get(self, url: str) -> None:
|
|
self.visited.append(url)
|
|
|
|
def find_elements(self, by: str, value: str) -> list[FakeElement]:
|
|
return self.present.get(value, [])
|
|
|
|
def find_element(self, by: str, value: str) -> FakeElement:
|
|
found = self.find_elements(by, value)
|
|
if not found:
|
|
raise LookupError(value)
|
|
return found[0]
|
|
|
|
def execute_script(self, script: str, *args: Any) -> None:
|
|
self.scripts.append((script, args[0]))
|