feat: 优化定位转换器调整框架结构
- 新增 finder.py 重构定位转换器 - 优化 .gitignore 文件 - 其他优化
This commit is contained in:
@@ -20,7 +20,7 @@ from selenium.webdriver.remote.webdriver import WebDriver
|
||||
from selenium.webdriver.remote.webdriver import WebElement
|
||||
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
|
||||
from selenium.webdriver.support.expected_conditions import visibility_of_element_located
|
||||
__all__ = ["EC","custom_ec"]
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -97,3 +97,16 @@ def func_4(mark):
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(custom_ec)
|
||||
from selenium.common.exceptions import StaleElementReferenceException
|
||||
|
||||
def luo_ji(locator: Tuple[str, str]):
|
||||
_ = locator
|
||||
|
||||
def _predicate(driver):
|
||||
try:
|
||||
_ = driver
|
||||
raise StaleElementReferenceException()
|
||||
except StaleElementReferenceException:
|
||||
return False
|
||||
|
||||
return _predicate
|
||||
@@ -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', "登录")
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ class Browser(str, Enum):
|
||||
IE = "ie"
|
||||
SAFARI = "safari"
|
||||
EDGE = "edge"
|
||||
DEFAULT = "default"
|
||||
|
||||
|
||||
class Locator(str, Enum):
|
||||
|
||||
@@ -43,6 +43,11 @@ EXCHANGER = Path(ROOT_PATH, "extract.toml")
|
||||
# 自增ID
|
||||
ID_PATH = Path(ROOT_PATH, "id.toml")
|
||||
|
||||
browser_dir: Path | str | None = None
|
||||
|
||||
chrome_driver: Path | str | None = None
|
||||
temp_user_data_dir: Path | str
|
||||
|
||||
# 默认配置
|
||||
DEFAULT_CONF = {
|
||||
"SCREENSHOT_DIR": SCREENSHOT_DIR,
|
||||
@@ -103,7 +108,6 @@ class Settings:
|
||||
|
||||
new_conf = DEFAULT_CONF | result
|
||||
for key, value in new_conf.items():
|
||||
|
||||
self.__setattr__(key, value)
|
||||
return self
|
||||
|
||||
@@ -134,4 +138,3 @@ configs = Settings()
|
||||
if __name__ == '__main__':
|
||||
...
|
||||
print(configs.items())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user