阳洁
2023-07-18 61a7fc87f75f7ef34fd0e3990f3d01e6a68b9c46
测评系统自动测试
3个文件已添加
6个文件已修改
495 ■■■■■ 已修改文件
data/test_data.json 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
elements/ciaq_answer_elements.py 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
elements/share_add_elements.py 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
elements/test_package_list_elements.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
po/ciaq_answer_page.py 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
po/share_add_page.py 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
po/test_package_list_page.py 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
report/report.html 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
testcase/test_ciaq.py 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
data/test_data.json
@@ -81,5 +81,37 @@
      "position":"职员",
      "dept": "人事部"
    }
  },
  "CIAQ": {
    "menu": "测试包管理/测试包列表",
    "add": {
      "company": "TAI测试",
      "type": "职业兴趣包",
      "product": "CIAQ",
      "hrEmail": "2077506045@qq.com",
      "invalid": "2024-01-01 00:00:00",
      "memberLang": "中文",
      "hrReportLang": "中文",
      "reportTemplate": "CIAQ-Complete-Chinese",
      "memberReportLang": "中文",
      "checkCode": "Dem0015,Dem0014,Dem0013,Dem0012,Dem0011,Dem0010,Dem0009,Dem0008,Dem0007,Dem0006,Dem0005,sex,age",
      "uncheckCode": "dept,position"
    },
    "info": {
      "email":"3891@8rvf41t.site",
      "sex": "男",
      "age": "24",
      "grade": "大四",
      "address": "湖南省岳阳市",
      "university": "湖南理工大学",
      "universityAddress": "湖南省岳阳市",
      "college": "湖南理工学院新闻传播学院",
      "major": "广告学",
      "subject": "文学",
      "GPA": "3.3/4.0",
      "work": "广告设计",
      "status": "未在寻找实习/工作",
      "workExperience": "无"
    }
  }
}
elements/ciaq_answer_elements.py
New file
@@ -0,0 +1,23 @@
from selenium.webdriver.common.by import By
class CIAQAnswerElements:
    # 开始测试按钮
    start_btn = (By.XPATH, "//button/span[text()='开始测试']/..")
    # 题目选项
    options = (By.XPATH, "//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, "//div[@class='align-center']/span[2]")
elements/share_add_elements.py
@@ -20,3 +20,38 @@
    fill_position = (By.XPATH, "//form/div[3]//input")
    # 基本信息-部门
    fill_dept = (By.XPATH, "//form/div[4]//input")
    # CIAQ产品包基本信息
    ciaq_email_input = (By.XPATH, "//form/div[2]//input")
    ciaq_sex_select = (By.XPATH, "//form/div[3]//input")
    ciaq_sex_option = (By.XPATH, "//form/div[3]//ul/li[contains(@class,'el-select-dropdown__item')]/span")
    ciaq_age_input = (By.XPATH, "//form/div[4]//input")
    ciaq_grade_select = (By.XPATH, "//form/div[5]//input")
    ciaq_grade_option = (By.XPATH, "//form/div[5]//ul/li[contains(@class,'el-select-dropdown__item')]/span")
    ciaq_address_input = (By.XPATH, "//form/div[6]//input")
    ciaq_university_input = (By.XPATH, "//form/div[7]//input")
    ciaq_universityAddress_input = (By.XPATH, "//form/div[8]//input")
    ciaq_college_input = (By.XPATH, "//form/div[9]//input")
    ciaq_major_input = (By.XPATH, "//form/div[10]//input")
    ciaq_subject_select = (By.XPATH, "//form/div[11]//input")
    ciaq_subject_option = (By.XPATH, "//form/div[11]//ul/li[contains(@class,'el-select-dropdown__item')]/span")
    ciaq_GPA_input = (By.XPATH, "//form/div[12]//input")
    ciaq_work_input = (By.XPATH, "//form/div[13]//input")
    ciaq_status_select = (By.XPATH, "//form/div[14]//input")
    ciaq_status_option = (By.XPATH, "//form/div[14]//ul/li[contains(@class,'el-select-dropdown__item')]/span")
    ciaq_workExperience_select = (By.XPATH, "//form/div[15]//input")
    ciaq_workExperience_option = (By.XPATH, "//form/div[15]//ul/li[contains(@class,'el-select-dropdown__item')]/span")
elements/test_package_list_elements.py
@@ -67,6 +67,8 @@
    add_memberTemplateLangType_select = (By.XPATH, "//select[@name='memberTemplateLangType']/../button")
    # add-测试者报告语言类型选项
    add_memberTemplateLangType_option = (By.XPATH, "//select[@name='memberTemplateLangType']/../div/div/ul/li/a/span[2]")
    # 人口学编码选项
    add_code_checkbox = (By.XPATH, "//label[@class='check-box']")
    # add-确认按钮
    add_confirm_btn = (By.XPATH, "//iframe[@src='/exam/test_package/add']/../../div[3]/a[1]")
po/ciaq_answer_page.py
New file
@@ -0,0 +1,126 @@
import random
from base.base_page import BasePage
from elements.ciaq_answer_elements import CIAQAnswerElements as Answer
from selenium.common.exceptions import *
import time
class CIAQAnswerPage(BasePage):
    """
    答题页面
    """
    loading_count = 0
    def answer(self):
        # 暂停3秒
        time.sleep(3)
        while True:
            # 继续测试按钮出现则点击
            if self.continue_btn_is_display():
                self.click(Answer.continue_testing_btn)
            # 标题不存在直接返回False
            if not self.title_is_display():
                if self.continue_btn_is_display():
                    self.click(Answer.continue_testing_btn)
                    continue
                return False
            try:
                # 获取到所有选项
                options = self.get_elements(Answer.options)
                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(Answer.submit_btn)
                # 数据是否上传完成
                time.sleep(15)
                if self.upload_is_success():
                    return True
                return False
    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)
po/share_add_page.py
@@ -7,6 +7,7 @@
    """
    分享链接打开的页面
    """
    def name_input(self, name):
        """
        输入姓名
@@ -60,3 +61,44 @@
        self.click(Share.submit_btn)
        time.sleep(2)
    def fill_info_CIAQ(self, info):
        """
        CIAQ产品包填写基本信息
        :param info:
        :return:
        """
        self.send_text_wait(info["email"], Share.ciaq_email_input)
        self.selector(Share.ciaq_sex_select, Share.ciaq_sex_option, info["sex"])
        self.send_text_wait(info["age"], Share.ciaq_age_input)
        self.selector(Share.ciaq_grade_select, Share.ciaq_grade_option, info["grade"])
        self.send_text_wait(info["address"], Share.ciaq_address_input)
        self.send_text_wait(info["university"], Share.ciaq_university_input)
        self.send_text_wait(info["universityAddress"], Share.ciaq_universityAddress_input)
        self.send_text_wait(info["college"], Share.ciaq_college_input)
        self.send_text_wait(info["major"], Share.ciaq_major_input)
        self.selector(Share.ciaq_subject_select, Share.ciaq_subject_option, info["subject"])
        self.send_text_wait(info["GPA"], Share.ciaq_GPA_input)
        self.send_text_wait(info["work"], Share.ciaq_work_input)
        self.selector(Share.ciaq_status_select, Share.ciaq_status_option, info["status"])
        self.selector(Share.ciaq_workExperience_select, Share.ciaq_workExperience_option, info["workExperience"])
        self.click_wait(Share.submit_btn)
    def selector(self, select_loc, options_loc, text):
        """
        通用选择器,直接调用选择下拉框选项
        :param select_loc: 点击后出现下拉选项的元素定位
        :param options_loc: 选项的元素定位
        :param text: 判断点击的文本
        :return:
        """
        # 点击下拉框
        self.click_wait(select_loc)
        time.sleep(1)
        # 获取所有选项
        options = self.get_elements_wait(options_loc)
        # 判断选项是否与传入的选项相等
        for opt in options:
            if opt.text == text:
                # 相等则点击该选项
                opt.click()
                break
po/test_package_list_page.py
@@ -223,6 +223,32 @@
                    opt.click()
                    break
    def select_code_checkbox(self, check_text, uncheck_text):
        """
        选择人口学编码
        :param uncheck_text: 取消选中的选框文本,以 , 分割
        :param check_text: 选择的选框文本,以 , 分割
        :return:
        """
        # 获取所有人口选编码选框元素
        code_boxs = self.get_elements_wait(PackageList.add_code_checkbox)
        # 将check_text分割
        code_check_texts = check_text.split(',')
        for code_text in code_check_texts:
            for code_box in code_boxs:
                if code_text == code_box.text:
                    code_box.click()
        # 将check_text分割
        code_uncheck_texts = uncheck_text.split(',')
        for code_text in code_uncheck_texts:
            for code_box in code_boxs:
                if code_text == code_box.text:
                    code_box.click()
    def add_confirm(self):
        """
        点击确认按钮
report/report.html
@@ -253,9 +253,9 @@
}
</script>
    <h1>report.html</h1>
    <p>Report generated on 18-Jul-2023 at 15:23:51 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 17:34:03 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v3.2.0</p>
    <h2>Summary</h2>
    <p>5 tests ran in 63.57 seconds. </p>
    <p>5 tests ran in 133.54 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">5 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_vaq.py::TestVAQ::test_login[login]</td>
          <td class="col-duration">5.14</td>
          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_login[login]</td>
          <td class="col-duration">5.01</td>
          <td class="col-links"></td></tr>
        <tr>
          <td class="extra" colspan="4">
@@ -279,8 +279,8 @@
      <tbody class="passed results-table-row">
        <tr>
          <td class="col-result">Passed</td>
          <td class="col-name">testcase/test_vaq.py::TestVAQ::test_create_package[VAQ]</td>
          <td class="col-duration">14.39</td>
          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_create_package[CIAQ]</td>
          <td class="col-duration">2.07</td>
          <td class="col-links"></td></tr>
        <tr>
          <td class="extra" colspan="4">
@@ -288,8 +288,8 @@
      <tbody class="passed results-table-row">
        <tr>
          <td class="col-result">Passed</td>
          <td class="col-name">testcase/test_vaq.py::TestVAQ::test_open_url[VAQ]</td>
          <td class="col-duration">12.75</td>
          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_open_url[CIAQ]</td>
          <td class="col-duration">17.20</td>
          <td class="col-links"></td></tr>
        <tr>
          <td class="extra" colspan="4">
@@ -297,8 +297,8 @@
      <tbody class="passed results-table-row">
        <tr>
          <td class="col-result">Passed</td>
          <td class="col-name">testcase/test_vaq.py::TestVAQ::test_answer</td>
          <td class="col-duration">23.80</td>
          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_answer</td>
          <td class="col-duration">101.78</td>
          <td class="col-links"></td></tr>
        <tr>
          <td class="extra" colspan="4">
@@ -306,8 +306,8 @@
      <tbody class="passed results-table-row">
        <tr>
          <td class="col-result">Passed</td>
          <td class="col-name">testcase/test_vaq.py::TestVAQ::test_delete_package</td>
          <td class="col-duration">7.34</td>
          <td class="col-name">testcase/test_ciaq.py::TestCIAQ::test_delete_package</td>
          <td class="col-duration">7.31</td>
          <td class="col-links"></td></tr>
        <tr>
          <td class="extra" colspan="4">
testcase/test_ciaq.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.ciaq_answer_page import CIAQAnswerPage
from comm.my_random import *
class TestCIAQ:
    driver = None
    test_package_name = "CIAQ自动测试包-20230718171809"
    @pytest.mark.parametrize('data_read', ["login"], indirect=True)
    def test_login(self, data_read: dict):
        """
        打开页面并进行登录测试
        :param data_read: 执行数据读取的函数并获取到返回值
        :return:
        """
        TestCIAQ.driver = webdriver.Chrome()
        driver = TestCIAQ.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', ["CIAQ"], indirect=True)
    def test_create_package(self, data_read: dict):
        """
        创建测试包
        :param data_read: 读取数据
        :return:
        """
        # 获取driver
        driver = TestCIAQ.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 = "CIAQ自动测试包-" + time_str
        # # 设置测试包名称为类变量
        # TestCIAQ.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.select_code_checkbox(create_data["checkCode"], create_data["uncheckCode"])
        #
        # # 点击确认按钮
        # 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', ["CIAQ"], indirect=True)
    def test_open_url(self, data_read: dict):
        """
        打开分享链接
        :return:
        """
        # 获取driver
        driver = TestCIAQ.driver
        # 创建测试包列表页面的对象
        test_package_list = TestPackageListPage(driver)
        # 勾选新创建的测试包
        test_package_list.click_package_checkbox(TestCIAQ.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_CIAQ(info)
        time.sleep(5)
    def test_answer(self):
        # 获取driver
        driver = TestCIAQ.driver
        # 创建answer对象
        answer_page = CIAQAnswerPage(driver)
        # 点击开始测试
        answer_page.start_btn()
        # 开始答题
        flag = answer_page.answer()
        # 答完题关闭当前标签页
        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 = TestCIAQ.driver
        # 创建测试包列表页面的对象
        test_package_list = TestPackageListPage(driver)
        # 删除测试包
        test_package_list.delete_package()
        time.sleep(5)
        # 关闭
        driver.quit()
if __name__ == '__main__':
    pytest.main(["-s", __file__])