Exemple #1
0
class Cloze(BasePage):
    """完形填空"""
    def __init__(self):
        self.get = GetAttribute()

    @teststeps
    def wait_check_page(self):
        """以“title:完形填空”的xpath-index为依据"""
        locator = (By.XPATH,
                   "//android.widget.TextView[contains(@text,'完形填空')]")
        try:
            WebDriverWait(self.driver, 20,
                          0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststeps
    def wait_check_play_page(self):
        """以“rate”的ID为依据"""
        locator = (By.XPATH,
                   "//android.widget.TextView[contains(@resource-id,'{}rate')]"
                   .format(self.id_type()))
        try:
            WebDriverWait(self.driver, 20,
                          0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststep
    def rate(self):
        """获取作业数量"""
        rate = self.driver \
            .find_element_by_id(self.id_type() + "rate").text
        return rate

    @teststep
    def font_middle(self):
        """第一个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_middle")

        return ele

    @teststep
    def font_large(self):
        """第二个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_large")
        return ele

    @teststep
    def font_great(self):
        """第三个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_great")
        return ele

    @teststep
    def dragger_button(self):
        """拖动按钮"""
        num = self.driver \
            .find_element_by_id(self.id_type() + "dragger")
        return num

    @teststeps
    def question(self):
        """题目"""
        num = self.driver \
            .find_element_by_id(self.id_type() + "question").text
        return num

    @teststeps
    def option_button(self, var):
        """选项"""
        ele = self.driver \
            .find_elements_by_xpath("//android.widget.TextView[contains(@text, '%s')]"
                                    "/following-sibling::android.widget.LinearLayout/android.widget.LinearLayout"
                                    "/android.widget.LinearLayout/android.widget.TextView" % var)
        item = []
        content = []
        for i in range(0, len(ele), 2):
            item.append(ele[i])
            content.append(ele[i + 1])
        print('选项个数:', len(item), len(content))
        return item, content

    @teststeps
    def option_content(self):
        """选项 内容"""
        ele = self.driver \
            .find_elements_by_id(self.id_type() + "tv_item")
        return ele

    @teststep
    def time(self):
        """获取作业时间"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "time").text
        return ele

    def options_view_size(self):
        """获取整个选项页面大小"""
        num = self.driver.find_element_by_id(self.id_type() + "option")
        var = num.size
        return var['height']

    @teststep
    def input_text(self):
        """输入框"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "cl_content")
        return ele

    @teststeps
    def get_input_bounds(self):
        """获取 输入框坐标"""
        ele = self.input_text()  # 输入框
        content = self.get.get_description(ele)
        item_x = re.match(".*\[(.*)\].*\[", content)  # x值
        item_y = re.match(".*\[(.*)\].*", content)  # y值
        x = item_x.group(1).split(',')  # 所有输入框y值的列表
        y = item_y.group(1).split(',')  # 所有输入框x值的列表
        size = ele.size
        return x, y, size

    @teststeps
    def get_result(self):
        """获取 输入框 的结果"""
        ele = self.input_text()  # 输入框
        content = self.get.get_description(ele)
        value = re.match("\\[(.+?)\\]", content)  # answer
        answer = value.group(1).split(',')  # 所有输入框值的列表
        print(answer)
        return answer

    @teststeps
    def cloze_operate(self):
        """《完形填空》 游戏过程"""
        if self.wait_check_page():
            if self.wait_check_play_page():
                result = []
                timestr = []  # 获取每小题的时间
                rate = self.rate()

                self.font_operate()  # Aa文字大小切换按钮 切换 及状态统计

                drag = self.dragger_button()  # 拖拽 拖动按钮
                loc = self.get_element_bounds(drag)
                size = self.options_view_size()  # 获取整个选项页面大小

                y = loc[3] - size * 4 / 3
                if loc[3] - size * 4 / 3 < 0:
                    y = 0
                self.driver.swipe(loc[2], loc[3], loc[2], y, 1000)  # 向上拖拽

                for i in range(int(rate)):
                    Homework().rate_judge(rate, i)  # 测试当前rate值显示是否正确
                    Homework().next_button_operate('false')  # 下一题 按钮 判断加 点击操作

                    if i == 4:
                        self.screen_swipe_up(0.5, 0.5, 0.25, 1000)

                    num = self.question()  # 题目
                    if int(re.sub("\D", "", num)) == i:  # 如果一次没滑动,再滑一次
                        self.screen_swipe_left(0.9, 0.8, 0.1, 2000)
                        num = self.question()  # 题目
                    print(num)

                    options = self.option_button(num)  # 四个选项
                    options[0][random.randint(0, len(options[0])) -
                               1].click()  # 随机点击选项
                    time.sleep(1)
                    for j in range(len(options[0])):
                        if self.get.get_selected(options[0][j]) == 'true':
                            print('选择的答案:', options[1][j].text)
                            result.append(options[1][j].text)
                            break

                    timestr.append(self.time())  # 统计每小题的计时控件time信息
                    self.screen_swipe_left(0.9, 0.8, 0.1, 2000)

                    if i == int(
                            rate) - 1:  # 最后一小题:1、测试滑动页面是否可以进入结果页   2、拖拽 拖动按钮
                        if not ResultPage().wait_check_result_page(
                                2):  # 结果页检查点
                            drag = self.dragger_button()  # 拖拽 拖动按钮
                            loc = self.get_element_bounds(drag)
                            self.driver.swipe(loc[2], loc[3], loc[2],
                                              loc[3] + size - 10,
                                              1000)  # 拖拽按钮到底部
                        else:
                            print('❌❌❌ Error - 滑动页面进入了结果页')

                    time.sleep(1)
                    print('================')

                time.sleep(1)
                content = self.get_result()  # 测试 是否答案已填入文章中
                if len(content) != len(result):
                    print('❌❌❌ Error -获取到的答案不一致', result, content)
                else:
                    for k in range(len(result)):
                        if content[k][
                                0] == ' ':  # 由于填入content-desc的数据会自动加一个空格,故去掉
                            content[k] = content[k][1:]
                        if content[k] != result[k]:
                            print('❌❌❌ Error - 填入的答案与选择的答案不一致', result[k],
                                  content[k])

                Homework().next_button_operate('true')  # 下一题 按钮 状态判断 加点击
                Homework().now_time(timestr)  # 判断游戏界面 计时功能控件 是否在计时

    @teststeps
    def font_operate(self):
        """Aa文字大小切换按钮 状态判断 及 切换操作"""
        x = []
        y = []
        middle = self.font_middle()  # first
        large = self.font_large()  # second
        great = self.font_great()  # third

        i = 0
        j = 0
        while i < 3:
            bounds = self.get_input_bounds()  # 获取输入框坐标
            print(self.get.get_checked(middle), self.get.get_checked(large),
                  self.get.get_checked(great))

            if self.get.get_checked(middle) == 'false':
                if self.get.get_checked(large) == 'false':
                    x.insert(2, bounds[0][0])
                    y.insert(2, bounds[1][0])
                    print('当前选中的Aa按钮为第3个:', bounds[0][0], bounds[1][0])
                    j = 3
                else:
                    if self.get.get_checked(large) == 'true':
                        x.insert(1, bounds[0][0])
                        y.insert(1, bounds[1][0])
                        print('当前选中的Aa按钮为第2个:', bounds[0][0], bounds[1][0])
                        j = 2
            else:
                x.insert(0, bounds[0][0])
                y.insert(0, bounds[1][0])
                print('当前选中的Aa按钮为第1个:', bounds[0][0], bounds[1][0])
                j = 1

            if j == 1:
                large.click()
            elif j == 2:
                great.click()
            else:
                middle.click()
            i += 1
            print('--------------------------------------------')
            time.sleep(2)

        if not float(y[2]) > float(y[1]) > float(y[0]):
            print('❌❌❌ Error - Aa文字大小切换按钮:', y)
        print('==============================================')
Exemple #2
0
class ReadCompre(BasePage):
    """阅读理解"""
    def __init__(self):
        self.get = GetAttribute()

    @teststeps
    def wait_check_page(self):
        """以“title:阅读理解”的xpath-index为依据"""
        locator = (By.XPATH, "//android.widget.TextView[contains(@text,'阅读理解')]")
        try:
            WebDriverWait(self.driver, 20, 0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststeps
    def wait_check_play_page(self):
        """以“rate”的ID为依据"""
        locator = (By.XPATH, "//android.widget.TextView[contains(@resource-id,"
                             "'{}rate')]".format(self.id_type()))
        try:
            WebDriverWait(self.driver, 20, 0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststep
    def rate(self):
        """获取作业数量"""
        rate = self.driver \
            .find_element_by_id(self.id_type() + "rate").text
        return rate

    @teststep
    def font_middle(self):
        """第一个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_middle")
        return ele

    @teststep
    def font_large(self):
        """第二个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_large")
        return ele

    @teststep
    def font_great(self):
        """第三个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_great")
        return ele

    @teststep
    def dragger(self):
        """拖动按钮"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "dragger")
        return ele

    @teststep
    def question_num(self):
        """题目内容"""
        num = self.driver \
            .find_element_by_id(self.id_type() + "question")
        return num

    @teststeps
    def get_first_num(self):
        """获取 当前页面第一个题号"""
        item = self.question_num().text.split(".")[0]
        return item

    def article_view_size(self):
        """获取整个文章页面大小"""
        num = self.driver.find_element_by_id(self.id_type() + "ss_view")
        var = num.size
        return var['height']

    def options_view_size(self):
        """获取整个选项页面大小"""
        num = self.driver.find_element_by_id(self.id_type() + "optionlist")
        var = num.size
        return var['height']

    @teststeps
    def option_button(self, var):
        """选项"""
        print(var)
        ele = self.driver\
            .find_elements_by_xpath("//android.widget.TextView[contains(@text, '%s')]"
                                    "/following-sibling::android.widget.LinearLayout/android.widget.LinearLayout"
                                    "/android.widget.LinearLayout/android.widget.TextView" % var)

        item = []  # 选项
        content = []  # 选项内容
        for i in range(0, len(ele), 2):
            item.append(ele[i])
            content.append(ele[i+1])
        print('选项个数:', len(item))

        return item, content

    @teststep
    def option_item(self, index):
        """选项 内容"""
        ele = self.driver \
            .find_elements_by_id(self.id_type() + "tv_item")[index].text
        return ele

    @teststep
    def time(self):
        """获取作业时间"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "time").text
        return ele

    @teststeps
    def reading_operate(self):
        """《阅读理解》 游戏过程"""
        if self.wait_check_page():
            if self.wait_check_play_page():
                timestr = []  # 获取每小题的时间

                drag = self.dragger()  # 拖动按钮
                loc = self.get_element_bounds(drag)  # 获取按钮坐标
                size = self.options_view_size()  # 获取整个选项页面大小
                self.driver.swipe(loc[2], loc[3], loc[2], loc[3] + size-10, 1000)  # 拖拽按钮到最底部,以便测试Aa

                self.font_operate()  # Aa文字大小切换按钮 状态判断 及 切换操作

                loc = self.get_element_bounds(drag)  # 获取按钮坐标
                y = loc[3] - size * 4 / 3
                if loc[3] - size * 4 / 3 < 0:
                    y = 0
                self.driver.swipe(loc[2], loc[3], loc[2], y, 1000)  # 向上拖拽

                rate = self.rate()
                for i in range(int(rate)):
                    Homework().rate_judge(rate, i)  # 测试当前rate值显示是否正确
                    Homework().next_button_operate('false')  # 下一题 按钮 状态判断 加点击

                    question = self.question_num().text  # 题目
                    if i != 0:
                        for step in range(0, 5):
                            if int(self.get_first_num()) == i+1:  # 正好
                                question = self.question_num().text
                                break
                            elif int(self.get_first_num()) > i+1:  # 上拉拉过了
                                self.screen_swipe_down(0.5, 0.7, 0.9, 1000)
                                if int(self.get_first_num()) == i+1:  # 正好
                                    question = self.question_num().text
                                    break
                                elif int(self.get_first_num()) < i+1:  # 下拉拉过了
                                    self.screen_swipe_up(0.5, 0.9, 0.8, 1000)  # 滑屏

                    options = self.option_button(question)
                    options[0][random.randint(0, len(options[0])) - 1].click()  # 随机点击选项
                    time.sleep(1)
                    for j in range(len(options[0])):
                        if GetAttribute().get_selected(options[1][j]) == 'true':
                            print('我的答案:', options[1][j].text)
                            break

                    if i != int(rate) - 1:
                        self.screen_swipe_up(0.5, 0.9, 0.5, 1000)

                    timestr.append(self.time())  # 统计每小题的计时控件time信息
                    print('---------------------------')

                Homework().next_button_operate('true')  # 下一题 按钮 状态判断 加点击
                Homework().now_time(timestr)  # 判断游戏界面 计时功能控件 是否在计时

    @teststeps
    def font_operate(self):
        """Aa文字大小切换按钮 状态判断 及 切换操作"""
        loc = []
        middle = self.font_middle()  # first
        large = self.font_large()  # second
        great = self.font_great()  # third

        i = 0
        j = 0
        while i < 3:
            self.screen_swipe_up(0.5, 0.85, 0.2, 1000)
            y = self.article_view_size()  # 获取整个文章页面大小
            self.screen_swipe_down(0.5, 0.2, 0.8, 1000)
            print(self.get.get_checked(middle), self.get.get_checked(large), self.get.get_checked(great))

            if self.get.get_checked(middle) == 'false':
                if self.get.get_checked(large) == 'false':
                    print('当前选中的Aa按钮为第3个,页面高度:', y)
                    loc.insert(2, y)
                    j = 3
                else:
                    if self.get.get_checked(large) == 'true':
                        print('当前选中的Aa按钮为第2个,页面高度:', y)
                        loc.insert(1, y)
                        j = 2
            else:
                print('当前选中的Aa按钮为第1个,页面高度:', y)
                loc.insert(0, y)
                j = 1

            if j == 1:
                large.click()
            elif j == 2:
                great.click()
            elif j == 3:
                middle.click()
            i += 1
            time.sleep(2)
            print('-----------------------------------------')

        if not float(loc[2]) > float(loc[1]) > float(loc[0]):
            print('❌❌❌ Error - Aa文字大小切换按钮:', loc)
        print('=============================================')
Exemple #3
0
class ChoiceWordCloze(BasePage):
    """选词填空"""
    def __init__(self):
        self.bounds = ClickBounds()
        self.result = ResultPage()
        self.get = GetAttribute()
        self.key = Keyboard()

    @teststeps
    def wait_check_page(self):
        """以“title:选词填空”的xpath-index为依据"""
        locator = (By.XPATH, "//android.widget.TextView[contains(@text,'选词填空')]")
        try:
            WebDriverWait(self.driver, 20, 0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststeps
    def wait_check_play_page(self):
        """以“rate”的ID为依据"""
        locator = (By.XPATH, "//android.widget.TextView[contains(@resource-id,"
                             + self.id_type() + "rate)]")
        try:
            WebDriverWait(self.driver, 20, 0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststep
    def rate(self):
        """获取作业数量"""
        rate = self.driver\
            .find_element_by_id(self.id_type() + "rate").text
        return rate

    @teststep
    def font_middle(self):
        """第一个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_middle")
        return ele

    @teststep
    def font_large(self):
        """第二个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_large")
        return ele

    @teststep
    def font_great(self):
        """第三个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_great")
        return ele

    @teststep
    def prompt(self):
        """提示词"""
        self.driver\
            .find_element_by_id(self.id_type() + "prompt").click()

    @teststep
    def bounds_prompt(self):
        """提示词按钮"""
        ele = self.driver\
            .find_elements_by_xpath("//android.widget.TextView[contains(@index,0)]")[1]
        return ele

    @teststep
    def prompt_content(self):
        """提示词内容"""
        ele = self.driver \
            .find_elements_by_xpath("//android.widget.TextView[contains(@index,0)]")[1].text
        return ele

    @teststep
    def click_blank(self):
        """点击页面 提示词弹框 以外空白处,弹框消失"""
        self.bounds.click_bounds(67.5, 1119.5)
        time.sleep(1)

    @teststep
    def time(self):
        """获取作业时间"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "time").text
        return ele

    # 查看答案 页面
    @teststeps
    def wait_check_detail_page(self):
        """以“answer”的ID为依据"""
        locator = (By.XPATH, "//android.widget.TextView[contains(@resource-id,"
                             + self.id_type() + "tv_answer)]")
        try:
            WebDriverWait(self.driver, 20, 0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststep
    def content_value(self):
        """获取整个 外框元素"""
        ele = self.driver\
            .find_element_by_id(self.id_type() + "tb_content")
        return ele

    @teststeps
    def content_desc(self):
        """点击输入框,激活小键盘"""
        content = self.get.get_description(self.content_value())
        item_x = re.match(".*\[(.*)\].*\[", content)  # x值
        item_y = re.match(".*\[(.*)\].*", content)  # y值
        x = item_x.group(1).split(',')  # 所有输入框y值的列表
        y = item_y.group(1).split(',')  # 所有输入框x值的列表
        return x, y

    @teststeps
    def get_result(self):
        """点击输入框,激活小键盘"""
        content = self.get.get_description(self.content_value())
        value = re.match("\\[(.+?)\\]", content)  # answer
        answer = value.group(1).split(',')  # 所有输入框值的列表
        print('正确答案:', answer)
        self.click_blank()
        return answer

    @teststeps
    def choice_word_filling(self):
        """《选词填空》 游戏过程"""
        if self.wait_check_page():  # 页面检查点
            if self.wait_check_play_page():
                timestr = []
                self.prompt()  # 右上角 提示词
                time.sleep(1)
                content = self.prompt_content()  # 取出提示内容
                self.click_blank()  # 点击空白处 弹框消失
                word_list = content.split('   ')  # 取出单词列表
                print('待输入的单词:', word_list)

                self.font_operate()  # Aa文字大小切换按钮 切换 及状态统计

                rate = self.rate()
                for i in range(int(rate)):
                    Homework().rate_judge(rate, i)  # 测试当前rate值显示是否正确
                    Homework().next_button_operate('false')  # 下一题 按钮 状态判断 加点击

                    if i == 0:  # 获取第一个输入框的坐标,点击激活小键盘
                        item = self.content_desc()
                        loc = self.get_element_location(self.content_value())  # 文章元素左上角 顶点坐标
                        x = float(item[0][i]) + loc[0]+55.0  # 55.0为点击输入框中心点的偏移量
                        y = float(item[1][i]) + loc[1]
                        self.driver.tap([(x, y)])  # 点击激活输入框
                    else:
                        self.key.games_keyboard('enter')  # 点击回车键进入下一题

                    word = word_list[i]  # 单词
                    print('study_word:', word)
                    if len(word_list) >= int(rate):
                        for index in range(len(word)):
                            if index == 4:
                                self.key.games_keyboard('capslock')  # 点击键盘 切换到 大写字母
                                self.key.games_keyboard(word[index].upper())  # 点击键盘对应 大写字母
                                self.key.games_keyboard('capslock')  # 点击键盘 切换到 小写字母
                            else:
                                self.key.games_keyboard(word[index])  # 点击键盘对应字母
                    else:
                        self.key.games_keyboard('a')  # 点击键盘对应字母

                    timestr.append(self.time())  # 统计每小题的计时控件time信息

                Homework().next_button_operate('true')  # 下一题 按钮 状态判断 加点击
                Homework().now_time(timestr)  # 判断游戏界面 计时功能控件 是否在计时
                print('==================================================')
                return rate

    @teststeps
    def check_detail_page(self, rate, homework_title, game_title):
        """查看答案页面面"""
        if self.result.wait_check_result_page():  # 结果页检查点
            self.result.check_result_button()  # 结果页 查看答案 按钮

            if self.result.wait_check_detail_page():  # 页面检查点
                print('查看答案页面:')
                item = self.get_result()
                print('excel-opeate:')
                for i in range(len(item)):
                    print('----------------------')
                    ExcelUtil().data_write(rate, homework_title, game_title, item[i])
                self.result.back_up_button()

    @teststeps
    def font_operate(self):
        """Aa文字大小切换按钮 状态判断 及 切换操作"""
        x = []
        y = []
        middle = self.font_middle()  # first
        large = self.font_large()  # second
        great = self.font_great()  # third

        i = 0
        j = 0
        while i < 3:
            bounds = self.content_desc()  # 获取输入框坐标
            print(self.get.get_checked(middle), self.get.get_checked(large), self.get.get_checked(great))

            if self.get.get_checked(middle) == 'false':
                if self.get.get_checked(large) == 'false':
                    x.insert(2, bounds[0][0])
                    y.insert(2, bounds[1][0])
                    print('当前选中的Aa按钮为第3个:', bounds[0][0], bounds[1][0])
                    j = 3
                else:
                    if self.get.get_checked(large) == 'true':
                        x.insert(1, bounds[0][0])
                        y.insert(1, bounds[1][0])
                        print('当前选中的Aa按钮为第2个:', bounds[0][0], bounds[1][0])
                        j = 2
            else:
                x.insert(0, bounds[0][0])
                y.insert(0, bounds[1][0])
                print('当前选中的Aa按钮为第1个:', bounds[0][0], bounds[1][0])
                j = 1

            if j == 1:
                large.click()
            elif j == 2:
                great.click()
            else:
                middle.click()
            i += 1
            print('--------------------------------------------')
            time.sleep(2)

        if not float(y[2]) > float(y[1]) > float(y[0]):
            print('❌❌❌ Error - Aa文字大小切换按钮:', y)
        print('==============================================')
class CompleteArticle(BasePage):
    """补全文章"""
    def __init__(self):
        self.result = ResultPage()
        self.get = GetAttribute()

    @teststeps
    def wait_check_page(self):
        """以“title:补全文章”的xpath-index为依据"""
        locator = (By.XPATH,
                   "//android.widget.TextView[contains(@text,'补全文章')]")
        try:
            WebDriverWait(self.driver, 20,
                          0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststeps
    def wait_check_play_page(self):
        """以“rate”的ID为依据"""
        locator = (
            By.XPATH,
            "//android.widget.TextView[contains(@resource-id,'{}rate)]".format(
                self.id_type()))
        try:
            WebDriverWait(self.driver, 20,
                          0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststep
    def rate(self):
        """获取作业数量"""
        rate = self.driver \
            .find_element_by_id(self.id_type() + "rate").text
        return rate

    @teststep
    def font_middle(self):
        """第一个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_middle")

        return ele

    @teststep
    def font_large(self):
        """第二个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_large")
        return ele

    @teststep
    def font_great(self):
        """第三个Aa"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "font_great")
        return ele

    @teststep
    def dragger_button(self):
        """拖动按钮"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "dragger")
        return ele

    @teststep
    def option_button(self):
        """选项ABCD"""
        ele = self.driver \
            .find_elements_by_id(self.id_type() + 'tv_char')
        return ele

    @teststep
    def option_content(self, index):
        """选项 内容"""
        ele = self.driver \
            .find_elements_by_id(self.id_type() + 'tv_item')[index].text
        print('选项内容:', ele)
        return ele

    def options_view_size(self):
        """获取整个选项页面大小"""
        num = self.driver.find_element_by_id(self.id_type() + "option")
        var = num.size
        return var['height']

    @teststep
    def time(self):
        """获取作业时间"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "time").text
        return ele

    @teststep
    def input_text(self):
        """输入框"""
        ele = self.driver \
            .find_element_by_id(self.id_type() + "ss_view")
        return ele

    @teststeps
    def get_input_bounds(self):
        """获取 输入框坐标"""
        ele = self.input_text()  # 输入框
        content = self.get.get_description(ele)
        item_x = re.match(".*\[(.*)\].*\[", content)  # x值
        item_y = re.match(".*\[(.*)\].*", content)  # y值
        x = item_x.group(1).split(',')  # 所有输入框y值的列表
        y = item_y.group(1).split(',')  # 所有输入框x值的列表
        return x, y

    # 查看答案 页面
    @teststeps
    def wait_check_detail_page(self):
        """以“answer”的ID为依据"""
        locator = (By.XPATH, "//android.widget.TextView[contains(@resource-id,"
                   "'{}tb_content)']".format(self.id_type()))
        try:
            WebDriverWait(self.driver, 20,
                          0.5).until(lambda x: x.find_element(*locator))
            return True
        except:
            return False

    @teststeps
    def get_result(self):
        """获取 输入框 的结果"""
        ele = self.input_text()  # 输入框
        content = self.get.get_description(ele)
        value = re.match("\\[(.+?)\\]", content)  # answer
        answer = value.group(1).split(',')  # 所有输入框值的列表
        return answer

    @teststeps
    def complete_article_operate(self):
        """《补全文章》 游戏过程"""
        if self.wait_check_page():
            if self.wait_check_play_page():
                content = []
                timestr = []  # 获取每小题的时间

                self.font_operate()  # Aa文字大小切换按钮 切换 及状态统计

                drag = self.dragger_button()  # 拖拽 拖动按钮
                loc = self.get_element_bounds(drag)  # 获取按钮坐标
                size = self.options_view_size()  # 获取整个选项页面大小
                self.driver.swipe(loc[2], loc[3], loc[2], loc[3] - size,
                                  1000)  # 向上拖拽

                rate = self.rate()
                for i in range(int(rate)):
                    Homework().rate_judge(rate, i)  # 测试当前rate值显示是否正确
                    Homework().next_button_operate('false')  # 下一题 按钮 判断加 点击操作

                    options = self.option_button()  # 选项ABCD
                    if len(options) < i + 1:
                        options = self.option_button()  # 选项ABCD
                        self.screen_swipe_up(0.5, 0.9, 0.6, 1000)  # 滑屏

                    text = [options[i].text]
                    options[i].click()  # 依次点击选项

                    content.append(self.get_result()[i])  # 测试 是否答案已填入文章中
                    time.sleep(1)
                    if content[i] == ' ':
                        print('❌❌❌ Error - 答案未填入文章中')
                    else:
                        print('第%s题:' % (i + 1))
                        print(text, content[i])
                    timestr.append(self.time())  # 统计每小题的计时控件time信息
                    print('-------------------------')

                    if i == int(rate) - 1:
                        drag = self.dragger_button()  # 拖拽 拖动按钮
                        loc = self.get_element_bounds(drag)  # 获取按钮坐标
                        size = self.options_view_size()  # 获取整个选项页面大小
                        self.driver.swipe(loc[2], loc[3], loc[2],
                                          loc[3] + size - 10, 1000)  # 向下拖拽按钮

                Homework().next_button_operate('true')  # 下一题 按钮 状态判断 加点击
                Homework().now_time(timestr)  # 判断游戏界面 计时功能控件 是否在计时
                print('============================================')
                return rate

    @teststeps
    def result_detail_page(self):
        """查看答案页面"""
        if self.result.wait_check_result_page():  # 结果页检查点
            self.result.check_result_button()  # 结果页 查看答案 按钮
            if self.result.wait_check_detail_page():  # 页面检查点
                if self.wait_check_detail_page():
                    print('查看答案页面:')
                    item = self.get_result()
                    print("正确答案:", item)
                    self.result.back_up_button()  # 返回结果页

    @teststeps
    def font_operate(self):
        """Aa文字大小切换按钮 状态判断 及 切换操作"""
        x = []
        y = []
        middle = self.font_middle()  # first
        large = self.font_large()  # second
        great = self.font_great()  # third

        i = 0
        j = 0
        while i < 3:
            bounds = self.get_input_bounds()  # 获取输入框坐标
            print(self.get.get_checked(middle), self.get.get_checked(large),
                  self.get.get_checked(great))

            if self.get.get_checked(middle) == 'false':
                if self.get.get_checked(large) == 'false':
                    x.insert(2, bounds[0][0])
                    y.insert(2, bounds[1][0])
                    print('当前选中的Aa按钮为第3个:', bounds[0][0], bounds[1][0])
                    j = 3
                else:
                    if self.get.get_checked(large) == 'true':
                        x.insert(1, bounds[0][0])
                        y.insert(1, bounds[1][0])
                        print('当前选中的Aa按钮为第2个:', bounds[0][0], bounds[1][0])
                        j = 2
            else:
                x.insert(0, bounds[0][0])
                y.insert(0, bounds[1][0])
                print('当前选中的Aa按钮为第1个:', bounds[0][0], bounds[1][0])
                j = 1

            if j == 1:
                large.click()
            elif j == 2:
                great.click()
            elif j == 3:
                middle.click()
            i += 1
            print('--------------------------------------------')
            time.sleep(2)

        if not float(y[2]) > float(y[1]) > float(y[0]):
            print('❌❌❌ Error - Aa文字大小切换按钮:', y)
        print('==============================================')