From c0dc1bc9676d0bc15355cfd16e9bb92a31518aa8 Mon Sep 17 00:00:00 2001
From: yj <2077506045@qq.com>
Date: 星期四, 25 七月 2024 11:50:11 +0800
Subject: [PATCH] 测评系统自动测试

---
 base/base_page.py |  382 ++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 339 insertions(+), 43 deletions(-)

diff --git a/base/base_page.py b/base/base_page.py
index 6bcb658..1eaae78 100644
--- a/base/base_page.py
+++ b/base/base_page.py
@@ -1,20 +1,272 @@
+import importlib
+import time
 
+from selenium.common.exceptions import StaleElementReferenceException, ElementClickInterceptedException
+from selenium.webdriver.remote.webelement import WebElement
 from selenium.webdriver.support.wait import WebDriverWait
 from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.remote.webdriver import WebDriver
+
+SimpleActions = ['clear()', 'send_keys()', 'click()', 'submit()', 'size', 'text', 'is_displayed()', 'get_attribute()']
+complexActions = ['iframe()', 'select()', 'option()']
+
+# 榛樿瓒呮椂鏃堕棿10绉�
+DEFAULT_TIMEOUT = 10
+# 榛樿閲嶈瘯娆℃暟
+DEFAULT_RETRY = 30
 
 
 class BasePage:
+
+    retry_number = 0
+
     # 鍒濆鍖栨柟娉�
-    def __init__(self, driver):
+    def __init__(self, driver: WebDriver):
+        """鏋勯�犳柟娉曪紝浼犲叆webdriver"""
         self.driver = driver
 
-    # 鍏冪礌瀹氫綅
-    def get_element(self, locator):
-        return self.driver.find_element(*locator)
+    # def _get_page_elem(self, elem):
+    #     """鑾峰彇瀹氫綅鍏冪礌鐨刡y锛屼互鍙婃搷浣渁ction"""
+    #     for each in self.elements:
+    #         if each['name'] == elem:
+    #             self.loc = each['loc']
+    #             if each['action'] is not None:
+    #                 self.action = each['action']
+    #             else:
+    #                 self.action = None
+    #             if 'optionsLoc' in each:
+    #                 self.optionsLoc = each['optionsLoc']
+    #             else:
+    #                 self.optionsLoc = None
+    #             if 'wait' in each:
+    #                 self.wait = each['wait']
+    #             else:
+    #                 self.wait = None
+    #
+    # def oper_elem(self, elem, args=None):
+    #     self._get_page_elem(elem)
+    #     cmd = self._selenium_cmd('find_element', args)
+    #     return eval(cmd)
+    #
+    # def oper_elems(self, elem, args=None):
+    #     self._get_page_elem(elem)
+    #     cmd = self._selenium_cmd('find_elements', args)
+    #     return eval(cmd)
+    #
+    # def _selenium_cmd(self, find_type='find_element', args=None):
+    #     """鎷兼帴selenium鏌ユ壘鍛戒护锛屾煡鎵惧崟涓厓绱犳椂find涓�'find_element',澶氫釜鍏冪礌鏃朵负'find_elements'"""
+    #     cmd = 'self.driver.' + find_type + '(*self.loc)'
+    #     if self.action:
+    #         cmd = 'self.' + self.action
+    #         if args:
+    #             cmd = cmd[:-1] + 'args' + ')'
+    #     return cmd
+    #
+    # def iframe(self):
+    #     self.driver.switch_to.frame(self.driver.find_element(*self.loc))
+    #
+    # def click(self):
+    #     if self.wait:
+    #         wait = WebDriverWait(self.driver, self.wait, 0.5)
+    #         wait.until(EC.presence_of_element_located(self.loc)).click()
+    #     else:
+    #         self.driver.find_element(*self.loc).click()
+    #
+    # # 浣跨敤js璇彞鐐瑰嚮
+    # def click_js(self):
+    #     item = self.driver.find_element(*self.loc)
+    #     self.driver.execute_script("arguments[0].click();", item)
+    #
+    # def send_keys(self, text):
+    #     wait = WebDriverWait(self.driver, 10, 0.5)
+    #     wait.until(EC.presence_of_element_located(self.loc)).send_keys(text)
+    #
+    # def text(self):
+    #     wait = WebDriverWait(self.driver, 10, 0.5)
+    #     return wait.until(EC.presence_of_element_located(self.loc)).text
+    #
+    def select(self, select_loc, options_loc, item):
+        """
+        閫夋嫨浼犲叆鐨勯�夐」
+        :param select_loc: 閫夋嫨妗嗗畾浣�
+        :param options_loc: 閫夐」瀹氫綅
+        :param item: 閫夐」
+        :return:
+        """
+        # 鐐瑰嚮閫夋嫨妗嗗璞�
+        self.click(select_loc, timeout=10)
+        # 鑾峰彇鎵�鏈夐�夐」
+        options = self.get_eles(options_loc, timeout=10)
+        for option in options:
+            if option.text == item:
+                option.click()
+                break
+    #
+    # def value_js(self):
+    #     """
+    #     浣跨敤js璇彞鑾峰彇value鍊�
+    #     :return:
+    #     """
+    #     # 绛夊緟瀵硅薄
+    #     wait = WebDriverWait(self.driver, 10, 0.5)
+    #     input_box = wait.until(EC.presence_of_element_located(self.loc))
+    #     input_value = self.driver.execute_script("return arguments[0].value", input_box)
+    #     return input_value
+    #
+    # def option(self, text):
+    #     """
+    #     鐐瑰嚮浼犲叆鐨勯�夐」
+    #     :param text:
+    #     :return:
+    #     """
+    #     wait = WebDriverWait(self.driver, 10, 0.5)
+    #     wait.until(EC.presence_of_all_elements_located(self.loc))
+    #     options = self.driver.find_elements(*self.loc)
+    #     for option in options:
+    #         if option.text == text:
+    #             option.click()
 
-    # 澶氫釜鍏冪礌瀹氫綅
-    def get_elements(self, locator):
-        return self.driver.find_elements(*locator)
+    # 鍏冪礌瀹氫綅
+
+    def goto(self, url):
+        """璁块棶url"""
+        self.driver.get(url)
+
+    def get_ele(self, loc, timeout=None) -> WebElement:
+        """
+        鑾峰彇鍏冪礌
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        if timeout:
+            return self.wait_visible(loc, timeout)
+        else:
+            return self.driver.find_element(*loc)
+
+    def get_eles(self, loc, timeout=None):
+        """
+        鑾峰彇澶氫釜鍏冪礌
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        if timeout:
+            return self.wait_visible(loc, timeout=timeout, find_type="elements")
+        else:
+            return self.driver.find_elements(*loc)
+
+    def clear(self, loc, timeout=None):
+        """
+        娓呴櫎鏂囨湰妗嗗唴瀹�
+        :param loc:
+        :param timeout:
+        :return:
+        """
+        ele = self.get_ele(loc, timeout=timeout)
+        ele.clear()
+
+    def fill(self, loc, text, timeout=None):
+        """椤甸潰杈撳叆"""
+
+        ele = self.get_ele(loc, timeout=timeout)
+        # 鍏堟竻闄ゆ枃鏈鍐呭
+        ele.clear()
+        # 濉啓鍐呭
+        ele.send_keys(text)
+
+    def wait_visible(self, loc, timeout=DEFAULT_TIMEOUT, find_type="element") -> WebElement:
+        """
+        绛夊緟鍏冪礌鍙
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 绛夊緟鏃堕棿
+        :param find_type: 绛夊緟鍏冪礌鐨勭被鍨�
+        :return:
+        """
+        wait = WebDriverWait(self.driver, timeout=timeout)
+        element = None
+        if find_type == "element":
+            element = wait.until(EC.visibility_of_element_located(loc))
+        elif find_type == "elements":
+            element = wait.until(EC.visibility_of_all_elements_located(loc))
+        return element
+
+    def click(self, loc, timeout=None):
+        """
+        鐐瑰嚮鍏冪礌
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        try:
+            if timeout:
+                ele = self.wait_clickable(loc, timeout=timeout)
+                ele.click()
+            else:
+                ele = self.driver.find_element(*loc)
+                ele.click()
+            self.retry_number = 0
+        except (StaleElementReferenceException, ElementClickInterceptedException):
+            if self.retry_number >= DEFAULT_RETRY:
+                return
+            time.sleep(1)
+            self.retry_number += 1
+            self.click(loc, timeout=timeout)
+
+    def click_js(self, loc, timeout=None):
+        """
+        JavaScript鐐瑰嚮鍏冪礌
+        :param loc:
+        :param timeout:
+        :return:
+        """
+        item = self.get_ele(loc, timeout=timeout)
+        self.driver.execute_script("arguments[0].click();", item)
+
+    def wait_clickable(self, loc, timeout=DEFAULT_TIMEOUT) -> WebElement:
+        """
+        绛夊緟鍏冪礌鍙偣鍑�
+        :param loc: 鍏冪礌瀹氫綅
+        :param timeout: 瓒呮椂鏃堕棿
+        :return:
+        """
+        wait = WebDriverWait(self.driver, timeout=timeout)
+        element = wait.until(EC.element_to_be_clickable(loc))
+        return element
+
+    def equals(self, loc, text):
+        """
+        鍒ゆ柇鍏冪礌鐨剉alue鎴栬�卼ext鏄惁涓巘ext鐩哥瓑
+        :param loc:
+        :param text:
+        :return:
+        """
+        # 鍏堣幏鍙杤alue
+        ele_value = self.get_ele(loc, timeout=10).get_attribute("value")
+        # 濡傛灉涓篘one鍒欓�氳繃value_js鑾峰彇value鍊�
+        if not ele_value:
+            ele_value = self.get_value_js(loc, timeout=10)
+        # 濡傛灉杩樹负绌哄垯鑾峰彇text
+        if not ele_value:
+            ele_value = self.get_ele(loc, timeout=10).text
+        return ele_value == text
+
+    def contains(self, loc, text):
+        """
+        鍒ゆ柇鍏冪礌鐨剉alue鎴栬�卼ext鍖呭惈text
+        :param loc:
+        :param text:
+        :return:
+        """
+        # 鍏堣幏鍙杤alue
+        ele_value = self.get_ele(loc).get_attribute("value")
+        # 濡傛灉涓篘one鍒欓�氳繃value_js鑾峰彇value鍊�
+        if not ele_value:
+            ele_value = self.get_value_js(loc)
+        # 濡傛灉杩樹负绌哄垯鑾峰彇text
+        if not ele_value:
+            ele_value = self.get_ele(loc).text
+        return text in ele_value
 
     # 澶氫釜鍏冪礌瀹氫綅
     def get_elements_wait(self, locator):
@@ -27,7 +279,7 @@
         return element.find_element(*locator)
 
     # 鍦ㄦ寚瀹氬厓绱犱腑瀹氫綅澶氫釜鍏冪礌
-    def get_elements_in(self, element, *locator):
+    def get_elements_in(self, element, locator):
         return element.find_elements(*locator)
 
     # 鍏冪礌瀹氫綅
@@ -35,11 +287,6 @@
         wait = WebDriverWait(self.driver, 10, 0.5)
         wait.until(EC.presence_of_element_located(locator))
         return self.driver.find_element(*locator)
-
-    # 浣跨敤js璇彞鐐瑰嚮
-    def click_js(self, *locator):
-        item = self.get_element(*locator)
-        self.driver.execute_script("arguments[0].click();", item)
 
     def click_js_wait(self, *locator):
         item = self.get_element_wait(*locator)
@@ -53,36 +300,41 @@
         """
         self.driver.execute_script("arguments[0].click();", element)
 
-    # 鐐瑰嚮
-    def click(self, locator):
-        """
-        鐐瑰嚮鍏冪礌
-        :param locator: 鍏冪礌瀹氫綅
-        :return:
-        """
-        self.get_element(locator).click()
+    # # 鐐瑰嚮
+    # def click(self, locator):
+    #     """
+    #     鐐瑰嚮鍏冪礌
+    #     :param locator: 鍏冪礌瀹氫綅
+    #     :return:
+    #     """
+    #     self.get_element(locator).click()
 
     def click_wait(self, *locator):
         self.get_element_wait(*locator).click()
 
-    # 杈撳叆
-    def send_text(self, text, locator):
-        """
-        杈撳叆鍐呭
-        :param text: 鍐呭
-        :param locator: 鍏冪礌瀹氫綅
-        :return:
-        """
-        self.get_element(locator).send_keys(text)
+    # # 杈撳叆
+    # def fill(self, text, locator):
+    #     """
+    #     杈撳叆鍐呭
+    #     :param text: 鍐呭
+    #     :param locator: 鍏冪礌瀹氫綅
+    #     :return:
+    #     """
+    #     self.get_element(locator).send_keys(text)
 
     def send_text_wait(self, text, *locator):
         self.get_element_wait(*locator).send_keys(text)
 
-    # JavaScript鑾峰彇鍏冪礌鍊�
-    def get_input_value_js(self, locator):
-        input_box = self.get_element(locator)
-        input_value = self.driver.execute_script("return arguments[0].value", input_box)
-        return input_value
+    def get_value_js(self, loc, timeout=None):
+        """
+        鎵цJavaScript鑾峰彇value鍊�
+        :param timeout:
+        :param loc:
+        :return:
+        """
+        ele = self.get_ele(loc, timeout=timeout)
+        value = self.driver.execute_script("return arguments[0].value", ele)
+        return value
 
     def get_input_value_js_wait(self, *locator):
         input_box = self.get_element_wait(*locator)
@@ -97,11 +349,21 @@
         self.get_element_wait(*locator).clear()
 
     # 琛ㄥ崟鍒囨崲
-    def switch_iframe(self, locator):
-        self.driver.switch_to.frame(self.get_element(locator))
+    def switch_iframe(self, loc):
+        """
+        鍒囨崲琛ㄥ崟
+        :param loc: 琛ㄥ崟瀹氫綅
+        :return:
+        """
+        # 鑾峰彇鍒癷frame鍏冪礌
+        iframe = self.get_ele(loc, timeout=10)
+        self.driver.switch_to.frame(iframe)
 
-    # 鍒囨崲鍒颁笂涓�灞傜殑iframe
     def switch_parent_iframe(self):
+        """
+        鍒囨崲鍒颁笂涓�灞傜殑iframe
+        :return:
+        """
         self.driver.switch_to.parent_frame()
 
     def switch_iframe_wait(self, locator):
@@ -135,22 +397,33 @@
 
     # 婊戝姩椤甸潰
     def scroll_by(self, num):
-        self.driver.execute_script("window.scrollBy(0, " + num + ");")
+        self.driver.execute_script(f"window.scrollBy(0, {num})")
+
+    def scroll_to_top(self):
+        self.driver.execute_script("window.scrollTo(0, 0);")
 
     # 婊戝姩鍒板簳閮�
     def scroll_to_bottom(self):
         self.driver.execute_script("window.scrollBy(0,document.body.scrollHeight);")
 
-    # 婊戝姩鍒伴《閮�
-    def scroll_to_top(self):
-        self.driver.execute_script("window.scrollBy(0,0);")
+    # 婊氬姩鍒板搴斿厓绱犱笂
+    def scroll_to_element(self, ele, timeout=None):
+        # 鑾峰彇鍏冪礌鐨勫潗鏍�
+        element_top = self.driver.execute_script("return arguments[0].getBoundingClientRect().top;", ele)
+        # 鑾峰彇瑙嗗彛鐨勯珮搴�
+        viewport_height = self.driver.execute_script("return window.innerHeight;")
+        # 璁$畻婊氬姩璺濈
+        scroll_distance = element_top + viewport_height - ele.size['height']
+        # 鎵ц婊氬姩鎿嶄綔
+        self.driver.execute_script(f"window.scrollTo(0, {scroll_distance});")
+        WebDriverWait(self.driver, 10).until(EC.visibility_of(ele))
 
     # 鎴彇褰撳墠绐楀彛淇濆瓨涓哄浘鐗�
     def get_png(self):
         """鎴彇褰撳墠绐楀彛淇濆瓨涓哄浘鐗�"""
         return self.driver.get_screenshot_as_png()
 
-    def open_new_table_to_url(self, url):
+    def goto_new_table(self, url):
         """
         鎵撳紑涓�涓柊鐨勬爣绛鹃〉锛屽苟璺宠浆鍒版寚瀹氱殑url
         :return:
@@ -171,3 +444,26 @@
         wait = WebDriverWait(self.driver, 10, 0.5)
         return wait.until(EC.visibility_of_any_elements_located(locator))
 
+    def add_elements(self, ele):
+        """
+        鍦╡lements涓柊澧炲厓绱�
+        :param ele:
+        :return:
+        """
+        self.elements.append(ele)
+
+
+def get_page_elements(page):
+    """
+    鍔ㄦ�佸姞杞介〉闈㈠畾涔夋枃浠讹紝鑾峰彇鏂囦欢涓畾涔夌殑鍏冪礌鍒楄〃elements
+    :param page:
+    :return:
+    """
+    elements = None
+    if page:
+        try:
+            m = importlib.import_module(page)
+            elements = m.elements
+        except Exception as e:
+            pass
+    return elements

--
Gitblit v1.9.1