feat: 优化定位转换器调整框架结构

- 新增 finder.py 重构定位转换器
- 优化 .gitignore 文件
- 其他优化
This commit is contained in:
2026-01-25 17:24:04 +08:00
parent 92d06dd9cf
commit 5a50eb8289
15 changed files with 342 additions and 126 deletions

View File

@@ -11,6 +11,7 @@
"""
import logging
from pathlib import Path
from time import sleep
import secrets # 原生库,用于生成安全的随机数
from typing import Optional, Callable, Union, Literal, Any, TypeVar
@@ -28,6 +29,8 @@ from commons.custom_expected_condition import EC, custom_ec
from commons.modules import Browser, Locator
from commons.settings import configs, EXPLICIT_WAIT_TIMEOUT, SCREENSHOT_DIR
from commons.webdriver_finder import BrowserFinder
from utils.finder import by_converter
logger = logging.getLogger(__name__)
WebDriverOrWebElement = Union[WebDriver, WebElement]
@@ -41,51 +44,35 @@ T = TypeVar("T")
# 筛选器 Filters
# 查找器 finder
# 转换器 converter
def webdriver_finder(browser: str | Browser = Browser.CHROME) -> WebDriver:
match browser:
case Browser.CHROME:
return Chrome()
case Browser.FIREFOX:
return Firefox()
case Browser.IE:
return Ie()
case Browser.SAFARI:
return Safari()
case Browser.EDGE:
return Edge()
case _:
return Chrome() # 默认情况
def by_converter(by_value: str | Locator):
try:
# 统一处理输入
if isinstance(by_value, str):
by = Locator(by_value.lower().replace(' ', ''))
# 创建对应的浏览器实例
by = {
Locator.ID: By.ID,
Locator.NAME: By.NAME,
Locator.CLASS: By.CLASS_NAME,
Locator.TAG: By.TAG_NAME,
Locator.LINK_TEXT: By.LINK_TEXT,
Locator.PARTIAL_LINK_TEXT: By.PARTIAL_LINK_TEXT,
Locator.CSS: By.CSS_SELECTOR,
Locator.XPATH: By.XPATH,
}.get(by_value, By.XPATH)
return by
except ValueError:
return By.XPATH
# def by_converter(by_value: str | Locator):
# try:
# # 统一处理输入
# if isinstance(by_value, str):
# by = Locator(by_value.lower().replace(' ', ''))
#
# # 创建对应的浏览器实例
# by = {
# Locator.ID: By.ID,
# Locator.NAME: By.NAME,
# Locator.CLASS: By.CLASS_NAME,
# Locator.TAG: By.TAG_NAME,
# Locator.LINK_TEXT: By.LINK_TEXT,
# Locator.PARTIAL_LINK_TEXT: By.PARTIAL_LINK_TEXT,
# Locator.CSS: By.CSS_SELECTOR,
# Locator.XPATH: By.XPATH,
# }.get(by_value, By.XPATH)
# return by
# except ValueError:
# return By.XPATH
class KeyWordDriver:
class CoreDriver:
# def __init__(self, browser: str | Browser):
# self.driver = self.webdriver_finder(browser)
def __init__(self):
self.driver: WebDriver | None = None
self._url: str | None = None
def __init__(self, driver: WebDriver | None = None):
self.driver: WebDriver | None = driver
self._url: str | None = configs.base_url
# self.temp_value = None
def base_url(self, url: str, *args, **kwargs):
@@ -93,28 +80,33 @@ class KeyWordDriver:
self._url = url
# return url
def browser(self, browser_name: str | Browser = Browser.CHROME, *args, **kwargs):
def browser(self, browser_name: str | Browser = Browser.CHROME, browser_dir: Path | str | None = None,
browser_driver: Path | str | None = None, *args, **kwargs):
browser_name = Browser(browser_name.lower().replace(' ', '')) if isinstance(browser_name, str) else browser_name
match browser_name:
case Browser.CHROME:
logger.info(f"启动{Browser.CHROME}浏览器")
self.driver = Chrome()
# return Chrome()
case Browser.FIREFOX:
logger.info(f"启动{Browser.FIREFOX}浏览器")
self.driver = Firefox()
case Browser.IE:
logger.info(f"启动{Browser.IE}浏览器")
self.driver = Ie()
case Browser.SAFARI:
logger.info(f"启动{Browser.SAFARI}浏览器")
self.driver = Safari()
case Browser.EDGE:
logger.info(f"启动{Browser.EDGE}浏览器")
self.driver = Edge()
case _:
logger.info(f"启动默认浏览器: {Browser.CHROME}")
self.driver = Chrome() # 默认情况
logger.info(f"启动 {browser_name.value} 浏览器")
self.driver = BrowserFinder(browser_name=browser_name).get_browser_driver(browser_dir, browser_driver)
# match browser_name:
# case Browser.CHROME:
# logger.info(f"启动{Browser.CHROME}浏览器")
# self.driver = Chrome()
# # return Chrome()
# case Browser.FIREFOX:
# logger.info(f"启动{Browser.FIREFOX}浏览器")
# self.driver = Firefox()
# case Browser.IE:
# logger.info(f"启动{Browser.IE}浏览器")
# self.driver = Ie()
# case Browser.SAFARI:
# logger.info(f"启动{Browser.SAFARI}浏览器")
# self.driver = Safari()
# case Browser.EDGE:
# logger.info(f"启动{Browser.EDGE}浏览器")
# self.driver = Edge()
# case _:
# logger.info(f"启动默认浏览器: {Browser.CHROME}")
# self.driver = Chrome() # 默认情况
def find_element(self, by: str = By.XPATH, value: Optional[str] = None, *args, **kwargs) -> WebElement:
by = by_converter(by)
@@ -137,7 +129,7 @@ class KeyWordDriver:
def explicit_wait(self, method: T, timeout: float = EXPLICIT_WAIT_TIMEOUT, *args, **kwargs):
"""
显示等待
显示等待AttributeError: 'WebDriver' object has no attribute 'send_keys'
:param method: 可调用对象名
:param timeout: 超时时间
:param args:
@@ -159,7 +151,7 @@ class KeyWordDriver:
def page_load_timeout(self, timeout: float, *args, **kwargs) -> None:
self.driver.set_page_load_timeout(timeout)
def get(self, url, *args, **kwargs):
def get(self, url:str, *args, **kwargs):
if self.driver is None:
self.browser(*args, **kwargs)
if not url.startswith("http"):
@@ -326,7 +318,8 @@ class KeyWordDriver:
if __name__ == '__main__':
from commons.settings import configs
el = KeyWordDriver()
el = CoreDriver()
el.base_url(configs.base_url)
# el.browser("chrome")
el.browser(Browser.EDGE)
@@ -338,4 +331,3 @@ if __name__ == '__main__':
type_value = el.get_attribute("", '//*[@id="root"]/div[1]/div/div/form/div[3]/button', "type")
print(type_value)
el.assert_text_equals("", '//*[@id="root"]/div[1]/div/div/form/div[3]/button', "登录")