mirror of
https://github.com/KenanZhu/AutoLibrary.git
synced 2026-06-17 23:13:03 +08:00
e77c561685
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
115 lines
2.9 KiB
Python
115 lines
2.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Copyright (c) 2026 KenanZhu.
|
|
All rights reserved.
|
|
|
|
This software is provided "as is", without any warranty of any kind.
|
|
You may use, modify, and distribute this file under the terms of the MIT License.
|
|
See the LICENSE file for details.
|
|
"""
|
|
from selenium.webdriver.remote.webdriver import WebDriver
|
|
from selenium.webdriver.remote.webelement import WebElement
|
|
from selenium.webdriver.support.ui import WebDriverWait
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
|
|
|
|
class Dialog:
|
|
"""
|
|
Context-managed overlay / modal / dialog on a page.
|
|
|
|
The constructor verifies that the root element is visible — if not,
|
|
the dialog is not on screen and a :exc:`TimeoutException` is raised.
|
|
|
|
Automates the lifecycle: wait for appearance on enter,
|
|
optionally wait for disappearance on exit.
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
driver: WebDriver,
|
|
root_locator: tuple,
|
|
auto_close_on_exit: bool = True,
|
|
wait_timeout: float = 3.0,
|
|
) -> None:
|
|
|
|
self._driver: WebDriver = driver
|
|
self._root_locator: tuple = root_locator
|
|
self._auto_close: bool = auto_close_on_exit
|
|
self._timeout: float = wait_timeout
|
|
|
|
WebDriverWait(self._driver, self._timeout).until(
|
|
EC.visibility_of_element_located(self._root_locator)
|
|
)
|
|
|
|
def __enter__(
|
|
self,
|
|
) -> "Dialog":
|
|
|
|
return self
|
|
|
|
def __exit__(
|
|
self,
|
|
*args: object,
|
|
) -> None:
|
|
|
|
if self._auto_close:
|
|
WebDriverWait(self._driver, self._timeout).until(
|
|
EC.invisibility_of_element_located(self._root_locator)
|
|
)
|
|
|
|
def _find(
|
|
self,
|
|
by: str,
|
|
value: str,
|
|
) -> WebElement:
|
|
|
|
return self._driver.find_element(by, value)
|
|
|
|
def _findAll(
|
|
self,
|
|
by: str,
|
|
value: str,
|
|
) -> list[WebElement]:
|
|
|
|
return self._driver.find_elements(by, value)
|
|
|
|
def _waitClickable(
|
|
self,
|
|
locator: tuple,
|
|
timeout: float = 2.0,
|
|
) -> WebElement:
|
|
|
|
return WebDriverWait(self._driver, timeout).until(
|
|
EC.element_to_be_clickable(locator)
|
|
)
|
|
|
|
def _waitPresence(
|
|
self,
|
|
locator: tuple,
|
|
timeout: float = 2.0,
|
|
) -> WebElement:
|
|
|
|
return WebDriverWait(self._driver, timeout).until(
|
|
EC.presence_of_element_located(locator)
|
|
)
|
|
|
|
def _waitVisible(
|
|
self,
|
|
locator: tuple,
|
|
timeout: float = 2.0,
|
|
) -> WebElement:
|
|
|
|
return WebDriverWait(self._driver, timeout).until(
|
|
EC.visibility_of_element_located(locator)
|
|
)
|
|
|
|
def _waitAllPresence(
|
|
self,
|
|
locator: tuple,
|
|
timeout: float = 2.0,
|
|
) -> list[WebElement]:
|
|
|
|
return WebDriverWait(self._driver, timeout).until(
|
|
EC.presence_of_all_elements_located(locator)
|
|
)
|