From ddf66cf155af3805323ec55ae6814f2d23d40c07 Mon Sep 17 00:00:00 2001 From: 阳洁 <2077506045@qq.com> Date: 星期五, 28 七月 2023 18:42:30 +0800 Subject: [PATCH] 测评系统自动测试 --- base/base_page.py | 382 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 343 insertions(+), 39 deletions(-) diff --git a/base/base_page.py b/base/base_page.py index fe27a1b..aba837a 100644 --- a/base/base_page.py +++ b/base/base_page.py @@ -1,19 +1,272 @@ -from selenium.common import TimeoutException +import importlib +import time + +from selenium.common 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): @@ -35,45 +288,53 @@ wait.until(EC.presence_of_element_located(locator)) return self.driver.find_element(*locator) - # 浣跨敤js璇彞鐐瑰嚮 - def script_click(self, *locator): - item = self.get_element(*locator) - self.driver.execute_script("arguments[0].click();", item) - - def script_click_wait(self, *locator): + def click_js_wait(self, *locator): item = self.get_element_wait(*locator) self.driver.execute_script("arguments[0].click();", item) - # 鐐瑰嚮 - def click(self, locator): + def click_element_js(self, element): """ - 鐐瑰嚮鍏冪礌 - :param locator: 鍏冪礌瀹氫綅 + 浣跨敤js鐐瑰嚮鍏冪礌 + :param element: 瑕佺偣鍑荤殑鍏冪礌 :return: """ - self.get_element(locator).click() + self.driver.execute_script("arguments[0].click();", element) + + # # 鐐瑰嚮 + # 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) @@ -88,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): @@ -109,7 +380,7 @@ e = wait.until(EC.element_to_be_clickable(locator)) if e is not None: return True - except TimeoutException: + except: pass return False @@ -120,7 +391,7 @@ e = wait.until(EC.presence_of_element_located(locator)) if e is not None: return True - except TimeoutException: + except: pass return False @@ -141,7 +412,7 @@ """鎴彇褰撳墠绐楀彛淇濆瓨涓哄浘鐗�""" return self.driver.get_screenshot_as_png() - def open_new_table_to_url(self, url): + def goto_new_table(self, url): """ 鎵撳紑涓�涓柊鐨勬爣绛鹃〉锛屽苟璺宠浆鍒版寚瀹氱殑url :return: @@ -152,3 +423,36 @@ self.switch_window(-1) # 鍦ㄦ柊鏍囩椤典腑鍔犺浇鎸囧畾url self.driver.get(url) + + def elements_is_visibility(self, locator): + """ + 鍒ゆ柇鏄惁鑷冲皯鏈変竴涓厓绱犲湪椤甸潰涓彲瑙� + :param locator: + :return: + """ + 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