wait_utils.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. class WaitUtils:
  7. def __init__(self, driver):
  8. self.driver = driver
  9. self.config = ConfigManager()
  10. self.logger = Logger.get_logger()
  11. # 获取等待配置
  12. self.timeout = self.config.get('browser.explicit_wait', 30)
  13. self.poll_frequency = self.config.get('browser.poll_frequency', 0.5)
  14. def _get_wait(self, timeout=None):
  15. """获取WebDriverWait实例"""
  16. timeout = timeout or self.timeout
  17. return WebDriverWait(
  18. self.driver,
  19. timeout=timeout,
  20. poll_frequency=self.poll_frequency
  21. )
  22. def wait_for_element_present(self, locator, timeout=None):
  23. """等待元素出现在DOM中"""
  24. wait = self._get_wait(timeout)
  25. return wait.until(EC.presence_of_element_located(locator))
  26. def wait_for_elements_present(self, locator, timeout=None):
  27. """等待多个元素出现在DOM中"""
  28. wait = self._get_wait(timeout)
  29. return wait.until(EC.presence_of_all_elements_located(locator))
  30. def wait_for_element_visible(self, locator, timeout=None):
  31. """等待元素可见"""
  32. wait = self._get_wait(timeout)
  33. return wait.until(EC.visibility_of_element_located(locator))
  34. def wait_for_elements_visible(self, locator, timeout=None):
  35. """等待多个元素可见"""
  36. wait = self._get_wait(timeout)
  37. return wait.until(EC.visibility_of_all_elements_located(locator))
  38. def wait_for_element_invisible(self, locator, timeout=None):
  39. """等待元素不可见"""
  40. wait = self._get_wait(timeout)
  41. return wait.until(EC.invisibility_of_element_located(locator))
  42. def wait_for_element_clickable(self, locator, timeout=None):
  43. """等待元素可点击"""
  44. wait = self._get_wait(timeout)
  45. return wait.until(EC.element_to_be_clickable(locator))
  46. def wait_for_text_present_in_element(self, locator, text, timeout=None):
  47. """等待元素中包含特定文本"""
  48. wait = self._get_wait(timeout)
  49. return wait.until(EC.text_to_be_present_in_element(locator, text))
  50. def wait_for_text_present_in_element_value(self, locator, text, timeout=None):
  51. """等待元素值中包含特定文本"""
  52. wait = self._get_wait(timeout)
  53. return wait.until(EC.text_to_be_present_in_element_value(locator, text))
  54. def wait_for_frame_available(self, frame_locator, timeout=None):
  55. """等待框架可用并切换到该框架"""
  56. wait = self._get_wait(timeout)
  57. return wait.until(EC.frame_to_be_available_and_switch_to_it(frame_locator))
  58. def wait_for_alert_present(self, timeout=None):
  59. """等待警报出现"""
  60. wait = self._get_wait(timeout)
  61. return wait.until(EC.alert_is_present())
  62. def wait_for_page_loaded(self, timeout=None):
  63. """等待页面完全加载"""
  64. wait = self._get_wait(timeout)
  65. return wait.until(
  66. lambda driver: driver.execute_script('return document.readyState') == 'complete'
  67. )
  68. def wait_for_custom_condition(self, condition, timeout=None, message=""):
  69. """等待自定义条件成立"""
  70. wait = self._get_wait(timeout)
  71. return wait.until(condition, message=message)