From 84d824ab75d547484a11633c23d217f0deba4e92 Mon Sep 17 00:00:00 2001 From: 阳洁 <2077506045@qq.com> Date: 星期一, 17 七月 2023 16:24:03 +0800 Subject: [PATCH] 测评系统自动测试 --- elements/maq_answer_elements.py | 6 /dev/null | 71 ----- po/maq_answer_page.py | 121 +++++++++ elements/jaq_answer_elements.py | 25 + testcase/test_jaq.py | 93 ++---- main.py | 2 po/test_package_list_page.py | 67 ++-- testcase/test_maq.py | 82 ++--- po/jaq_answer_page.py | 123 +++++++++ testcase/conftest.py | 24 + data/test_data.json | 49 +++ report/report.html | 98 +++++++ 12 files changed, 547 insertions(+), 214 deletions(-) diff --git a/data/test_data.json b/data/test_data.json new file mode 100644 index 0000000..6adf9db --- /dev/null +++ b/data/test_data.json @@ -0,0 +1,49 @@ +{ + "login": { + "url": "http://161.117.57.194/login?lang=zh_CN", + "username": "admin", + "password": "ots@2021!!", + "code": "ots" + }, + + "MAQ": { + "menu": "娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�", + "add": { + "company": "TAI娴嬭瘯", + "type": "浜烘牸娴嬭瘯鍖�", + "product": "MAQV2", + "hrEmail": "2077506045@qq.com", + "invalid": "2024-01-01 00:00:00", + "memberLang": "涓枃", + "hrReportLang": "涓枃", + "reportTemplate": "MAQV2-Complete-Chinese", + "memberReportLang": "涓枃" + }, + "info": { + "position":"鑱屽憳", + "dept": "浜轰簨閮�" + } + }, + "JAQ": { + "menu": "娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�", + "add": { + "company": "TAI娴嬭瘯", + "type": "宸ヤ綔鍒嗘瀽鍖�", + "product": "JAQ", + "hrEmail": "2077506045@qq.com", + "invalid": "2024-01-01 00:00:00", + "memberLang": "涓枃", + "hrReportLang": "涓枃", + "reportTemplate": "JAQ-Complete-Chinese", + "memberReportLang": "涓枃", + "position": "涓荤", + "professionalCategory": "绠$悊", + "superiorPosition": "鎬荤粡鐞�" + + }, + "info": { + "position":"鑱屽憳", + "dept": "浜轰簨閮�" + } + } +} \ No newline at end of file diff --git a/elements/jaq_answer_elements.py b/elements/jaq_answer_elements.py new file mode 100644 index 0000000..632e2ef --- /dev/null +++ b/elements/jaq_answer_elements.py @@ -0,0 +1,25 @@ +from selenium.webdriver.common.by import By + + +class JAQAnswerElements: + # 寮�濮嬫祴璇曟寜閽� + start_btn = (By.XPATH, "//button/span[text()='寮�濮嬫祴璇�']/..") + # 棰樼洰閫夐」-a + options_a = (By.XPATH, "//div[@class='el-card__body']/div[1]//span[@class='q-item-span-content']") + # 棰樼洰閫夐」-b + options_b = (By.XPATH, "//div[@class='el-card__body']/div[2]//span[@class='q-item-span-content']") + # 绂佺敤鐨勯�夐」 + disabled = (By.XPATH, "//label[@aria-disabled='true']") + # 缁х画娴嬭瘯鎸夐挳 + continue_testing_btn = (By.XPATH, "//button/span[text()='缁х画娴嬭瘯']") + # 鎻愪氦鎸夐挳 + submit_btn = (By.XPATH, "//button/span[contains(text(),'鎻愪氦')]/..") + # 涓婁紶鎴愬姛鏍囬 + upload_success_title = (By.XPATH, "//main/h2[contains(text(), '鏁版嵁宸茬粡鎴愬姛鍦颁笂浼犺嚦鏈嶅姟鍣�')]") + + # 鍔犺浇妗嗘枃瀛� + loading_text = (By.XPATH, "//div[@class='el-loading-spinner']/p") + + # 鏍囬鏂囧瓧 + title = (By.XPATH, "//h1[text()='JAQ']") + diff --git a/elements/answer_elements.py b/elements/maq_answer_elements.py similarity index 87% rename from elements/answer_elements.py rename to elements/maq_answer_elements.py index c14ba4f..e14a358 100644 --- a/elements/answer_elements.py +++ b/elements/maq_answer_elements.py @@ -1,7 +1,9 @@ from selenium.webdriver.common.by import By -class AnswerElements: +class MAQAnswerElements: + # 寮�濮嬫祴璇曟寜閽� + start_btn = (By.XPATH, "//button") # 棰樼洰閫夐」 options = (By.XPATH, "//span[@class='q-item-span-content']") # 绂佺敤鐨勯�夐」 @@ -9,7 +11,7 @@ # 缁х画娴嬭瘯鎸夐挳 continue_testing_btn = (By.XPATH, "//button/span[text()='缁х画娴嬭瘯']") # 鎻愪氦鎸夐挳 - submit_btn = (By.XPATH, "//button/span[contains(text(),'鎻愪氦')]") + submit_btn = (By.XPATH, "//button/span[contains(text(),'鎻愪氦')]/..") # 涓婁紶鎴愬姛鏍囬 upload_success_title = (By.XPATH, "//main/h2[contains(text(), '鏁版嵁宸茬粡鎴愬姛鍦颁笂浼犺嚦鏈嶅姟鍣�')]") diff --git a/main.py b/main.py index 9385d32..fa7772c 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ def run_testcases(): - pytest.main(['-vs', '--html=report/report.html', 'testcase/']) + pytest.main(['-vs', '--html=report/report.html', 'testcase']) if __name__ == '__main__': diff --git a/po/answer_page.py b/po/answer_page.py deleted file mode 100644 index d3d685e..0000000 --- a/po/answer_page.py +++ /dev/null @@ -1,71 +0,0 @@ -import random - -from base.base_page import BasePage -from elements.answer_elements import AnswerElements as Answer -import time - - -class AnswerPage(BasePage): - """ - 绛旈椤甸潰 - """ - loading_count = 0 - - def answer_MAQ(self): - # 鏆傚仠3绉� - time.sleep(3) - try: - # 鑾峰彇鏍囬 - self.get_element_wait(Answer.title) - except: - # 鏍囬涓嶅瓨鍦ㄧ洿鎺ュけ璐� - return False - while True: - - # 鍒ゆ柇鏄惁涓�鐩村瓨鍦ㄥ姞杞芥 - if self.loadin_text(): - return - - try: - # 鐐瑰嚮缁х画娴嬭瘯鎸夐挳 - self.click(Answer.continue_testing_btn) - except: - pass - - try: - # 鑾峰彇鍒版墍鏈夐�夐」 - options = self.get_elements(Answer.options) - if len(options) < 6: - continue - number = random.randint(0, 5) - options[number].click() - except: - pass - - try: - # 鐐瑰嚮鎻愪氦鎸夐挳 - self.click(Answer.submit_btn) - except: - pass - try: - # 鏁版嵁涓婁紶瀹屾垚 - self.get_element(Answer.upload_success_title) - return True - except: - pass - - def loadin_text(self): - """ - 鍒ゆ柇鍔犺浇妗嗗姞杞斤紝濡傛灉鍔犺浇瓒呰繃10绉掔洿鎺ラ��鍑哄綋鍓嶆祴璇� - :return: - """ - i = 0 - while i < 10: - try: - self.get_element(Answer.loading_text) - i += 1 - time.sleep(1) - except: - return False - else: - return True diff --git a/po/jaq_answer_page.py b/po/jaq_answer_page.py new file mode 100644 index 0000000..c5a939c --- /dev/null +++ b/po/jaq_answer_page.py @@ -0,0 +1,123 @@ +import random + +from base.base_page import BasePage +from elements.jaq_answer_elements import JAQAnswerElements as Answer +from selenium.common.exceptions import * + +import time + + +class JAQAnswerPage(BasePage): + """ + 绛旈椤甸潰 + """ + loading_count = 0 + + def answer_MAQ(self): + # 鏆傚仠3绉� + time.sleep(3) + while True: + # 鏍囬涓嶅瓨鍦ㄧ洿鎺ヨ繑鍥濬alse + if not self.title_is_display(): + return False + + try: + # 鑾峰彇鍒版墍鏈塧閫夐」 + options_a = self.get_elements(Answer.options_a) + if len(options_a) < 5: + continue + number_a = random.randint(0, 4) + options_a[number_a].click() + + # 鑾峰彇鍒版墍鏈塨閫夐」 + options_b = self.get_elements(Answer.options_b) + if len(options_b) < 4: + continue + number_b = random.randint(0, 3) + options_b[number_b].click() + except: + pass + + # 鎻愪氦鎸夐挳瀛樺湪鍒欑偣鍑� + if self.submit_btn_is_display(): + self.click(Answer.submit_btn) + # 鏁版嵁鏄惁涓婁紶瀹屾垚 + time.sleep(15) + if self.upload_is_success(): + return True + return False + + def upload_is_success(self): + """ + 鍒ゆ柇鏁版嵁鏄惁涓婁紶瀹屾垚 + :return: + """ + try: + self.get_element_wait(Answer.upload_success_title) + return True + except TimeoutException: + return False + + def submit_btn_is_display(self): + """ + 鍒ゆ柇鎻愪氦鎸夐挳鏄惁瀛樺湪 + :return: + """ + try: + button = self.get_element(Answer.submit_btn) + if button.is_enabled(): + return True + else: + return False + except NoSuchElementException: + return False + + def continue_btn_is_display(self): + """ + 鍒ゆ柇缁х画娴嬭瘯鎸夐挳鏄惁鍑虹幇 + :return: bool + """ + try: + # 鐐瑰嚮缁х画娴嬭瘯鎸夐挳 + button = self.get_element(Answer.continue_testing_btn) + if button.is_enabled(): + return True + else: + return False + except NoSuchElementException: + return False + + def title_is_display(self): + """ + 鍒ゆ柇鏍囬鏄惁鍑虹幇 + :return: bool + """ + try: + # 鑾峰彇鏍囬 + self.get_element_wait(Answer.title) + return True + except TimeoutException: + return False + + def loadin_text(self): + """ + 鍒ゆ柇鍔犺浇妗嗗姞杞斤紝濡傛灉鍔犺浇瓒呰繃10绉掔洿鎺ラ��鍑哄綋鍓嶆祴璇� + :return: + """ + i = 0 + while i < 10: + try: + self.get_element(Answer.loading_text) + i += 1 + time.sleep(1) + except: + return False + else: + return True + + def start_btn(self): + """ + 寮�濮嬫祴璇曟寜閽� + :return: + """ + self.click_wait(Answer.start_btn) diff --git a/po/maq_answer_page.py b/po/maq_answer_page.py new file mode 100644 index 0000000..7c3afcd --- /dev/null +++ b/po/maq_answer_page.py @@ -0,0 +1,121 @@ +import random + +from base.base_page import BasePage +from elements.maq_answer_elements import MAQAnswerElements as Answer +from selenium.common.exceptions import * + +import time + + +class MAQAnswerPage(BasePage): + """ + 绛旈椤甸潰 + """ + loading_count = 0 + + def answer_MAQ(self): + # 鏆傚仠3绉� + time.sleep(3) + while True: + # 缁х画娴嬭瘯鎸夐挳鍑虹幇鍒欑偣鍑� + if self.continue_btn_is_display(): + self.click(Answer.continue_testing_btn) + + # 鏍囬涓嶅瓨鍦ㄧ洿鎺ヨ繑鍥濬alse + if not self.title_is_display(): + return False + + try: + # 鑾峰彇鍒版墍鏈夐�夐」 + options = self.get_elements(Answer.options) + if len(options) < 6: + continue + number = random.randint(0, 5) + if options[number].is_enabled(): + options[number].click() + except: + pass + + # 鎻愪氦鎸夐挳瀛樺湪鍒欑偣鍑� + if self.submit_btn_is_display(): + self.click(Answer.submit_btn) + # 鏁版嵁鏄惁涓婁紶瀹屾垚 + time.sleep(15) + if self.upload_is_success(): + return True + return False + + def upload_is_success(self): + """ + 鍒ゆ柇鏁版嵁鏄惁涓婁紶瀹屾垚 + :return: + """ + try: + self.get_element_wait(Answer.upload_success_title) + return True + except TimeoutException: + return False + + def submit_btn_is_display(self): + """ + 鍒ゆ柇鎻愪氦鎸夐挳鏄惁瀛樺湪 + :return: + """ + try: + button = self.get_element(Answer.submit_btn) + if button.is_enabled(): + return True + else: + return False + except NoSuchElementException: + return False + + def continue_btn_is_display(self): + """ + 鍒ゆ柇缁х画娴嬭瘯鎸夐挳鏄惁鍑虹幇 + :return: bool + """ + try: + # 鐐瑰嚮缁х画娴嬭瘯鎸夐挳 + button = self.get_element(Answer.continue_testing_btn) + if button.is_enabled(): + return True + else: + return False + except NoSuchElementException: + return False + + def title_is_display(self): + """ + 鍒ゆ柇鏍囬鏄惁鍑虹幇 + :return: bool + """ + try: + # 鑾峰彇鏍囬 + self.get_element_wait(Answer.title) + return True + except TimeoutException: + return False + + def loadin_text(self): + """ + 鍒ゆ柇鍔犺浇妗嗗姞杞斤紝濡傛灉鍔犺浇瓒呰繃10绉掔洿鎺ラ��鍑哄綋鍓嶆祴璇� + :return: + """ + i = 0 + while i < 10: + try: + self.get_element(Answer.loading_text) + i += 1 + time.sleep(1) + except: + return False + else: + return True + + def start_btn(self): + """ + 寮�濮嬫祴璇曟寜閽� + :return: + """ + self.click_wait(Answer.start_btn) diff --git a/po/test_package_list_page.py b/po/test_package_list_page.py index 35d1e8e..d64c593 100644 --- a/po/test_package_list_page.py +++ b/po/test_package_list_page.py @@ -23,7 +23,7 @@ 鐐瑰嚮鍒涘缓鎸夐挳 :return: """ - self.click(PackageList.create_btn) + self.click_wait(PackageList.create_btn) # 鍒囨崲鍒癮dd绐楀彛鐨刬frame self.switch_iframe(PackageList.add_iframe) @@ -33,7 +33,7 @@ :return: """ # 鐐瑰嚮鍒犻櫎鎸夐挳 - self.click(PackageList.delete_btn) + self.click_wait(PackageList.delete_btn) # 鐐瑰嚮纭鎸夐挳 self.click_wait(PackageList.delete_confirm_btn) @@ -43,7 +43,7 @@ :param testPackageName: 娴嬭瘯鍖呭悕绉� :return: """ - self.send_text(testPackageName, PackageList.add_testPackageName_input) + self.send_text_wait(testPackageName, PackageList.add_testPackageName_input) def reportCompanyName_input(self, reportCompanyName): """ @@ -51,7 +51,7 @@ :param reportCompanyName: 鎶ュ憡浼佷笟鍚嶇О :return: """ - self.send_text(reportCompanyName, PackageList.add_reportCompanyName_input) + self.send_text_wait(reportCompanyName, PackageList.add_reportCompanyName_input) def testPackageType_select(self, testPackageType): """ @@ -60,9 +60,9 @@ :return: """ # 鐐瑰嚮涓嬫媺妗� - self.click(PackageList.add_testPackageType_select) + self.click_wait(PackageList.add_testPackageType_select) # 鑾峰彇鎵�鏈夐�夐」 - options = self.get_elements(PackageList.add_testPackageType_option) + options = self.get_elements_wait(PackageList.add_testPackageType_option) # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑 for opt in options: if opt.text == testPackageType: @@ -77,12 +77,12 @@ :return: """ # 鐐瑰嚮鏌ヨ鎸夐挳 - self.click(PackageList.add_prodTree_btn) + self.click_wait(PackageList.add_prodTree_btn) # 鍒囨崲鍒皃rodTree鐨刬frame self.switch_iframe_wait(PackageList.prodTree_iframe) time.sleep(2) # 鑾峰彇鎵�鏈夐�夐」 - options = self.get_elements(PackageList.prodTree_option) + options = self.get_elements_wait(PackageList.prodTree_option) # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ラ�夐」鐩哥瓑 for opt in options: if opt.text == prodName: @@ -91,7 +91,7 @@ # 鍒囨崲鍒颁笂涓�灞傜殑iframe self.switch_parent_iframe() # 鐐瑰嚮纭鎸夐挳 - self.click(PackageList.prodTree_confirm_btn) + self.click_wait(PackageList.prodTree_confirm_btn) def hrReportEmail_input(self, hr_email): """ @@ -99,7 +99,7 @@ :param hr_email: :return: """ - self.send_text(hr_email, PackageList.add_hrEmail_input) + self.send_text_wait(hr_email, PackageList.add_hrEmail_input) def invalidTime_input(self, invalid_time): """ @@ -107,8 +107,8 @@ :param invalid_time: :return: """ - self.send_text(invalid_time, PackageList.add_invalidTime) - self.click(PackageList.add_invalidTime) + self.send_text_wait(invalid_time, PackageList.add_invalidTime) + self.click_wait(PackageList.add_invalidTime) def testTemplateLangType_select(self, text): """ @@ -119,9 +119,9 @@ # 鍒嗗壊text lang_types = text.split(",") # 鐐瑰嚮涓嬫媺妗� - self.click(PackageList.add_templateLangType_select) + self.click_wait(PackageList.add_templateLangType_select) # 鑾峰彇鎵�鏈夐�夐」 - options = self.get_elements(PackageList.add_templateLangType_option) + options = self.get_elements_wait(PackageList.add_templateLangType_option) # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑 for opt in options: for lang_type in lang_types: @@ -139,9 +139,9 @@ # 鍒嗗壊text lang_types = text.split(",") # 鐐瑰嚮涓嬫媺妗� - self.click(PackageList.add_hrTemplateLangType_select) + self.click_wait(PackageList.add_hrTemplateLangType_select) # 鑾峰彇鎵�鏈夐�夐」 - options = self.get_elements(PackageList.add_hrTemplateLangType_option) + options = self.get_elements_wait(PackageList.add_hrTemplateLangType_option) # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑 for opt in options: for lang_type in lang_types: @@ -159,9 +159,9 @@ # 鍒嗗壊text templates = text.split(",") # 鐐瑰嚮涓嬫媺妗� - self.click(PackageList.add_reportTemplateId_select) + self.click_wait(PackageList.add_reportTemplateId_select) # 鑾峰彇鎵�鏈夐�夐」 - options = self.get_elements(PackageList.add_reportTemplateId_option) + options = self.get_elements_wait(PackageList.add_reportTemplateId_option) # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑 for opt in options: for template in templates: @@ -170,7 +170,7 @@ opt.click() break # 鍐嶆鐐瑰嚮涓嬫媺妗� - self.click(PackageList.add_reportTemplateId_select) + self.click_wait(PackageList.add_reportTemplateId_select) def position_input(self, text): """ @@ -178,7 +178,7 @@ :param text: :return: """ - self.send_text(text, PackageList.add_position_input) + self.send_text_wait(text, PackageList.add_position_input) def professionalCategory_input(self, text): """ @@ -186,7 +186,7 @@ :param text: :return: """ - self.send_text(text, PackageList.add_professionalCategory_input) + self.send_text_wait(text, PackageList.add_professionalCategory_input) def superiorPosition_input(self, text): """ @@ -194,14 +194,14 @@ :param text: :return: """ - self.send_text(text, PackageList.add_superiorPosition_input) + self.send_text_wait(text, PackageList.add_superiorPosition_input) def autoSendReport_checkbox(self): """ 鐐瑰嚮娴嬭瘯鑰呮帴鏀舵姤鍛� :return: """ - self.click(PackageList.add_autoSendReport_checkbox) + self.click_wait(PackageList.add_autoSendReport_checkbox) def memberReportLangType_select(self, text): """ @@ -212,9 +212,9 @@ # 鍒嗗壊text lang_types = text.split(",") # 鐐瑰嚮涓嬫媺妗� - self.click(PackageList.add_memberTemplateLangType_select) + self.click_wait(PackageList.add_memberTemplateLangType_select) # 鑾峰彇鎵�鏈夐�夐」 - options = self.get_elements(PackageList.add_memberTemplateLangType_option) + options = self.get_elements_wait(PackageList.add_memberTemplateLangType_option) # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑 for opt in options: for lang_type in lang_types: @@ -230,7 +230,7 @@ """ # 鍥炲埌涓婁竴灞俰frame self.switch_parent_iframe() - self.click(PackageList.add_confirm_btn) + self.click_wait(PackageList.add_confirm_btn) def is_create_success(self, packageName): """ @@ -238,7 +238,7 @@ :param packageName: 娴嬭瘯鍖呭悕绉� :return: bool """ - names = self.get_elements(PackageList.table_packageName_a) + names = self.get_elements_wait(PackageList.table_packageName_a) for name in names: if name.text == packageName: return True @@ -251,7 +251,7 @@ :return: """ # 鑾峰彇鍒皌able鐨勬墍鏈塼r - table_trs = self.get_elements(PackageList.table_package_tr) + table_trs = self.get_elements_wait(PackageList.table_package_tr) for tr in table_trs: # 娴嬭瘯鍖呭悕绉板湪tr涓殑瀹氫綅 package_name_loc = (By.XPATH, "td[2]/a") @@ -271,7 +271,7 @@ 鐐瑰嚮鐢熸垚鍒嗕韩閾炬帴鎸夐挳 :return: """ - self.click(PackageList.share_1_btn) + self.click_wait(PackageList.share_1_btn) def get_share_url(self): """ @@ -284,11 +284,10 @@ url = self.get_input_value_js(PackageList.share_url_input) # 閫�鍥炰笂涓�灞俰frame self.switch_parent_iframe() - time.sleep(1) # 鐐瑰嚮鍏抽棴鎸夐挳 - self.click(PackageList.share_cancel_btn) + self.click_wait(PackageList.share_cancel_btn) + time.sleep(1) return url - def selector(self, click_loc, options_loc, text): """ @@ -299,9 +298,9 @@ :return: """ # 鐐瑰嚮涓嬫媺妗� - self.click(click_loc) + self.click_wait(click_loc) # 鑾峰彇鎵�鏈夐�夐」 - options = self.get_elements(options_loc) + options = self.get_elements_wait(options_loc) # 鍒ゆ柇閫夐」鏄惁涓庝紶鍏ョ殑閫夐」鐩哥瓑 for opt in options: if opt.text == text: diff --git a/report/report.html b/report/report.html index d0e570c..e770deb 100644 --- a/report/report.html +++ b/report/report.html @@ -253,10 +253,10 @@ } </script> <h1>report.html</h1> - <p>Report generated on 14-Jul-2023 at 17:57:30 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.2.0</p> + <p>Report generated on 17-Jul-2023 at 16:13:07 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.2.0</p> <h2>Summary</h2> - <p>0 tests ran in 0.01 seconds. </p> - <p class="filter" hidden="true">(Un)check the boxes to filter the results.</p><input checked="true" class="filter" data-test-result="passed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="passed">0 passed</span>, <input checked="true" class="filter" data-test-result="skipped" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="skipped">0 skipped</span>, <input checked="true" class="filter" data-test-result="failed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="failed">0 failed</span>, <input checked="true" class="filter" data-test-result="error" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="error">0 errors</span>, <input checked="true" class="filter" data-test-result="xfailed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xfailed">0 expected failures</span>, <input checked="true" class="filter" data-test-result="xpassed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xpassed">0 unexpected passes</span> + <p>10 tests ran in 388.23 seconds. </p> + <p class="filter" hidden="true">(Un)check the boxes to filter the results.</p><input checked="true" class="filter" data-test-result="passed" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="passed">10 passed</span>, <input checked="true" class="filter" data-test-result="skipped" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="skipped">0 skipped</span>, <input checked="true" class="filter" data-test-result="failed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="failed">0 failed</span>, <input checked="true" class="filter" data-test-result="error" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="error">0 errors</span>, <input checked="true" class="filter" data-test-result="xfailed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xfailed">0 expected failures</span>, <input checked="true" class="filter" data-test-result="xpassed" disabled="true" hidden="true" name="filter_checkbox" onChange="filterTable(this)" type="checkbox"/><span class="xpassed">0 unexpected passes</span> <h2>Results</h2> <table id="results-table"> <thead id="results-table-head"> @@ -266,4 +266,94 @@ <th class="sortable" col="duration">Duration</th> <th class="sortable links" col="links">Links</th></tr> <tr hidden="true" id="not-found-message"> - <th colspan="4">No results found. Try to check the filters</th></tr></thead></table></body></html> \ No newline at end of file + <th colspan="4">No results found. Try to check the filters</th></tr></thead> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_jaq.py::TestJAQ::test_login[login]</td> + <td class="col-duration">4.92</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_jaq.py::TestJAQ::test_create_package[JAQ]</td> + <td class="col-duration">14.10</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_jaq.py::TestJAQ::test_open_url[JAQ]</td> + <td class="col-duration">14.05</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_jaq.py::TestJAQ::test_answer</td> + <td class="col-duration">93.40</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_jaq.py::TestJAQ::test_delete_package</td> + <td class="col-duration">7.31</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_maq.py::TestMAQ::test_login[login]</td> + <td class="col-duration">4.82</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_maq.py::TestMAQ::test_create_package[MAQ]</td> + <td class="col-duration">14.45</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_maq.py::TestMAQ::test_open_url[MAQ]</td> + <td class="col-duration">13.81</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_maq.py::TestMAQ::test_answer</td> + <td class="col-duration">213.81</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody> + <tbody class="passed results-table-row"> + <tr> + <td class="col-result">Passed</td> + <td class="col-name">testcase/test_maq.py::TestMAQ::test_delete_package</td> + <td class="col-duration">7.38</td> + <td class="col-links"></td></tr> + <tr> + <td class="extra" colspan="4"> + <div class="empty log">No log output captured.</div></td></tr></tbody></table></body></html> \ No newline at end of file diff --git a/testcase/conftest.py b/testcase/conftest.py new file mode 100644 index 0000000..84df2a8 --- /dev/null +++ b/testcase/conftest.py @@ -0,0 +1,24 @@ +""" + 娴嬭瘯鏁版嵁鍏变韩鏂囦欢 +""" + +import pytest +import json +import os + + +@pytest.fixture +def data_read(request) -> dict: + """ + 璇诲彇娴嬭瘯浣跨敤鐨勬暟鎹� + :param request: 鎺ユ敹浼犻�掔殑鍙傛暟 + :return: 瀛楀吀 + """ + # 鑾峰彇褰撳墠椤圭洰鏍硅矾寰� + root_path = os.getcwd() + # 鑾峰彇鍒拌鑾峰彇鏁版嵁鐨勯敭 + key = request.param + # 璇诲彇鏁版嵁 + with open(root_path + r"\data\test_data.json", "r", encoding="utf-8") as f: + values = json.load(f) + return values[key] diff --git a/testcase/test_jaq.py b/testcase/test_jaq.py index 4d2701a..146daed 100644 --- a/testcase/test_jaq.py +++ b/testcase/test_jaq.py @@ -8,16 +8,17 @@ from po.home_page import HomePage from po.test_package_list_page import TestPackageListPage from po.share_add_page import ShareAddPage -from po.answer_page import AnswerPage +from po.jaq_answer_page import JAQAnswerPage from comm.my_random import * class TestJAQ: driver = None - test_package_name = "MAQ鑷姩娴嬭瘯鍖�-20230711151825" + test_package_name = None - def test_login(self): + @pytest.mark.parametrize('data_read', ["login"], indirect=True) + def test_login(self, data_read: dict): """ 鎵撳紑椤甸潰骞惰繘琛岀櫥褰曟祴璇� :return: @@ -27,7 +28,7 @@ login_page = LoginPage(driver) try: # 鎵撳紑閾炬帴 - driver.get("http://161.117.57.194/login?lang=zh_CN") + driver.get(data_read["url"]) except: # 閾炬帴鎵撳紑鍑虹幇寮傚父璇存槑閾炬帴鏃犳硶璁块棶,鎹曡幏寮傚父浣嗕笉鍋氬鐞� pass @@ -52,11 +53,12 @@ except: break - login_page.login("admin", "ots@2021!!", "ots") + login_page.login(data_read["username"], data_read["password"], data_read["code"]) time.sleep(2) assert login_page.is_login_success() - def test_create_package(self): + @pytest.mark.parametrize('data_read', ["JAQ"], indirect=True) + def test_create_package(self, data_read: dict): """ 鍒涘缓娴嬭瘯鍖� :return: @@ -66,8 +68,7 @@ # 鍒涘缓home椤甸潰鐨勫璞� home_page = HomePage(driver) # 鐐瑰嚮宸︿晶鑿滃崟杩涘叆椤甸潰 - home_page.menu_select("娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�") - + home_page.menu_select(data_read["menu"]) # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄 test_package_list = TestPackageListPage(driver) # 鐐瑰嚮鍒涘缓鎸夐挳 @@ -81,66 +82,46 @@ test_package_name = "JAQ鑷姩娴嬭瘯鍖�-" + time_str # 璁剧疆娴嬭瘯鍖呭悕绉颁负绫诲彉閲� TestJAQ.test_package_name = test_package_name - # 鎶ュ憡浼佷笟鍚嶇О - report_company_name = "TAI娴嬭瘯" - # 娴嬭瘯鍖呯被鍨� - test_package_type = "宸ヤ綔鍒嗘瀽鍖�" - # 浜у搧鍖� - prod_name = "JAQ" - # HR閭 - hr_email = "2077506045@qq.com" - # 鏈夋晥鏈� - invalid_time = "2024-01-01 00:00:00" - # 娴嬭瘯鑰呴個璇烽偖浠惰瑷�绫诲瀷 - test_email_lang_type = "涓枃" - # hr鎶ュ憡閭欢璇█绫诲瀷 - hr_report_email_lang_type = "涓枃" - # 鎶ュ憡妯℃澘 - report_template = "JAQ-Complete-Chinese" - # 瑕佽瘎浠风殑宀椾綅 - position = "涓荤" - # 鑱屼笟澶х被 - professional_category = "绠$悊" - # 涓婄骇宀椾綅 - superior_position = "鎬荤粡鐞�" - # 娴嬭瘯鑰呮姤鍛婇偖浠惰瑷�绫诲瀷 - member_report_email_lang_type = "涓枃" + + # 鑾峰彇鍒涘缓娴嬭瘯鍖呯殑鏁版嵁 + create_data = data_read["add"] # 濉啓娴嬭瘯鍖呭悕绉� test_package_list.testPackageName_input(test_package_name) - # 濉啓鎶ュ憡浼佷笟鍚嶇О - test_package_list.reportCompanyName_input(report_company_name) + test_package_list.reportCompanyName_input(create_data["company"]) # 閫夋嫨娴嬭瘯鍖呯被鍨� - test_package_list.testPackageType_select(test_package_type) + test_package_list.testPackageType_select(create_data["type"]) # 閫夋嫨浜у搧鍖� - test_package_list.prodTree_select(prod_name) + test_package_list.prodTree_select(create_data["product"]) # 杈撳叆hr閭 - test_package_list.hrReportEmail_input(hr_email) + test_package_list.hrReportEmail_input(create_data["hrEmail"]) # 杈撳叆鏈夋晥鏈� - test_package_list.invalidTime_input(invalid_time) + test_package_list.invalidTime_input(create_data["invalid"]) # 閫夋嫨閭�璇烽偖浠惰瑷�绫诲瀷 - test_package_list.testTemplateLangType_select(test_email_lang_type) + test_package_list.testTemplateLangType_select(create_data["memberLang"]) # 閫夋嫨HR閭欢璇█绫诲瀷 - test_package_list.hrTemplateLangType_select(hr_report_email_lang_type) + test_package_list.hrTemplateLangType_select(create_data["hrReportLang"]) # 閫夋嫨鎶ュ憡妯℃澘 - test_package_list.reportTemplate_select(report_template) + test_package_list.reportTemplate_select(create_data["reportTemplate"]) # 杈撳叆瑕佽瘎浠风殑宀椾綅 - test_package_list.position_input(position) + test_package_list.position_input(create_data["position"]) # 杈撳叆鑱屼笟澶х被 - test_package_list.professionalCategory_input(professional_category) + test_package_list.professionalCategory_input(create_data["professionalCategory"]) # 杈撳叆涓婄骇宀椾綅 - test_package_list.superiorPosition_input(superior_position) + test_package_list.superiorPosition_input(create_data["superiorPosition"]) # 鐐瑰嚮娴嬭瘯鑰呮帴鏀舵姤鍛� test_package_list.autoSendReport_checkbox() # 閫夋嫨娴嬭瘯鑰呮姤鍛婇偖绠辫瑷�绫诲瀷 - test_package_list.memberReportLangType_select(member_report_email_lang_type) + test_package_list.memberReportLangType_select(create_data["memberReportLang"]) # 鐐瑰嚮纭鎸夐挳 test_package_list.add_confirm() time.sleep(2) # 鍒ゆ柇鏄惁鎴愬姛鍒涘缓 assert test_package_list.is_create_success(test_package_name) + time.sleep(5) - def test_open_url(self): + @pytest.mark.parametrize('data_read', ["JAQ"], indirect=True) + def test_open_url(self, data_read: dict): """ 鎵撳紑鍒嗕韩閾炬帴 :return: @@ -163,30 +144,32 @@ name = random_string(8) email = name + "@gmail.com" test_url = share_add.page_default_operation(name, email) - # test_url = "http://161.117.57.194/exam-stu/#/ots/94830ada-8f6c-44c0-8946-79c43267d9c1/login" # 褰撳墠椤甸潰鎵撳紑閾炬帴 driver.get(test_url) # 鐐瑰嚮鎻愪氦鎸夐挳 share_add.submit_btn() + # 鑾峰彇鏁版嵁 + info = data_read["info"] # 濉啓鍩烘湰淇℃伅骞舵彁浜� - share_add.fill_info(email, "鑱屽憳", "浜轰簨閮�") - # 鐐瑰嚮寮�濮嬫祴璇� - share_add.submit_btn() + share_add.fill_info(email, info["position"], info["dept"]) + time.sleep(5) def test_answer(self): # 鑾峰彇driver driver = TestJAQ.driver # 鍒涘缓answer瀵硅薄 - answer_page = AnswerPage(driver) + answer_page = JAQAnswerPage(driver) + # 鐐瑰嚮寮�濮嬫祴璇� + answer_page.start_btn() # 寮�濮嬬瓟棰� - # flag = answer_page.answer_MAQ() - # if not flag: - # assert flag - # return + flag = answer_page.answer_MAQ() # 绛斿畬棰樺叧闂綋鍓嶆爣绛鹃〉 driver.close() # 鍒囨崲鍒扮涓�涓爣绛鹃〉 answer_page.switch_window(0) + if flag is not None or not flag: + assert flag + return def test_delete_package(self): # 鑾峰彇driver diff --git a/testcase/test_maq.py b/testcase/test_maq.py index 09ef8f1..e702e7a 100644 --- a/testcase/test_maq.py +++ b/testcase/test_maq.py @@ -8,18 +8,19 @@ from po.home_page import HomePage from po.test_package_list_page import TestPackageListPage from po.share_add_page import ShareAddPage -from po.answer_page import AnswerPage +from po.maq_answer_page import MAQAnswerPage from comm.my_random import * class TestMAQ: - driver = None - test_package_name = "MAQ鑷姩娴嬭瘯鍖�-20230711151825" + test_package_name = None - def test_login(self): + @pytest.mark.parametrize('data_read', ["login"], indirect=True) + def test_login(self, data_read: dict): """ 鎵撳紑椤甸潰骞惰繘琛岀櫥褰曟祴璇� + :param data_read: 鎵ц鏁版嵁璇诲彇鐨勫嚱鏁板苟鑾峰彇鍒拌繑鍥炲�� :return: """ TestMAQ.driver = webdriver.Chrome() @@ -27,7 +28,7 @@ login_page = LoginPage(driver) try: # 鎵撳紑閾炬帴 - driver.get("http://161.117.57.194/login?lang=zh_CN") + driver.get(data_read["url"]) except: # 閾炬帴鎵撳紑鍑虹幇寮傚父璇存槑閾炬帴鏃犳硶璁块棶,鎹曡幏寮傚父浣嗕笉鍋氬鐞� pass @@ -52,13 +53,15 @@ except: break - login_page.login("admin", "ots@2021!!", "ots") + login_page.login(data_read["username"], data_read["password"], data_read["code"]) time.sleep(2) assert login_page.is_login_success() - def test_create_package(self): + @pytest.mark.parametrize('data_read', ["MAQ"], indirect=True) + def test_create_package(self, data_read: dict): """ 鍒涘缓娴嬭瘯鍖� + :param data_read: 璇诲彇鏁版嵁 :return: """ # 鑾峰彇driver @@ -66,8 +69,7 @@ # 鍒涘缓home椤甸潰鐨勫璞� home_page = HomePage(driver) # 鐐瑰嚮宸︿晶鑿滃崟杩涘叆椤甸潰 - home_page.menu_select("娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�") - + home_page.menu_select(data_read["menu"]) # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄 test_package_list = TestPackageListPage(driver) # 鐐瑰嚮鍒涘缓鎸夐挳 @@ -81,54 +83,39 @@ test_package_name = "MAQ鑷姩娴嬭瘯鍖�-" + time_str # 璁剧疆娴嬭瘯鍖呭悕绉颁负绫诲彉閲� TestMAQ.test_package_name = test_package_name - # 鎶ュ憡浼佷笟鍚嶇О - report_company_name = "TAI娴嬭瘯" - # 娴嬭瘯鍖呯被鍨� - test_package_type = "浜烘牸娴嬭瘯鍖�" - # 浜у搧鍖� - prod_name = "MAQV2" - # HR閭 - hr_email = "2077506045@qq.com" - # 鏈夋晥鏈� - invalid_time = "2024-01-01 00:00:00" - # 娴嬭瘯鑰呴個璇烽偖浠惰瑷�绫诲瀷 - test_email_lang_type = "涓枃" - # hr鎶ュ憡閭欢璇█绫诲瀷 - hr_report_email_lang_type = "涓枃" - # 鎶ュ憡妯℃澘 - report_template = "MAQV2-Complete-Chinese" - # 娴嬭瘯鑰呮姤鍛婇偖浠惰瑷�绫诲瀷 - member_report_email_lang_type = "涓枃" - + # 鑾峰彇鍒涘缓娴嬭瘯鍖呯殑鏁版嵁 + create_data = data_read["add"] # 濉啓娴嬭瘯鍖呭悕绉� test_package_list.testPackageName_input(test_package_name) # 濉啓鎶ュ憡浼佷笟鍚嶇О - test_package_list.reportCompanyName_input(report_company_name) + test_package_list.reportCompanyName_input(create_data["company"]) # 閫夋嫨娴嬭瘯鍖呯被鍨� - test_package_list.testPackageType_select(test_package_type) + test_package_list.testPackageType_select(create_data["type"]) # 閫夋嫨浜у搧鍖� - test_package_list.prodTree_select(prod_name) + test_package_list.prodTree_select(create_data["product"]) # 杈撳叆hr閭 - test_package_list.hrReportEmail_input(hr_email) + test_package_list.hrReportEmail_input(create_data["hrEmail"]) # 杈撳叆鏈夋晥鏈� - test_package_list.invalidTime_input(invalid_time) + test_package_list.invalidTime_input(create_data["invalid"]) # 閫夋嫨閭�璇烽偖浠惰瑷�绫诲瀷 - test_package_list.testTemplateLangType_select(test_email_lang_type) + test_package_list.testTemplateLangType_select(create_data["memberLang"]) # 閫夋嫨HR閭欢璇█绫诲瀷 - test_package_list.hrTemplateLangType_select(hr_report_email_lang_type) + test_package_list.hrTemplateLangType_select(create_data["hrReportLang"]) # 閫夋嫨鎶ュ憡妯℃澘 - test_package_list.reportTemplate_select(report_template) + test_package_list.reportTemplate_select(create_data["reportTemplate"]) # 鐐瑰嚮娴嬭瘯鑰呮帴鏀舵姤鍛� test_package_list.autoSendReport_checkbox() # 閫夋嫨娴嬭瘯鑰呮姤鍛婇偖绠辫瑷�绫诲瀷 - test_package_list.memberReportLangType_select(member_report_email_lang_type) + test_package_list.memberReportLangType_select(create_data["memberReportLang"]) # 鐐瑰嚮纭鎸夐挳 test_package_list.add_confirm() time.sleep(2) # 鍒ゆ柇鏄惁鎴愬姛鍒涘缓 assert test_package_list.is_create_success(test_package_name) + time.sleep(5) - def test_open_url(self): + @pytest.mark.parametrize('data_read', ["MAQ"], indirect=True) + def test_open_url(self, data_read: dict): """ 鎵撳紑鍒嗕韩閾炬帴 :return: @@ -151,30 +138,32 @@ name = random_string(8) email = name + "@gmail.com" test_url = share_add.page_default_operation(name, email) - # test_url = "http://161.117.57.194/exam-stu/#/ots/94830ada-8f6c-44c0-8946-79c43267d9c1/login" # 褰撳墠椤甸潰鎵撳紑閾炬帴 driver.get(test_url) # 鐐瑰嚮鎻愪氦鎸夐挳 share_add.submit_btn() + # 鑾峰彇鏁版嵁 + info = data_read["info"] # 濉啓鍩烘湰淇℃伅骞舵彁浜� - share_add.fill_info(email, "鑱屽憳", "浜轰簨閮�") - # 鐐瑰嚮寮�濮嬫祴璇� - share_add.submit_btn() + share_add.fill_info(email, info["position"], info["dept"]) + time.sleep(5) def test_answer(self): # 鑾峰彇driver driver = TestMAQ.driver # 鍒涘缓answer瀵硅薄 - answer_page = AnswerPage(driver) + answer_page = MAQAnswerPage(driver) + # 鐐瑰嚮寮�濮嬫祴璇� + answer_page.start_btn() # 寮�濮嬬瓟棰� flag = answer_page.answer_MAQ() - if flag is None or not flag: - assert flag - return # 绛斿畬棰樺叧闂綋鍓嶆爣绛鹃〉 driver.close() # 鍒囨崲鍒扮涓�涓爣绛鹃〉 answer_page.switch_window(0) + if flag is not None or not flag: + assert flag + return def test_delete_package(self): # 鑾峰彇driver @@ -186,7 +175,6 @@ time.sleep(5) # 鍏抽棴 driver.quit() - if __name__ == '__main__': -- Gitblit v1.9.1