base/base_page.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
data/test_data.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
elements/caq_answer_elements.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
po/caq_answer_page.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
report/report.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
testcase/test_caq.py | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
base/base_page.py
@@ -37,13 +37,21 @@ return self.driver.find_element(*locator) # 使用js语句点击 def script_click(self, *locator): def click_js(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_element_js(self, element): """ 使用js点击元素 :param element: 要点击的元素 :return: """ self.driver.execute_script("arguments[0].click();", element) # 点击 def click(self, locator): @@ -153,3 +161,13 @@ 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)) data/test_data.json
@@ -45,5 +45,23 @@ "position":"职员", "dept": "人事部" } }, "CAQ": { "menu": "测试包管理/测试包列表", "add": { "company": "TAI测试", "type": "智力测验包", "product": "CAQ", "hrEmail": "2077506045@qq.com", "invalid": "2024-01-01 00:00:00", "memberLang": "中文", "hrReportLang": "中文", "reportTemplate": "CAQ-CAQ-Chinese", "memberReportLang": "中文" }, "info": { "position":"职员", "dept": "人事部" } } } elements/caq_answer_elements.py
New file @@ -0,0 +1,36 @@ from selenium.webdriver.common.by import By 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']/../..") # 禁用的选项 disabled = (By.XPATH, "//label[@aria-disabled='true']") # 继续测试按钮 continue_testing_btn = (By.XPATH, "//button/span[text()='继续测试']/..") # 下一题按钮 next_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, "//div[@class='align-center']/span[2]") po/caq_answer_page.py
New file @@ -0,0 +1,141 @@ import random from base.base_page import BasePage from elements.caq_answer_elements import CAQAnswerElements as Answer from selenium.common.exceptions import * import time class CAQAnswerPage(BasePage): """ 答题页面 """ loading_count = 0 def answer_MAQ(self): # 暂停3秒 time.sleep(3) i = 0 while i < 27: if i == 0: self.click_wait(Answer.continue_testing_btn) elif i < 4: # 获取到所有选项 options_1 = self.elements_is_visibility(Answer.options_1) number = random.randint(0, 4) self.click_element_js(options_1[number]) options_2 = self.elements_is_visibility(Answer.options_2) self.click_element_js(options_2[number]) options_3 = self.elements_is_visibility(Answer.options_3) self.click_element_js(options_3[number]) options_4 = self.elements_is_visibility(Answer.options_4) self.click_element_js(options_4[number]) options_5 = self.elements_is_visibility(Answer.options_5) self.click_element_js(options_5[number]) self.click_js(Answer.next_btn) if i == 4: self.click_wait(Answer.continue_testing_btn) # # 标题不存在直接返回False # if not self.title_is_display(): # return False if 4 < i < 26: options_6 = self.elements_is_visibility(Answer.options_6) number = random.randint(0, 4) self.click_element_js(options_6[number]) if i == 23: self.click_js(Answer.submit_btn) # 数据是否上传完成 time.sleep(15) if self.upload_is_success(): return True else: self.click_js(Answer.next_btn) i += 1 def upload_is_success(self): """ 判断数据是否上传完成 :return: """ i = 0 while i < 60: try: self.get_element_wait(Answer.upload_success_title) return True except TimeoutException: i += 1 time.sleep(1) 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) report/report.html
@@ -253,10 +253,10 @@ } </script> <h1>report.html</h1> <p>Report generated on 17-Jul-2023 at 16:56:23 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.2.0</p> <p>Report generated on 18-Jul-2023 at 10:42:26 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.2.0</p> <h2>Summary</h2> <p>10 tests ran in 385.15 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> <p>15 tests ran in 440.22 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">15 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"> @@ -270,8 +270,53 @@ <tbody class="passed results-table-row"> <tr> <td class="col-result">Passed</td> <td class="col-name">testcase/test_caq.py::TestCAQ::test_login[login]</td> <td class="col-duration">5.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_caq.py::TestCAQ::test_create_package[CAQ]</td> <td class="col-duration">14.57</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_caq.py::TestCAQ::test_open_url[CAQ]</td> <td class="col-duration">12.74</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_caq.py::TestCAQ::test_answer</td> <td class="col-duration">20.70</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_caq.py::TestCAQ::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_jaq.py::TestJAQ::test_login[login]</td> <td class="col-duration">6.38</td> <td class="col-duration">5.34</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> @@ -280,7 +325,7 @@ <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.17</td> <td class="col-duration">14.65</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> @@ -289,7 +334,7 @@ <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">12.09</td> <td class="col-duration">13.02</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> @@ -298,7 +343,7 @@ <tr> <td class="col-result">Passed</td> <td class="col-name">testcase/test_jaq.py::TestJAQ::test_answer</td> <td class="col-duration">78.51</td> <td class="col-duration">78.60</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> @@ -307,7 +352,7 @@ <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.33</td> <td class="col-duration">7.35</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> @@ -316,7 +361,7 @@ <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.86</td> <td class="col-duration">5.41</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> @@ -325,7 +370,7 @@ <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.06</td> <td class="col-duration">14.58</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> @@ -334,7 +379,7 @@ <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">12.22</td> <td class="col-duration">12.80</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> @@ -343,7 +388,7 @@ <tr> <td class="col-result">Passed</td> <td class="col-name">testcase/test_maq.py::TestMAQ::test_answer</td> <td class="col-duration">227.95</td> <td class="col-duration">220.16</td> <td class="col-links"></td></tr> <tr> <td class="extra" colspan="4"> testcase/test_caq.py
New file @@ -0,0 +1,185 @@ from datetime import datetime import time from selenium.webdriver.common.by import By import pytest from selenium import webdriver from po.login_page import LoginPage from po.home_page import HomePage from po.test_package_list_page import TestPackageListPage from po.share_add_page import ShareAddPage from po.caq_answer_page import CAQAnswerPage from comm.my_random import * class TestCAQ: driver = None test_package_name = "CAQ自动测试包-20230718101350" @pytest.mark.parametrize('data_read', ["login"], indirect=True) def test_login(self, data_read: dict): """ 打开页面并进行登录测试 :param data_read: 执行数据读取的函数并获取到返回值 :return: """ TestCAQ.driver = webdriver.Chrome() driver = TestCAQ.driver login_page = LoginPage(driver) try: # 打开链接 driver.get(data_read["url"]) except: # 链接打开出现异常说明链接无法访问,捕获异常但不做处理 pass # 浏览器窗口最大化 driver.maximize_window() # 获取到刷新按钮并每10秒点击一次,知道刷新按钮消失 while True: try: # 判断打开的页面是否存在刷新按钮 reload_btn = login_page.get_element((By.XPATH, "//div[@id='buttons']/div/button[@id='reload-button']")) # 点击刷新按钮 reload_btn.click() time.sleep(10) except: # 出现异常表示不存在刷新按钮 # 接着判断是否存在nginx error! try: nginx_error = login_page.get_element((By.XPATH, "//strong[text() = 'nginx error!']")) # 存在则睡眠10秒 time.sleep(10) except: break login_page.login(data_read["username"], data_read["password"], data_read["code"]) time.sleep(2) assert login_page.is_login_success() @pytest.mark.parametrize('data_read', ["CAQ"], indirect=True) def test_create_package(self, data_read: dict): """ 创建测试包 :param data_read: 读取数据 :return: """ # 获取driver driver = TestCAQ.driver # 创建home页面的对象 home_page = HomePage(driver) # 点击左侧菜单进入页面 home_page.menu_select(data_read["menu"]) # 创建测试包列表页面的对象 test_package_list = TestPackageListPage(driver) # 点击创建按钮 test_package_list.create_btn() # 获取当前时间 current_time = datetime.now() # 转换为字符串 time_str = current_time.strftime("%Y%m%d%H%M%S") # 创建测试包填写的参数 # 测试包名称 test_package_name = "CAQ自动测试包-" + time_str # 设置测试包名称为类变量 TestCAQ.test_package_name = test_package_name # 获取创建测试包的数据 create_data = data_read["add"] # 填写测试包名称 test_package_list.testPackageName_input(test_package_name) # 填写报告企业名称 test_package_list.reportCompanyName_input(create_data["company"]) # 选择测试包类型 test_package_list.testPackageType_select(create_data["type"]) # 选择产品包 test_package_list.prodTree_select(create_data["product"]) # 输入hr邮箱 test_package_list.hrReportEmail_input(create_data["hrEmail"]) # 输入有效期 test_package_list.invalidTime_input(create_data["invalid"]) # 选择邀请邮件语言类型 test_package_list.testTemplateLangType_select(create_data["memberLang"]) # 选择HR邮件语言类型 test_package_list.hrTemplateLangType_select(create_data["hrReportLang"]) # 选择报告模板 test_package_list.reportTemplate_select(create_data["reportTemplate"]) # 点击测试者接收报告 test_package_list.autoSendReport_checkbox() # 选择测试者报告邮箱语言类型 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) @pytest.mark.parametrize('data_read', ["CAQ"], indirect=True) def test_open_url(self, data_read: dict): """ 打开分享链接 :return: """ # 获取driver driver = TestCAQ.driver # # 创建home页面的对象 # home_page = HomePage(driver) # # 点击左侧菜单进入页面 # home_page.menu_select(data_read["menu"]) # 创建测试包列表页面的对象 test_package_list = TestPackageListPage(driver) # 勾选新创建的测试包 test_package_list.click_package_checkbox(TestCAQ.test_package_name) # 点击生成分享链接按钮 test_package_list.click_share_1_btn() # 获取到url url = test_package_list.get_share_url() # 打开新标签页加载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.page_default_operation(name, email) # 当前页面打开链接 driver.get(test_url) # 点击提交按钮 share_add.submit_btn() # 获取数据 info = data_read["info"] # 填写基本信息并提交 share_add.fill_info(email, info["position"], info["dept"]) time.sleep(5) def test_answer(self): # 获取driver driver = TestCAQ.driver # 创建answer对象 answer_page = CAQAnswerPage(driver) # 点击开始测试 answer_page.start_btn() # 开始答题 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 driver = TestCAQ.driver # 创建测试包列表页面的对象 test_package_list = TestPackageListPage(driver) # 删除测试包 test_package_list.delete_package() time.sleep(5) # 关闭 driver.quit() if __name__ == '__main__': pytest.main(["-s", __file__])