base_page.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. from selenium.webdriver.support.ui import WebDriverWait
  2. from selenium.webdriver.support import expected_conditions as EC
  3. from selenium.common.exceptions import TimeoutException, StaleElementReferenceException
  4. from core.config.config_manager import ConfigManager
  5. from core.utils.logger import Logger
  6. from core.utils.wait_utils import WaitUtils
  7. from core.exceptions.element_exceptions import ElementNotFoundException, ElementNotInteractableException
  8. class BasePage:
  9. def __init__(self, driver):
  10. self.driver = driver
  11. self.config = ConfigManager()
  12. self.logger = Logger.get_logger()
  13. self.wait_utils = WaitUtils(driver)
  14. # 页面超时配置
  15. self.timeout = self.config.get('browser.explicit_wait', 30)
  16. self.poll_frequency = self.config.get('browser.poll_frequency', 0.5)
  17. def open(self, url):
  18. """打开页面"""
  19. self.logger.info(f"打开页面: {url}")
  20. self.driver.get(url)
  21. def get_title(self):
  22. """获取页面标题"""
  23. return self.driver.title
  24. def get_current_url(self):
  25. """获取当前URL"""
  26. return self.driver.current_url
  27. def find_element(self, locator, timeout=None):
  28. """查找元素"""
  29. timeout = timeout or self.timeout
  30. try:
  31. return self.wait_utils.wait_for_element_present(locator, timeout)
  32. except TimeoutException:
  33. self.logger.error(f"元素未找到: {locator}")
  34. raise ElementNotFoundException(f"元素未找到: {locator}")
  35. def find_elements(self, locator, timeout=None):
  36. """查找多个元素"""
  37. timeout = timeout or self.timeout
  38. try:
  39. return self.wait_utils.wait_for_elements_present(locator, timeout)
  40. except TimeoutException:
  41. self.logger.error(f"元素未找到: {locator}")
  42. raise ElementNotFoundException(f"元素未找到: {locator}")
  43. def click(self, locator, timeout=None):
  44. """点击元素"""
  45. element = self.find_element(locator, timeout)
  46. try:
  47. element.click()
  48. self.logger.info(f"点击元素: {locator}")
  49. except Exception as e:
  50. self.logger.error(f"点击元素失败: {locator}, 错误: {str(e)}")
  51. raise ElementNotInteractableException(f"无法点击元素: {locator}")
  52. def input_text(self, locator, text, timeout=None, clear_first=True):
  53. """输入文本"""
  54. element = self.find_element(locator, timeout)
  55. try:
  56. if clear_first:
  57. element.clear()
  58. element.send_keys(text)
  59. self.logger.info(f"在元素 {locator} 中输入文本: {text}")
  60. except Exception as e:
  61. self.logger.error(f"输入文本失败: {locator}, 错误: {str(e)}")
  62. raise ElementNotInteractableException(f"无法在元素中输入文本: {locator}")
  63. def get_text(self, locator, timeout=None):
  64. """获取元素文本"""
  65. element = self.find_element(locator, timeout)
  66. try:
  67. text = element.text
  68. self.logger.info(f"获取元素文本: {locator} -> {text}")
  69. return text
  70. except Exception as e:
  71. self.logger.error(f"获取元素文本失败: {locator}, 错误: {str(e)}")
  72. raise ElementNotInteractableException(f"无法获取元素文本: {locator}")
  73. def get_attribute(self, locator, attribute, timeout=None):
  74. """获取元素属性"""
  75. element = self.find_element(locator, timeout)
  76. try:
  77. value = element.get_attribute(attribute)
  78. self.logger.info(f"获取元素属性: {locator}.{attribute} -> {value}")
  79. return value
  80. except Exception as e:
  81. self.logger.error(f"获取元素属性失败: {locator}.{attribute}, 错误: {str(e)}")
  82. raise ElementNotInteractableException(f"无法获取元素属性: {locator}.{attribute}")
  83. def is_element_present(self, locator, timeout=None):
  84. """检查元素是否存在"""
  85. try:
  86. self.find_element(locator, timeout)
  87. return True
  88. except ElementNotFoundException:
  89. return False
  90. def is_element_visible(self, locator, timeout=None):
  91. """检查元素是否可见"""
  92. try:
  93. element = self.find_element(locator, timeout)
  94. return element.is_displayed()
  95. except (ElementNotFoundException, StaleElementReferenceException):
  96. return False
  97. def is_element_enabled(self, locator, timeout=None):
  98. """检查元素是否可用"""
  99. try:
  100. element = self.find_element(locator, timeout)
  101. return element.is_enabled()
  102. except (ElementNotFoundException, StaleElementReferenceException):
  103. return False
  104. def wait_for_element_visible(self, locator, timeout=None):
  105. """等待元素可见"""
  106. timeout = timeout or self.timeout
  107. return self.wait_utils.wait_for_element_visible(locator, timeout)
  108. def wait_for_element_invisible(self, locator, timeout=None):
  109. """等待元素不可见"""
  110. timeout = timeout or self.timeout
  111. return self.wait_utils.wait_for_element_invisible(locator, timeout)
  112. def wait_for_element_clickable(self, locator, timeout=None):
  113. """等待元素可点击"""
  114. timeout = timeout or self.timeout
  115. return self.wait_utils.wait_for_element_clickable(locator, timeout)
  116. def take_screenshot(self, name):
  117. """截取屏幕截图"""
  118. from utils.file.screenshot_manager import ScreenshotManager
  119. screenshot_manager = ScreenshotManager()
  120. return screenshot_manager.take_screenshot(self.driver, name)
  121. def scroll_to_element(self, locator, timeout=None):
  122. """滚动到元素"""
  123. element = self.find_element(locator, timeout)
  124. self.driver.execute_script("arguments[0].scrollIntoView(true);", element)
  125. self.logger.info(f"滚动到元素: {locator}")
  126. def execute_script(self, script, *args):
  127. """执行JavaScript脚本"""
  128. result = self.driver.execute_script(script, *args)
  129. self.logger.info(f"执行JavaScript脚本: {script}")
  130. return result