yj
2024-07-24 3b84cce1ee43215b9f398148fda19f4b1025856b
测评系统自动测试
14个文件已修改
656 ■■■■■ 已修改文件
base/base_page.py 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
data/test_data.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
elements/caq_answer_elements.py 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
elements/ciaq_answer_elements.py 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
elements/jaq_answer_elements.py 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
elements/vaq_answer_elements.py 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
po/caq_answer_page.py 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
po/ciaq_answer_page.py 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
po/jaq_answer_page.py 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
po/maq_answer_page.py 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
po/vaq_answer_page.py 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
report/report.html 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
testcase/conftest.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
testcase/test_main.py 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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):
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测试",
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")
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")
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]")
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")
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)
            # # 标题不存在直接返回False
            # 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
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))
            # 标题不存在直接返回False
            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现在是CIAQ分片{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):
        """
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:
            # 标题不存在直接返回False
            if not self.title_is_display():
                return False
            try:
                # 获取到所有a选项
                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"现在是JAQ第{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()
                # 获取到所有b选项
                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)
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现在是MAQ第{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)
            # 标题不存在直接返回False
            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
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):
        """
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">
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')
    # 初始化webdriver
    driver = webdriver.Chrome(options=options)
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开始进行MAQ测试......")
        # 获取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开始进行JAQ测试......")
        # 获取driver
        self.driver = driver
        driver.get(data_read['share_url'])
        # # 创建测试包列表页面的对象
        # test_package_list = TestPackageListPage(driver)
        # url = test_package_list.oper_elem("share_url_text")
        # # 切换到上一层iframe
        # 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开始进行CAQ测试......")
        # 获取driver
        self.driver = driver
        driver.get(data_read['share_url'])
        # # 创建测试包列表页面的对象
        # test_package_list = TestPackageListPage(driver)
        # url = test_package_list.oper_elem("share_url_text")
        # # 切换到上一层iframe
        # 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开始进行CIAQ测试......")
        # 获取driver
        self.driver = driver
        driver.get(data_read['share_url'])
        # # 创建测试包列表页面的对象
        # test_package_list = TestPackageListPage(driver)
        # url = test_package_list.oper_elem("share_url_text")
        # # 切换到上一层iframe
        # 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开始进行VAQ测试......")
        # 获取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