#!/usr/bin/env python # coding=utf-8 """ @author: CNWei @Software: PyCharm @contact: t6i888@163.com @file: expected_conditional_function @date: 2025/4/4 14:15 @desc: """ import logging from dataclasses import dataclass from typing import Dict, Callable, TypeVar, Tuple from typing import Literal from typing import Optional from typing import Union from selenium.webdriver.remote.webdriver import WebDriver from selenium.webdriver.remote.webdriver import WebElement from selenium.webdriver.support import expected_conditions as EC __all__ = ["EC","custom_ec"] logger = logging.getLogger(__name__) T = TypeVar("T") WebDriverOrWebElement = Union[WebDriver, WebElement] """ 常用等待条件(expected_conditions)--来自EC模块 presence_of_element_located: 元素存在于DOM。 visibility_of_element_located: 元素可见。 element_to_be_clickable: 元素可点击。 title_contains: 页面标题包含特定文本。 text_to_be_present_in_element: 元素包含特定文本。 """ # 自定义预期条件(Custom Expected Condition) custom_ec = { } def register(name: str | None = None): def decorator(func): if name is not None: custom_ec[name] = func custom_ec[func.__name__] = func return func return decorator @register() def examples_no_parameters(driver: WebDriverOrWebElement)->T: """ 无参预期条件函数 driver - WebDriver的实例(Ie、Firefox、Chrome或远程)或 一个WebElement - driver形参不可省略,即使不使用 :return: """ _ = driver list_ = [1, 2, 3, 4, 5, 6] for item in list_: logger.info(item) if item == 5: return item @register() def examples_have_parameters(locator: Tuple[str, str]) -> Callable[[WebDriverOrWebElement], Union[Literal[False], WebElement]]: """ 有参预期条件函数(暂不支持) :param locator: :return: """ def _predicate(driver: WebDriverOrWebElement): try: return driver.find_element(*locator) except Exception as e: return False return _predicate def func_3(mark): ... def func_4(mark): ... if __name__ == "__main__": print(custom_ec)