From 3b84cce1ee43215b9f398148fda19f4b1025856b Mon Sep 17 00:00:00 2001 From: yj <2077506045@qq.com> Date: 星期三, 24 七月 2024 17:46:00 +0800 Subject: [PATCH] 测评系统自动测试 --- po/maq_answer_page.py | 36 +- elements/ciaq_answer_elements.py | 10 base/base_page.py | 21 + elements/caq_answer_elements.py | 34 +- po/caq_answer_page.py | 92 ++++--- po/vaq_answer_page.py | 80 +++--- testcase/test_main.py | 223 +++++++++++++++++++ report/report.html | 8 elements/jaq_answer_elements.py | 11 elements/vaq_answer_elements.py | 16 + po/jaq_answer_page.py | 62 ++--- testcase/conftest.py | 8 data/test_data.json | 4 po/ciaq_answer_page.py | 51 ++-- 14 files changed, 451 insertions(+), 205 deletions(-) diff --git a/base/base_page.py b/base/base_page.py index 48f4473..1eaae78 100644 --- a/base/base_page.py +++ b/base/base_page.py @@ -279,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) # 鍏冪礌瀹氫綅 @@ -397,15 +397,26 @@ # 婊戝姩椤甸潰 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): diff --git a/data/test_data.json b/data/test_data.json index 3d86b8a..df214f5 100644 --- a/data/test_data.json +++ b/data/test_data.json @@ -624,6 +624,7 @@ } }, "JAQ": { + "share_url": "http://47.114.179.216:8090/exam/testMember/shareAdd?packageId=VGtSbk5BPT0=", "menu": "娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�", "add": { "company": "TAI娴嬭瘯", @@ -646,6 +647,7 @@ } }, "CAQ": { + "share_url": "http://47.114.179.216:8090/exam/testMember/shareAdd?packageId=VGtSbk5RPT0=", "menu": "娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�", "add": { "company": "TAI娴嬭瘯", @@ -664,6 +666,7 @@ } }, "VAQ": { + "share_url": "http://47.114.179.216:8090/exam/testMember/shareAdd?packageId=VGtScmVRPT0=", "menu": "娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�", "add": { "company": "TAI娴嬭瘯", @@ -682,6 +685,7 @@ } }, "CIAQ": { + "share_url": "http://47.114.179.216:8090/exam/testMember/shareAdd?packageId=VGtScmVBPT0=", "menu": "娴嬭瘯鍖呯鐞�/娴嬭瘯鍖呭垪琛�", "add": { "company": "TAI娴嬭瘯", diff --git a/elements/caq_answer_elements.py b/elements/caq_answer_elements.py index e5da581..0890735 100644 --- a/elements/caq_answer_elements.py +++ b/elements/caq_answer_elements.py @@ -4,25 +4,29 @@ class CAQAnswerElements: # 寮�濮嬫祴璇曟寜閽� start_btn = (By.XPATH, "//button") - # 棰樼洰閫夐」-1 - options_1 = (By.XPATH, "//div[@class='el-card__body']/div[3]//span[@class='q-item-span-content']/../..") - # 棰樼洰閫夐」-2 - options_2 = (By.XPATH, "//div[@class='el-card__body']/div[4]//span[@class='q-item-span-content']/../..") - # 棰樼洰閫夐」-3 - options_3 = (By.XPATH, "//div[@class='el-card__body']/div[5]//span[@class='q-item-span-content']/../..") - # 棰樼洰閫夐」-4 - options_4 = (By.XPATH, "//div[@class='el-card__body']/div[6]//span[@class='q-item-span-content']/../..") - # 棰樼洰閫夐」-5 - options_5 = (By.XPATH, "//div[@class='el-card__body']/div[7]//span[@class='q-item-span-content']/../..") - # 棰樼洰閫夐」-6 - options_6 = (By.XPATH, "//div[@class='el-card__body']/div[2]//span[@class='q-item-span-content']/../..") + # 棰樼洰鏍囬 + q_title = (By.XPATH, "//div[@class='el-form-item el-form-item--medium'][1]//div[@class='q-title']") + # 棰樼洰 + questions = (By.XPATH, "//div[substring(text(), 1, 1) = '(' and substring(text(), 3, 1) = ')']/..") + # 棰樼洰閫夐」 + options = (By.XPATH, "div[2]/div/label") + + options_2 = (By.XPATH, "//label/span[1]") + + # 婊氬姩鍒伴《閮ㄦ寜閽� + scroll_top_btn = (By.XPATH, "//div[@class='back-to-ceiling' and @style='']") + + q_title_2 = (By.XPATH, "//div[@class='q-title']") + + + btn = (By.XPATH, "//button") + next_btn = (By.XPATH, "//button[2]") # 绂佺敤鐨勯�夐」 disabled = (By.XPATH, "//label[@aria-disabled='true']") # 缁х画娴嬭瘯鎸夐挳 - continue_testing_btn = (By.XPATH, "//button/span[text()='缁х画娴嬭瘯']/..") + continue_testing_btn = (By.XPATH, "//button[1]") # 涓嬩竴棰樻寜閽� - next_btn = (By.XPATH, "//button/span[text()='涓嬩竴棰�']/..") # 鎻愪氦鎸夐挳 submit_btn = (By.XPATH, "//button/span[contains(text(),'鎻愪氦')]/..") # 涓婁紶鎴愬姛鏍囬 @@ -34,3 +38,5 @@ # 鏍囬鏂囧瓧 title = (By.XPATH, "//div[@class='align-center']/span[2]") + close_btn = (By.XPATH, "//button") + diff --git a/elements/ciaq_answer_elements.py b/elements/ciaq_answer_elements.py index 9b401ce..ac16cf2 100644 --- a/elements/ciaq_answer_elements.py +++ b/elements/ciaq_answer_elements.py @@ -4,14 +4,16 @@ class CIAQAnswerElements: # 寮�濮嬫祴璇曟寜閽� start_btn = (By.XPATH, "//button/span[text()='寮�濮嬫祴璇�']/..") + # 棰樼洰 + q_title = (By.XPATH, "//div[@class='q-title']") # 棰樼洰閫夐」 - options = (By.XPATH, "//span[@class='q-item-span-content']") + options = (By.XPATH, "//label[@class='el-radio']") # 绂佺敤鐨勯�夐」 disabled = (By.XPATH, "//label[@aria-disabled='true']") # 缁х画娴嬭瘯鎸夐挳 - continue_testing_btn = (By.XPATH, "//button/span[text()='缁х画娴嬭瘯']/..") + continue_testing_btn = (By.XPATH, "//button") # 鎻愪氦鎸夐挳 - submit_btn = (By.XPATH, "//button/span[contains(text(),'鎻愪氦')]/..") + submit_btn = (By.XPATH, "//button[2]") # 涓婁紶鎴愬姛鏍囬 upload_success_title = (By.XPATH, "//main/h2[contains(text(), '鏁版嵁宸茬粡鎴愬姛鍦颁笂浼犺嚦鏈嶅姟鍣�')]") @@ -21,3 +23,5 @@ # 鏍囬鏂囧瓧 title = (By.XPATH, "//div[@class='align-center']/span[2]") + close_btn = (By.XPATH, "//button") + diff --git a/elements/jaq_answer_elements.py b/elements/jaq_answer_elements.py index 632e2ef..d38841f 100644 --- a/elements/jaq_answer_elements.py +++ b/elements/jaq_answer_elements.py @@ -4,16 +4,18 @@ class JAQAnswerElements: # 寮�濮嬫祴璇曟寜閽� start_btn = (By.XPATH, "//button/span[text()='寮�濮嬫祴璇�']/..") + # 棰樼洰 + q_title = (By.XPATH, "//h3[@class='langKaiStyle']") # 棰樼洰閫夐」-a - options_a = (By.XPATH, "//div[@class='el-card__body']/div[1]//span[@class='q-item-span-content']") + options_a = (By.XPATH, "//div[@class='el-card__body']/div[1]//label[@class='el-radio']") # 棰樼洰閫夐」-b - options_b = (By.XPATH, "//div[@class='el-card__body']/div[2]//span[@class='q-item-span-content']") + options_b = (By.XPATH, "//div[@class='el-card__body']/div[2]//label[@class='el-radio']") # 绂佺敤鐨勯�夐」 disabled = (By.XPATH, "//label[@aria-disabled='true']") # 缁х画娴嬭瘯鎸夐挳 continue_testing_btn = (By.XPATH, "//button/span[text()='缁х画娴嬭瘯']") # 鎻愪氦鎸夐挳 - submit_btn = (By.XPATH, "//button/span[contains(text(),'鎻愪氦')]/..") + submit_btn = (By.XPATH, "//button[2]") # 涓婁紶鎴愬姛鏍囬 upload_success_title = (By.XPATH, "//main/h2[contains(text(), '鏁版嵁宸茬粡鎴愬姛鍦颁笂浼犺嚦鏈嶅姟鍣�')]") @@ -23,3 +25,6 @@ # 鏍囬鏂囧瓧 title = (By.XPATH, "//h1[text()='JAQ']") + # 鍏抽棴鎸夐挳 + close_btn = (By.XPATH, "//button[1]") + diff --git a/elements/vaq_answer_elements.py b/elements/vaq_answer_elements.py index 5452c30..89749ad 100644 --- a/elements/vaq_answer_elements.py +++ b/elements/vaq_answer_elements.py @@ -5,11 +5,18 @@ # 寮�濮嬫祴璇曟寜閽� start_btn = (By.XPATH, "//button") + # 鍥剧墖鎸夐挳閫夐」 + pre_picture_btn = (By.XPATH, "//div[@class='mullinediv-item']/div[3]/div[1]") + + picture_btn = (By.XPATH, "//div[@class='mullinediv-item']/div[2]/div[1]/img") + + current_require_picture_count = (By.XPATH, "//div[@class='el-divider__text is-left']/span") + # 棰勯�夊浘鐗囨楠�-鍥剧墖閫夐」 picture = (By.XPATH, "//div[@class='mullinediv']/div[@class='mullinediv-item']") # 涓嬩竴姝ユ寜閽� - next_btn = (By.XPATH, "//button/span[contains(text(),'涓嬩竴姝�')]/..") + next_btn = (By.XPATH, "//button[2]") # 棰樼洰閫夐」 options = (By.XPATH, "//span[@class='q-item-span-content']") @@ -18,7 +25,7 @@ # 缁х画娴嬭瘯鎸夐挳 continue_testing_btn = (By.XPATH, "//button/span[text()='缁х画娴嬭瘯']") # 鎻愪氦鎸夐挳 - submit_btn = (By.XPATH, "//button/span[contains(text(),'鎻愪氦')]/..") + submit_btn = (By.XPATH, "//button") # 涓婁紶鎴愬姛鏍囬 upload_success_title = (By.XPATH, "//main/h2[contains(text(), '娴嬭瘯缁撴潫')]") @@ -27,3 +34,8 @@ # 鏍囬鏂囧瓧 title = (By.XPATH, "//div[@class='align-center']/span[2]") + + # 婊氬姩鍒伴《閮ㄦ寜閽� + scroll_top_btn = (By.XPATH, "//div[@class='back-to-ceiling' and @style='']") + + close_btn = (By.XPATH, "//button") diff --git a/po/caq_answer_page.py b/po/caq_answer_page.py index 2816cf5..7504f42 100644 --- a/po/caq_answer_page.py +++ b/po/caq_answer_page.py @@ -5,6 +5,7 @@ from selenium.common.exceptions import * import time +import re class CAQAnswerPage(BasePage): @@ -13,57 +14,62 @@ """ loading_count = 0 - es = CAQAnswerElements + elements = CAQAnswerElements def answer(self): - # 鐐瑰嚮寮�濮嬫寜閽� - self.click(self.es.start_btn, timeout=10) # 鏆傚仠3绉� time.sleep(3) - i = 0 - while i < 27: - if i == 0: - self.click(self.es.continue_testing_btn, timeout=10) - elif i < 4: - # 鑾峰彇鍒版墍鏈夐�夐」 - options_1 = self.elements_is_visibility(self.es.options_1) + # 鐐瑰嚮缁х画娴嬭瘯 + self.click(self.elements.continue_testing_btn, 5) + + time.sleep(3) + # 鑾峰彇鍒伴鐩爣棰� + title = self.get_ele(self.elements.q_title, 5) + # 鎴彇宸茬瓟鏁伴噺涓庢�绘暟閲� + match = re.search(r"(\d+)/(\d+)", title.text) + current = int(match.group(1)) + total = int(match.group(2)) + while current <= total: + # 鑾峰彇鎵�鏈夐鐩� + questions = self.get_eles(self.elements.questions, 5) + for question in questions: + options = self.get_elements_in(question, self.elements.options) number = random.randint(0, 4) - self.click_element_js(options_1[number]) + options[number].click() - options_2 = self.elements_is_visibility(self.es.options_2) - self.click_element_js(options_2[number]) + if current == 1: + self.click(self.elements.btn) + else: + self.click(self.elements.next_btn) + current += 1 + if current <= total: + time.sleep(1) + # 灏嗛〉闈㈡粦鍔ㄥ埌鏈�椤堕儴 + self.click(self.elements.scroll_top_btn, 5) + time.sleep(2) + time.sleep(2) - options_3 = self.elements_is_visibility(self.es.options_3) - self.click_element_js(options_3[number]) + # 鐐瑰嚮缁х画娴嬭瘯 + self.click(self.elements.continue_testing_btn, 5) - options_4 = self.elements_is_visibility(self.es.options_4) - self.click_element_js(options_4[number]) + title = self.get_ele(self.elements.q_title_2, 5) + # 鎴彇宸茬瓟鏁伴噺涓庢�绘暟閲� + match = re.search(r"(\d+)/(\d+)", title.text) + current = int(match.group(1)) + total = int(match.group(2)) - options_5 = self.elements_is_visibility(self.es.options_5) - self.click_element_js(options_5[number]) - - self.click_js(self.es.next_btn) - if i == 4: - self.click(self.es.continue_testing_btn, timeout=10) - - # # 鏍囬涓嶅瓨鍦ㄧ洿鎺ヨ繑鍥濬alse - # if not self.title_is_display(): - # return False - - if 4 < i < 26: - options_6 = self.elements_is_visibility(self.es.options_6) - number = random.randint(0, 4) - self.click_element_js(options_6[number]) - if i == 23: - self.click_js(self.es.submit_btn) - # 鏁版嵁鏄惁涓婁紶瀹屾垚 - time.sleep(15) - if self.upload_is_success(): - return True - else: - - self.click_js(self.es.next_btn) - i += 1 + while current <= total: + # 鑾峰彇鍒版墍鏈夐�夐」 + options = self.get_eles(self.elements.options_2, 5) + number = random.randint(0, 4) + options[number].click() + if current == 1: + self.click(self.elements.btn) + else: + if current == total: + time.sleep(1) + self.click(self.elements.next_btn) + current += 1 def upload_is_success(self): """ @@ -73,7 +79,7 @@ i = 0 while i < 60: try: - self.get_element_wait(self.es.upload_success_title) + self.get_element_wait(self.elements.upload_success_title) return True except TimeoutException: i += 1 diff --git a/po/ciaq_answer_page.py b/po/ciaq_answer_page.py index e16ebc2..4412727 100644 --- a/po/ciaq_answer_page.py +++ b/po/ciaq_answer_page.py @@ -5,6 +5,7 @@ from selenium.common.exceptions import * import time +import re class CIAQAnswerPage(BasePage): @@ -13,40 +14,34 @@ """ loading_count = 0 - es = CIAQAnswerElements + elements = CIAQAnswerElements + + slice_count = 3 def answer(self): - # 鏆傚仠3绉� - time.sleep(3) - while True: - # 缁х画娴嬭瘯鎸夐挳鍑虹幇鍒欑偣鍑� - if self.continue_btn_is_display(): - self.click(self.es.continue_testing_btn) + for i in range(self.slice_count): + # 鑾峰彇鍒伴鐩� + time.sleep(3) + title = self.get_ele(self.elements.q_title, 5) + # 鎴彇宸茬瓟鏁伴噺涓庢�绘暟閲� + match = re.search(r"(\d+)/(\d+)", title.text) + current = int(match.group(1)) + total = int(match.group(2)) - # 鏍囬涓嶅瓨鍦ㄧ洿鎺ヨ繑鍥濬alse - if not self.title_is_display(): - if self.continue_btn_is_display(): - self.click(self.es.continue_testing_btn) - continue - return False - - try: + while current <= total: + print(f"\n鐜板湪鏄疌IAQ鍒嗙墖{i+1}绗瑊current}棰�") # 鑾峰彇鍒版墍鏈夐�夐」 - options = self.get_eles(self.es.options) - number = random.randint(0, len(options)-1) + options = self.get_eles(self.elements.options, 5) + number = random.randint(0, len(options) - 1) if options[number].is_enabled(): options[number].click() - except: - pass - - # 鎻愪氦鎸夐挳瀛樺湪鍒欑偣鍑� - if self.submit_btn_is_display(): - self.click(self.es.submit_btn) - # 鏁版嵁鏄惁涓婁紶瀹屾垚 - time.sleep(15) - if self.upload_is_success(): - return True - return False + current += 1 + if (i + 1) != self.slice_count: + time.sleep(2) + # 鐐瑰嚮缁х画娴嬭瘯 + self.click(self.elements.continue_testing_btn, 10) + time.sleep(2) + self.click(self.elements.submit_btn, 10) def upload_is_success(self): """ diff --git a/po/jaq_answer_page.py b/po/jaq_answer_page.py index 930a3b9..0d48549 100644 --- a/po/jaq_answer_page.py +++ b/po/jaq_answer_page.py @@ -1,10 +1,11 @@ import random from base.base_page import BasePage -from elements.jaq_answer_elements import JAQAnswerElements as Answer +from elements.jaq_answer_elements import JAQAnswerElements from selenium.common.exceptions import * import time +import re class JAQAnswerPage(BasePage): @@ -13,38 +14,33 @@ """ loading_count = 0 + elements = JAQAnswerElements + def answer(self): # 鏆傚仠3绉� time.sleep(3) - while True: - # 鏍囬涓嶅瓨鍦ㄧ洿鎺ヨ繑鍥濬alse - if not self.title_is_display(): - return False - - try: - # 鑾峰彇鍒版墍鏈塧閫夐」 - options_a = self.get_eles(Answer.options_a) - if len(options_a) < 5: - continue - number_a = random.randint(0, 4) + # 鑾峰彇鍒伴鐩� + title = self.get_ele(self.elements.q_title, 5) + # 鎴彇宸茬瓟鏁伴噺涓庢�绘暟閲� + match = re.search(r"(\d+)棰�/鎬�(\d+)", title.text) + current = int(match.group(1)) + total = int(match.group(2)) + while current <= total: + print(f"鐜板湪鏄疛AQ绗瑊current}棰�") + # 鑾峰彇鍒版墍鏈夐�夐」 + options_a = self.get_eles(self.elements.options_a, 5) + options_b = self.get_eles(self.elements.options_b, 5) + number_a = random.randint(0, 4) + number_b = random.randint(0, 3) + if options_a[number_a].is_enabled() and options_b[number_b].is_enabled(): options_a[number_a].click() - - # 鑾峰彇鍒版墍鏈塨閫夐」 - options_b = self.get_eles(Answer.options_b) - if len(options_b) < 4: - continue - number_b = random.randint(0, 3) options_b[number_b].click() - except: - pass + current += 1 + continue - # 鎻愪氦鎸夐挳瀛樺湪鍒欑偣鍑� - if self.submit_btn_is_display(): - self.click_js(Answer.submit_btn) - # 鏁版嵁鏄惁涓婁紶瀹屾垚 - if self.upload_is_success(): - return True - return False + time.sleep(3) + # 鐐瑰嚮鎻愪氦鎸夐挳 + self.click(self.elements.submit_btn, 10) def upload_is_success(self): """ @@ -54,7 +50,7 @@ i = 0 while i < 60: try: - self.get_ele(Answer.upload_success_title, timeout=10) + self.get_ele(self.elements.upload_success_title, timeout=10) return True except TimeoutException: i += 1 @@ -67,7 +63,7 @@ :return: """ try: - button = self.get_ele(Answer.submit_btn) + button = self.get_ele(self.elements.submit_btn) if button.is_enabled(): return True else: @@ -82,7 +78,7 @@ """ try: # 鐐瑰嚮缁х画娴嬭瘯鎸夐挳 - button = self.get_ele(Answer.continue_testing_btn) + button = self.get_ele(self.elements.continue_testing_btn) if button.is_enabled(): return True else: @@ -97,7 +93,7 @@ """ try: # 鑾峰彇鏍囬 - self.get_element_wait(Answer.title) + self.get_element_wait(self.elements.title) return True except TimeoutException: return False @@ -110,7 +106,7 @@ i = 0 while i < 10: try: - self.get_ele(Answer.loading_text) + self.get_ele(self.elements.loading_text) i += 1 time.sleep(1) except: @@ -123,4 +119,4 @@ 寮�濮嬫祴璇曟寜閽� :return: """ - self.click_wait(Answer.start_btn) + self.click_wait(self.elements.start_btn) diff --git a/po/maq_answer_page.py b/po/maq_answer_page.py index b084750..d5993bb 100644 --- a/po/maq_answer_page.py +++ b/po/maq_answer_page.py @@ -14,14 +14,14 @@ loading_count = 0 - se = MAQAnswerElements + elements = MAQAnswerElements tip_timing = 35 def exercise_answer(self): # 鑾峰彇鍒伴鐩� time.sleep(3) - title = self.get_ele(self.se.q_title, 5) + title = self.get_ele(self.elements.q_title, 5) # 鎴彇宸茬瓟鏁伴噺涓庢�绘暟閲� match = re.search(r"(\d+)/(\d+)", title.text) current = int(match.group(1)) @@ -29,7 +29,7 @@ while current <= total: # 鑾峰彇鍒版墍鏈夐�夐」 - options = self.get_eles(self.se.options, 5) + options = self.get_eles(self.elements.options, 5) number = random.randint(0, 5) if options[number].is_enabled(): options[number].click() @@ -37,26 +37,26 @@ continue time.sleep(3) # 鐐瑰嚮鎻愪氦鎸夐挳 - self.click(self.se.exercise_submit_btn, 10) + self.click(self.elements.exercise_submit_btn, 10) def answer(self): # 鑾峰彇鍒伴鐩� time.sleep(3) - title = self.get_ele(self.se.q_title, 5) + title = self.get_ele(self.elements.q_title, 5) # 鎴彇宸茬瓟鏁伴噺涓庢�绘暟閲� match = re.search(r"(\d+)/(\d+)", title.text) current = int(match.group(1)) total = int(match.group(2)) while current <= total: - print(f"\n鐜板湪鏄{current}棰�") + print(f"\n鐜板湪鏄疢AQ绗瑊current}棰�") # 瑙﹀彂浜嬩腑 if current == self.tip_timing: time.sleep(5) - self.click(self.se.continue_testing_btn, 10) + self.click(self.elements.continue_testing_btn, 10) # 鑾峰彇鍒版墍鏈夐�夐」 - options = self.get_eles(self.se.options, 5) + options = self.get_eles(self.elements.options, 5) number = random.randint(0, 5) if options[number].is_enabled(): options[number].click() @@ -65,7 +65,7 @@ time.sleep(3) # 鐐瑰嚮鎻愪氦鎸夐挳 - self.click(self.se.submit_btn, 10) + self.click(self.elements.submit_btn, 10) # while True: # # 鑾峰彇鍒版墍鏈夐�夐」 # options = self.get_eles(self.se.options) @@ -116,11 +116,11 @@ # 鍒ゆ柇hint鏄惁鏈夊唴瀹� if hint: # 鑾峰彇鎻愮ず璇唴瀹� - hint_text = self.get_ele(self.se.hint_text).text + hint_text = self.get_ele(self.elements.hint_text).text # 鍒ゆ柇鎻愮ず璇唴瀹规槸鍚﹀寘鍚紶鍏ョ殑hint if hint in hint_text: flag = True - self.click(self.se.continue_testing_btn) + self.click(self.elements.continue_testing_btn) # 鏍囬涓嶅瓨鍦ㄧ洿鎺ヨ繑鍥濬alse if not self.title_is_display(): @@ -128,7 +128,7 @@ try: # 鑾峰彇鍒版墍鏈夐�夐」 - options = self.get_eles(self.se.options) + options = self.get_eles(self.elements.options) if len(options) < 6: continue number = random.randint(0, 5) @@ -150,7 +150,7 @@ # 鎻愪氦鎸夐挳瀛樺湪鍒欑偣鍑� if self.submit_btn_is_display(): - self.click(self.se.submit_btn) + self.click(self.elements.submit_btn) # 鏁版嵁鏄惁涓婁紶瀹屾垚 time.sleep(15) if self.upload_is_success(): @@ -159,7 +159,7 @@ return True # 鏄惁缃戠粶寮傚父 try: - self.get_ele(self.se.network_exception_title) + self.get_ele(self.elements.network_exception_title) return "缃戠粶寮傚父" except NoSuchElementException: pass @@ -173,7 +173,7 @@ i = 0 while i < 60: try: - self.get_ele(self.se.upload_success_title, timeout=5) + self.get_ele(self.elements.upload_success_title, timeout=5) return True except TimeoutException: i += 1 @@ -186,7 +186,7 @@ :return: """ try: - button = self.get_ele(self.se.submit_btn) + button = self.get_ele(self.elements.submit_btn) if button.is_enabled(): return True else: @@ -201,7 +201,7 @@ """ try: # 鐐瑰嚮缁х画娴嬭瘯鎸夐挳 - button = self.get_ele(self.se.continue_testing_btn) + button = self.get_ele(self.elements.continue_testing_btn) if button.is_enabled(): return True else: @@ -216,7 +216,7 @@ """ try: # 鑾峰彇鏍囬 - self.get_ele(self.se.title, timeout=10) + self.get_ele(self.elements.title, timeout=10) return True except TimeoutException: return False diff --git a/po/vaq_answer_page.py b/po/vaq_answer_page.py index 57d6aca..9d5314e 100644 --- a/po/vaq_answer_page.py +++ b/po/vaq_answer_page.py @@ -1,10 +1,11 @@ import random from base.base_page import BasePage -from elements.vaq_answer_elements import VAQAnswerElements as Answer +from elements.vaq_answer_elements import VAQAnswerElements from selenium.common.exceptions import * from selenium.webdriver.common.by import By import time +import re class VAQAnswerPage(BasePage): @@ -13,49 +14,46 @@ """ loading_count = 0 + elements = VAQAnswerElements + + slice_count = 9 + def answer(self): - # 鏆傚仠3绉� - # 棰勯�夊浘鐗� - # 鑾峰彇鍒版墍鏈夊浘鐗囬�夐」 - pre_pictures = self.get_elements_wait(Answer.picture) - for picture in pre_pictures: - # 闅忔満1鍒�3 - number = random.randint(1, 3) - # 鎷兼帴瑕佺偣鍑荤殑鎸夐挳鐨勫畾浣� - btn_loc = (By.XPATH, "div[3]/div[" + str(number) + "]") - # 鐐瑰嚮鎸夐挳 - self.get_element_in(picture, btn_loc).click() - time.sleep(0.1) - # 鐐瑰嚮涓嬩竴姝ユ寜閽� - self.click(Answer.next_btn) - time.sleep(1) - + time.sleep(3) # 鐐瑰嚮寮�濮嬫祴璇� - self.click(Answer.start_btn) + self.click(self.elements.start_btn) + time.sleep(2) + # 鐐瑰嚮缁х画娴嬭瘯 + self.click(self.elements.start_btn) - # 缁嗚嚧鍒嗙被鍥剧墖 - # 姣忎釜姝ラ閫夋嫨鍥剧墖鐨勬暟閲� - step_picture = [2, 2, 4, 4, 7, 7, 10, 10, 0] - i = 0 - for num in step_picture: - for k in range(0, num): - # 鑾峰彇鍒板浘鐗� - picture = self.get_elements_wait(Answer.picture)[0] - # 鎷兼帴瑕佺偣鍑荤殑鎸夐挳鐨勫畾浣� - btn_loc = (By.XPATH, "div[2]/div[1]/img") - # 鐐瑰嚮鎸夐挳 - btn = self.get_element_in(picture, btn_loc) - self.click_element_js(btn) - i += 1 - # 鐐瑰嚮涓嬩竴姝ユ寜閽� - self.click(Answer.next_btn) - # 鐐瑰嚮鎻愪氦鎸夐挳 - self.click_wait(Answer.submit_btn) - # 鏁版嵁鏄惁涓婁紶瀹屾垚 - time.sleep(10) - if self.upload_is_success(): - return True - return False + pre_pictures = self.get_eles(self.elements.pre_picture_btn, 10) + + for pre_picture in pre_pictures: + pre_picture.click() + time.sleep(0.2) + + # 鐐瑰嚮涓嬩竴姝� + self.click(self.elements.start_btn) + + time.sleep(1) + for i in range(0, self.slice_count): + # 鑾峰彇褰撳墠鎵�闇�鍥剧墖鏁伴噺鐨勬枃瀛� + picture_count_text = self.get_ele(self.elements.current_require_picture_count) + pictures = self.get_eles(self.elements.picture_btn, 10) + match = re.search(r"(\d+) / (\d+)", picture_count_text.text) + total = int(match.group(2)) + if (i + 1) != self.slice_count: + for k in range(0, total): + self.driver.execute_script("arguments[0].click();", pictures[k]) + time.sleep(0.2) + if i == 0: + self.click(self.elements.start_btn) + else: + self.click(self.elements.next_btn) + time.sleep(1) + time.sleep(2) + # 鎻愪氦 + self.click(self.elements.submit_btn) def upload_is_success(self): """ diff --git a/report/report.html b/report/report.html index b20b07d..d2d2dcd 100644 --- a/report/report.html +++ b/report/report.html @@ -253,9 +253,9 @@ } </script> <h1>report.html</h1> - <p>Report generated on 23-Jul-2024 at 17:12:01 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.2.0</p> + <p>Report generated on 24-Jul-2024 at 17:42:22 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.2.0</p> <h2>Summary</h2> - <p>1 tests ran in 22.66 seconds. </p> + <p>1 tests ran in 60.40 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">1 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"> @@ -270,8 +270,8 @@ <tbody class="passed results-table-row"> <tr> <td class="col-result">Passed</td> - <td class="col-name">testcase/test_main.py::TestMAQ::test_maq[MAQ]</td> - <td class="col-duration">22.63</td> + <td class="col-name">testcase/test_main.py::TestMain::test_vaq[VAQ]</td> + <td class="col-duration">60.35</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> diff --git a/testcase/conftest.py b/testcase/conftest.py index 8ba0f3b..af175ca 100644 --- a/testcase/conftest.py +++ b/testcase/conftest.py @@ -15,10 +15,10 @@ def driver(request): options = Options() # options.debugger_address = "127.0.0.1:9222" - options.add_argument('--headless') - options.add_argument('--no-sandbox') - options.add_argument('--disable-gpu') - options.add_argument('--disable-dev-shm-usage') + # options.add_argument('--headless') + # options.add_argument('--no-sandbox') + # options.add_argument('--disable-gpu') + # options.add_argument('--disable-dev-shm-usage') # options.add_argument('window-size=1200x600') # 鍒濆鍖杦ebdriver driver = webdriver.Chrome(options=options) diff --git a/testcase/test_main.py b/testcase/test_main.py index 78d003c..3abcc34 100644 --- a/testcase/test_main.py +++ b/testcase/test_main.py @@ -3,22 +3,26 @@ import pytest from po.share_add_page import ShareAddPage from po.maq_answer_page import MAQAnswerPage +from po.jaq_answer_page import JAQAnswerPage +from po.caq_answer_page import CAQAnswerPage +from po.ciaq_answer_page import CIAQAnswerPage +from po.vaq_answer_page import VAQAnswerPage from comm.my_random import * -class TestMAQ: +class TestMain: driver = None test_package_name = "MAQ鑷姩娴嬭瘯鍖�-20230720170011" @pytest.mark.parametrize('data_read', ["MAQ"], indirect=True) def test_maq(self, data_read: dict, driver): """ - 鎵撳紑鍒嗕韩閾炬帴 + 娴嬭瘯MAQ :return: """ print(f"\n寮�濮嬭繘琛孧AQ娴嬭瘯......") # 鑾峰彇driver - TestMAQ.driver = driver + self.driver = driver driver.get(data_read['share_url']) # # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄 # test_package_list = TestPackageListPage(driver) @@ -54,18 +58,223 @@ # 鍒涘缓answer瀵硅薄 answer_page = MAQAnswerPage(driver) # 鐐瑰嚮寮�濮嬫祴璇� - answer_page.click(answer_page.se.start_btn, 10) + answer_page.click(answer_page.elements.start_btn, 10) # 璺宠繃缁冧範鐜妭 answer_page.exercise_answer() - print("\n寮�濮嬬瓟棰�") + print("\nMAQ寮�濮嬬瓟棰�") # 寮�濮嬬瓟棰� answer_page.answer() - # 鏈�鍚庢娴嬪叧闂寜閽槸鍚﹀瓨鍦� - answer_page.get_ele(answer_page.se.close_btn, 30) + time.sleep(3) + # 鏈�鍚庢娴嬪叧闂寜閽槸鍚﹀瓨鍦� + answer_page.get_ele(answer_page.elements.close_btn, 30) + + @pytest.mark.parametrize('data_read', ["JAQ"], indirect=True) + def test_jaq(self, data_read: dict, driver): + """ + 娴嬭瘯JAQ + :return: + """ + print(f"\n寮�濮嬭繘琛孞AQ娴嬭瘯......") + # 鑾峰彇driver + self.driver = driver + driver.get(data_read['share_url']) + # # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄 + # test_package_list = TestPackageListPage(driver) + # url = test_package_list.oper_elem("share_url_text") + # # 鍒囨崲鍒颁笂涓�灞俰frame + # test_package_list.switch_parent_iframe() + # # 鐐瑰嚮鍏抽棴鎸夐挳 + # test_package_list.oper_elem("share_cancel_btn") + # time.sleep(1) + # # 鎵撳紑鏂版爣绛鹃〉鍔犺浇url + # test_package_list.open_new_table_to_url(url) + # # 鍒涘缓鍒嗕韩椤甸潰瀵硅薄 + share_add = ShareAddPage(driver) + # 濉啓淇℃伅鎻愪氦骞惰幏鍙栨祴璇曢摼鎺� + name = random_string(8) + email = name + "@gmail.com" + test_url = share_add.get_test_url(name, email) + # 鎵撳紑閾炬帴 + driver.get(test_url) + # 鐐瑰嚮鎻愪氦鎸夐挳 + share_add.click(share_add.es.submit_btn, 10) + # 鑾峰彇鏁版嵁 + info = data_read["info"] + # # 濉啓鍩烘湰淇℃伅骞舵彁浜� + share_add.fill_info(email, info["position"], info["dept"]) + # share_add.oper_elem("fill_email_input", email) + # share_add.oper_elem("fill_position_input", info["position"]) + # share_add.oper_elem("fill_dept_input", info["dept"]) + # share_add.oper_elem("submit_btn") + + time.sleep(5) + + # 鍒涘缓answer瀵硅薄 + answer_page = JAQAnswerPage(driver) + # 鐐瑰嚮寮�濮嬫祴璇� + answer_page.click(answer_page.elements.start_btn, 10) + + print("\nJAQ寮�濮嬬瓟棰�") + # 寮�濮嬬瓟棰� + answer_page.answer() + + time.sleep(3) + + # 鏈�鍚庢娴嬪叧闂寜閽槸鍚﹀瓨鍦� + answer_page.get_ele(answer_page.elements.close_btn, 30) + + @pytest.mark.parametrize('data_read', ["CAQ"], indirect=True) + def test_caq(self, data_read: dict, driver): + """ + 娴嬭瘯CAQ + :return: + """ + print(f"\n寮�濮嬭繘琛孋AQ娴嬭瘯......") + # 鑾峰彇driver + self.driver = driver + driver.get(data_read['share_url']) + # # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄 + # test_package_list = TestPackageListPage(driver) + # url = test_package_list.oper_elem("share_url_text") + # # 鍒囨崲鍒颁笂涓�灞俰frame + # test_package_list.switch_parent_iframe() + # # 鐐瑰嚮鍏抽棴鎸夐挳 + # test_package_list.oper_elem("share_cancel_btn") + # time.sleep(1) + # # 鎵撳紑鏂版爣绛鹃〉鍔犺浇url + # test_package_list.open_new_table_to_url(url) + # # 鍒涘缓鍒嗕韩椤甸潰瀵硅薄 + share_add = ShareAddPage(driver) + # 濉啓淇℃伅鎻愪氦骞惰幏鍙栨祴璇曢摼鎺� + name = random_string(8) + email = name + "@gmail.com" + test_url = share_add.get_test_url(name, email) + # 鎵撳紑閾炬帴 + driver.get(test_url) + # 鐐瑰嚮鎻愪氦鎸夐挳 + share_add.click(share_add.es.submit_btn, 10) + # 鑾峰彇鏁版嵁 + info = data_read["info"] + # # 濉啓鍩烘湰淇℃伅骞舵彁浜� + share_add.fill_info(email, info["position"], info["dept"]) + # share_add.oper_elem("fill_email_input", email) + # share_add.oper_elem("fill_position_input", info["position"]) + # share_add.oper_elem("fill_dept_input", info["dept"]) + # share_add.oper_elem("submit_btn") + + time.sleep(5) + + # 鍒涘缓answer瀵硅薄 + answer_page = CAQAnswerPage(driver) + # 鐐瑰嚮寮�濮嬫祴璇� + answer_page.click(answer_page.elements.start_btn, 10) + + print("\nCAQ寮�濮嬬瓟棰�") + # 寮�濮嬬瓟棰� + answer_page.answer() + + time.sleep(3) + + # 鏈�鍚庢娴嬪叧闂寜閽槸鍚﹀瓨鍦� + answer_page.get_ele(answer_page.elements.close_btn, 30) + + @pytest.mark.parametrize('data_read', ["CIAQ"], indirect=True) + def test_ciaq(self, data_read: dict, driver): + """ + 娴嬭瘯CIAQ + :return: + """ + print(f"\n寮�濮嬭繘琛孋IAQ娴嬭瘯......") + # 鑾峰彇driver + self.driver = driver + driver.get(data_read['share_url']) + # # 鍒涘缓娴嬭瘯鍖呭垪琛ㄩ〉闈㈢殑瀵硅薄 + # test_package_list = TestPackageListPage(driver) + # url = test_package_list.oper_elem("share_url_text") + # # 鍒囨崲鍒颁笂涓�灞俰frame + # test_package_list.switch_parent_iframe() + # # 鐐瑰嚮鍏抽棴鎸夐挳 + # test_package_list.oper_elem("share_cancel_btn") + # time.sleep(1) + # # 鎵撳紑鏂版爣绛鹃〉鍔犺浇url + # test_package_list.open_new_table_to_url(url) + # # 鍒涘缓鍒嗕韩椤甸潰瀵硅薄 + share_add = ShareAddPage(driver) + # 濉啓淇℃伅鎻愪氦骞惰幏鍙栨祴璇曢摼鎺� + name = random_string(8) + email = name + "@gmail.com" + test_url = share_add.get_test_url(name, email) + # 鎵撳紑閾炬帴 + driver.get(test_url) + # 鑾峰彇鏁版嵁 + info = data_read["info"] + # # 濉啓鍩烘湰淇℃伅骞舵彁浜� + share_add.fill_info(email, "", "") + # share_add.oper_elem("fill_email_input", email) + # share_add.oper_elem("fill_position_input", info["position"]) + # share_add.oper_elem("fill_dept_input", info["dept"]) + # share_add.oper_elem("submit_btn") + + time.sleep(5) + + # 鍒涘缓answer瀵硅薄 + answer_page = CIAQAnswerPage(driver) + # 鐐瑰嚮寮�濮嬫祴璇� + answer_page.click(answer_page.elements.start_btn, 10) + + print("\nCIAQ寮�濮嬬瓟棰�") + # 寮�濮嬬瓟棰� + answer_page.answer() + + time.sleep(3) + + # 鏈�鍚庢娴嬪叧闂寜閽槸鍚﹀瓨鍦� + answer_page.get_ele(answer_page.elements.close_btn, 30) + + @pytest.mark.parametrize('data_read', ["VAQ"], indirect=True) + def test_vaq(self, data_read: dict, driver): + """ + 娴嬭瘯VAQ + :return: + """ + print(f"\n寮�濮嬭繘琛孷AQ娴嬭瘯......") + # 鑾峰彇driver + self.driver = driver + driver.get(data_read['share_url']) + # 鍒涘缓鍒嗕韩椤甸潰瀵硅薄 + share_add = ShareAddPage(driver) + # 濉啓淇℃伅鎻愪氦骞惰幏鍙栨祴璇曢摼鎺� + name = random_string(8) + email = name + "@gmail.com" + test_url = share_add.get_test_url(name, email) + # 鎵撳紑閾炬帴 + driver.get(test_url) + # 鐐瑰嚮鎻愪氦鎸夐挳 + share_add.click(share_add.es.submit_btn, 10) + # 鑾峰彇鏁版嵁 + info = data_read["info"] + # # 濉啓鍩烘湰淇℃伅骞舵彁浜� + share_add.fill_info(email, "", "") + + time.sleep(5) + + # 鍒涘缓answer瀵硅薄 + answer_page = VAQAnswerPage(driver) + # 鐐瑰嚮寮�濮嬫祴璇� + answer_page.click(answer_page.elements.start_btn, 10) + + print("\nVAQ寮�濮嬬瓟棰�") + # 寮�濮嬬瓟棰� + answer_page.answer() + + time.sleep(3) + + # 鏈�鍚庢娴嬪叧闂寜閽槸鍚﹀瓨鍦� + answer_page.get_ele(answer_page.elements.close_btn, 30) # def test_answer(self): # # 鑾峰彇driver # driver = TestMAQ.driver -- Gitblit v1.9.1