Exemple #1
0
    def _perform_model3(self):
        self._get_chapter_section()
        last_time = time.time() - 120  # 答题间隔控制,减少答题验证码的弹出
        ch_se_st = input('please input ch_se:')

        ch_se_flag = 0
        # 遍历每个未完成章节
        for ch_se in self.ch_se_lt:
            if ch_se_st in ch_se[0]:
                ch_se_flag = 1
            if ch_se_flag == 0:
                continue
            print(COLOR.DISPLAY + 'now turns to ' + str(ch_se[0]) + COLOR.END,
                  file=self._out_fp)
            try:
                PM = PlayMedia(self.driver, self._out_fp)
                PM.play_media('https://mooc1-1.chaoxing.com' + ch_se[1])
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                send_err(traceback.format_exc())

            if self._que_server_flag == 1:
                # 答题间隔控制
                now_time = time.time()
                if now_time - last_time < 120:
                    sleep(120 - (now_time - last_time))
                last_time = time.time()
                self._go_que_task()
Exemple #2
0
 def _choose_course(self):
     sleep(10)
     # 从当前页面读取课程名字,经选择后点击
     self.__wait = WebDriverWait(self.driver, 30)
     self.__wait.until(
         EC.presence_of_element_located((By.XPATH, '//iframe')))
     iframe = self.driver.find_element_by_xpath('//iframe')
     self.driver.switch_to.frame(iframe)
     self.__wait.until(
         EC.presence_of_element_located((By.CSS_SELECTOR, '.ulDiv')))
     courses_num = len(
         self.driver.find_elements_by_xpath('//div[@class="ulDiv"]/ul/li'))
     courses_lt = []
     valid_i = 1
     for i in range(1, courses_num):
         try:
             name = self.driver.find_element_by_xpath(
                 '//div[@class="ulDiv"]/ul/li[' + str(i) +
                 ']/div[2]/h3/a').get_attribute('title')
             href = self.driver.find_element_by_xpath(
                 '//div[@class="ulDiv"]/ul/li[' + str(i) +
                 ']/div[1]/a').get_attribute('href')
             courses_lt.append((name, href))
             print(COLOR.DISPLAY + '\t', valid_i, '、', name + COLOR.END)
             valid_i += 1
         except:
             #print('=======')
             #print(format_exc())
             send_err(format_exc())
     return courses_lt
Exemple #3
0
    def _go_que_task(self):
        try:
            err_flag = self._ans_question()

            if err_flag != 0:
                print(COLOR.ERR, 'unfinished!', COLOR.END, file=self._out_fp)
                # self._err_lt.append()  # 记录答题提交失败的章节
            else:
                print(COLOR.OK, 'finished!', COLOR.END, file=self._out_fp)
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            send_err(traceback.format_exc())
    def _perform_model0(self):
        # 获取未完成章节列表并输出
        ch_se_lt = self._g2p_chapter_section()

        if len(ch_se_lt) == 0:
            print(COLOR.OK,
                  'finish the lesson! quit! ',
                  COLOR.END,
                  file=self._out_fp)
            return
        self._out_fp.flush()

        last_time = time.time() - 120  # 答题间隔控制,减少答题验证码的弹出

        # 遍历每个未完成章节
        end_flag = 1
        for ch_se in ch_se_lt:
            if self.retry_dic[str(ch_se)] > 2:
                continue
            end_flag = 0
            self.retry_dic[str(ch_se)] += 1
            self._chapter = ch_se[0]
            self._section = ch_se[1]
            self._subsection = ch_se[2] if len(ch_se) == 3 else 0

            try:
                self._play_video()
            except:
                try:
                    send_err(traceback.format_exc())
                except:
                    pass
            # 答题间隔控制
            now_time = time.time()
            if now_time - last_time < 120:
                sleep(120 - (now_time - last_time))
            last_time = time.time()

            if self._que_server_flag == 1:
                self._go_que_task()

        if end_flag == 1:
            print(COLOR.OK,
                  'finish the lesson! quit! ',
                  COLOR.END,
                  file=self._out_fp)
            return
        #log_fp.write("err_lt:" + str(error_lt) + '\n')
        # 递归调用
        return self._perform_model0()
    def _go_que_task(self):
        try:
            err_section = self._ans_question()

            if err_section != 0:
                print(COLOR.ERR, 'unfinished!', COLOR.END, file=self._out_fp)
                self._err_lt.append(err_section)  # 记录答题提交失败的章节
            else:
                print(COLOR.OK, 'finished!', COLOR.END, file=self._out_fp)
        except:
            try:
                send_err(traceback.format_exc())
            except:
                pass
Exemple #6
0
    def _perform_model0(self):
        # 获取未完成章节列表并输出
        self._get_chapter_section()

        if len(self.ch_se_lt) == 0:
            print(COLOR.OK,
                  'finish the lesson! quit! ',
                  COLOR.END,
                  file=self._out_fp)
            return
        self._out_fp.flush()

        last_time = time.time() - 120  # 答题间隔控制,减少答题验证码的弹出

        # 遍历每个未完成章节
        end_flag = 1
        for ch_se in self.ch_se_lt:
            if self.retry_dic[str(ch_se[0])] > 2:
                continue
            end_flag = 0
            self.retry_dic[str(ch_se[0])] += 1

            print(COLOR.DISPLAY + 'now turns to ' + str(ch_se[0]) + COLOR.END,
                  file=self._out_fp)
            try:
                PM = PlayMedia(self.driver, self._out_fp)
                PM.play_media('https://mooc1-1.chaoxing.com' + ch_se[1])
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                send_err(traceback.format_exc())

            if self._que_server_flag == 1:
                # 答题间隔控制
                now_time = time.time()
                if now_time - last_time < 120:
                    sleep(120 - (now_time - last_time))
                last_time = time.time()
                self._go_que_task()

        if end_flag == 1:
            print(COLOR.OK,
                  'finish the lesson! quit! ',
                  COLOR.END,
                  file=self._out_fp)
            return
        #log_fp.write("err_lt:" + str(error_lt) + '\n')
        # 递归调用
        return self._perform_model0()
    def _perform_model2(self):
        # 获取未完成章节列表并输出
        ch_se_lt = self._g2p_chapter_section()

        chapter = eval(
            input("please select the end chapter(from unfinished list):"))
        section = eval(input("please select which section:"))
        subsection = eval(
            input("please select which subsection(if not input 0):"))

        self._out_fp.flush()
        last_time = time.time() - 150  # 答题间隔控制,减少答题验证码的弹出

        # 遍历每个未完成章节
        for ch_se in ch_se_lt:

            self._chapter = ch_se[0]
            self._section = ch_se[1]
            self._subsection = ch_se[2] if len(ch_se) == 3 else 0

            if self._chapter == chapter and self._section == section and self._subsection == subsection:
                print(COLOR.OK,
                      "OK! finish your task!",
                      COLOR.END,
                      file=self._out_fp)
                print(COLOR.DISPLAY,
                      "now check your unfinished tasks:",
                      COLOR.END,
                      file=self._out_fp)
                self._g2p_chapter_section()
                break

            try:
                self._play_video()
            except:
                try:
                    send_err(traceback.format_exc())
                except:
                    pass
            # 答题间隔控制
            now_time = time.time()
            if now_time - last_time < 150:
                sleep(150 - (now_time - last_time))
            last_time = time.time()

            if self._que_server_flag == 1:
                self._go_que_task()
Exemple #8
0
    def _perform_model2(self):
        # 获取未完成章节列表并输出
        self._get_chapter_section()

        #chapter = eval(input("please select the end chapter(from unfinished list):"))
        #section = eval(input("please select which section:"))
        #subsection = eval(input("please select which subsection(if not input 0):"))
        end_ch_se = input(
            "please input the end chapter(from unfinished list):")

        self._out_fp.flush()
        last_time = time.time() - 150  # 答题间隔控制,减少答题验证码的弹出

        # 遍历每个未完成章节
        for ch_se in self.ch_se_lt:

            if end_ch_se in ch_se[0]:
                print(COLOR.OK,
                      "OK! finish your task!",
                      COLOR.END,
                      file=self._out_fp)
                print(COLOR.DISPLAY,
                      "now check your unfinished tasks:",
                      COLOR.END,
                      file=self._out_fp)
                self._get_chapter_section()
                break

            print(COLOR.DISPLAY + 'now turns to ' + str(ch_se[0]) + COLOR.END,
                  file=self._out_fp)
            try:
                PM = PlayMedia(self.driver, self._out_fp)
                PM.play_media('https://mooc1-1.chaoxing.com' + ch_se[1])
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                send_err(traceback.format_exc())

            if self._que_server_flag == 1:
                # 答题间隔控制
                now_time = time.time()
                if now_time - last_time < 150:
                    sleep(150 - (now_time - last_time))
                last_time = time.time()
                self._go_que_task()
Exemple #9
0
    def __exit__(self, exc_type, exc_val, exc_tb):
        if SYSTEM == 0:
            os_popen('taskkill /F /T /PID ' + str(self.chrome_pid))
        else:
            pass
            # self.driver.service.process.kill()
            # os_killpg(self.chrome_pid,9)
            #os_popen('kill -9 chromium')
        '''
        try:
            self.driver.quit()
        except KeyboardInterrupt:
            self.driver.quit()      
        '''

        if exc_type in [SystemExit, KeyboardInterrupt]:
            print(COLOR.NOTE, "QUIT!", COLOR.END)
        elif exc_type != None:
            send_err(str(exc_type) + '\n' + str(exc_val) + '\n' + str(exc_tb))
            print('程序遇到错误,请分析处理:')
            print('TYPE:' + str(exc_type))
            print('VAL: ' + str(exc_val))
            print('TB:  ' + str(exc_tb))
        return True
Exemple #10
0
                              self.rate, self._sc_out_fp)
            singlecourse.work()


if __name__ == "__main__":
    if len(argv) == 1:
        #logindata = getlogindata()
        logindata = getlogindata_phone()[0:2]
        mode = 0
        rate = 1
        noans_num = 5
    else:
        logindata = (argv[1]).split(',')
        mode = int(argv[2])
        rate = eval(argv[3])
        noans_num = eval(argv[4])
    QA = QueryAns()
    QA.noans_num = noans_num
    try:
        process = Login_courses_by_request(logindata, mode, rate)
        # process = Login_courses_by_chrome(logindata,mode,rate)  #备用登录选项
        process.work()
    except SystemExit:
        print(COLOR.NOTE, "QUIT!", COLOR.END)
    except:
        try:
            print(format_exc())
            send_err(format_exc())
        except:
            print(COLOR.ERR, "ERROR! QUIT!", COLOR.END)
Exemple #11
0
    def _ans_question(self):
        # 点击章节测验
        #action_chains = ActionChains(self.driver)
        self.driver.switch_to.default_content()
        sleep(2)
        try:
            bt = self.driver.find_element_by_xpath(
                '//div[@class="left"]/div/div[@class="main"]/div[@class="tabtags"]/span[@title="章节测验"]'
            )
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            try:
                bt = self.driver.find_element_by_xpath(
                    '//div[@class="left"]/div/div[@class="main"]/div[@class="tabtags"]/span[last()]'
                )
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:  # 还可能没有标签页
                pass

        try:
            sleep(3)
            self.driver.execute_script("arguments[0].click();", bt)
            # action_chains.move_to_element(bt)
            # bt.click()
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            pass

            #print(6, end=" ")
        wait = WebDriverWait(self.driver, 30)
        try:
            # 进入答题界面
            wait.until(
                EC.presence_of_element_located((By.XPATH, '//iframe[1]')))
            iframe = self.driver.find_element_by_xpath('//iframe[1]')
            self.driver.switch_to.frame(iframe)
            print(COLOR.NOTE + ' now go to question ' + COLOR.END,
                  file=self._out_fp)
            #log_fp.write(' now go to question \n')
            #print(7, end=" ")
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            print(COLOR.NOTE,
                  ' no questions,continue~',
                  COLOR.END,
                  file=self._out_fp)  # 未找到章节测验
            #log_fp.write(' no questions,continue~\n')
            return 0

        # 多任务点处理
        for i in range(3):
            try:
                task_num = self.driver.execute_script(
                    "window.scrollTo(0,document.body.scrollHeight);return document.getElementsByClassName('ans-job-icon').length"
                )
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                sleep(1)
                # task_num = self.driver.execute_script(
                #    "return document.getElementsByClassName('ans-job-icon').length")
        try:
            self.driver.execute_script("window.scrollTo(0,0)")
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            pass
        wait.until(
            EC.presence_of_all_elements_located(
                (By.XPATH, '//div[@class="ans-cc"]')))
        for i in range(3):
            try:
                ans_cc = self.driver.find_element_by_xpath(
                    '//div[@class="ans-cc"]')
                h5_text = ans_cc.get_attribute('innerHTML')
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                sleep(1)
        task_road = PlayMedia.get_road(h5_text, task_num)  # bs4处理得到各个任务点路径

        print(COLOR.DISPLAY,
              ' there are ' + str(task_num) + ' task in this section:',
              COLOR.END,
              file=self._out_fp)
        #log_fp.write(' there are ' + str(task_num) + ' task in this section:\n')

        first_road = '//div[@class="ans-cc"]'
        for v_num in range(1, task_num + 1):
            print(COLOR.DISPLAY,
                  ' go ' + str(v_num) + ':',
                  COLOR.END,
                  file=self._out_fp)
            #log_fp.write(' go ' + str(v_num) + ':\n')
            sleep(2)
            try:  # 查看是否有任务点标识并查看是或否已经完成该任务点
                #flag = self.driver.find_element_by_xpath('//div[@class="ans-cc"]/p['+str(p_index[v_num-1])+']/div')
                # print(first_road+video_road[v_num-1])
                flag = self.driver.find_element_by_xpath(first_road +
                                                         task_road[v_num - 1])
                self.driver.execute_script("arguments[0].scrollIntoView();",
                                           flag)

                #icon_flag = 1
                nowflag = flag.get_attribute('class')
                #print(nowflag, end=" ")
                if 'finished' in nowflag:
                    print(COLOR.OK +
                          ' Well! the task is already finished! continue~' +
                          COLOR.END,
                          file=self._out_fp)
                    #log_fp.write(' Well! the task is already finished! continue~' + '\n')
                    continue
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                pass
                # icon_flag = 0  # 有的无任务点标识

            try:
                wait.until(
                    EC.presence_of_element_located(
                        (By.XPATH,
                         first_road + task_road[v_num - 1] + '/iframe[1]')))
                iframe = self.driver.find_element_by_xpath(first_road +
                                                           task_road[v_num -
                                                                     1] +
                                                           '/iframe[1]')
                self.driver.switch_to.frame(iframe)
                wait.until(
                    EC.presence_of_element_located((By.XPATH, '//iframe[1]')))
                iframe = self.driver.find_element_by_xpath('//iframe[1]')
                self.driver.switch_to.frame(iframe)
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                print(COLOR.NOTE,
                      ' no questions,continue~',
                      COLOR.END,
                      file=self._out_fp)  # 未找到章节测验
                #log_fp.write(' no questions,continue~\n')
                self.driver.switch_to.default_content()
                wait.until(
                    EC.presence_of_element_located((By.XPATH, '//iframe[1]')))
                iframe = self.driver.find_element_by_xpath('//iframe[1]')
                self.driver.switch_to.frame(iframe)
                continue
                # print(self.driver.page_source)
            sleep(3)

            # 查询并获取答案
            data = {
                'courseId': '',
                'classId': '',
                # 'oldWorkId': '',
                # 'workRelationId': ''
            }
            try:
                for key in data.keys():
                    data[key] = self.driver.execute_script(
                        'return document.getElementById(arguments[0]).value',
                        key)
                    sleep(0.1)
                self.courseID = data['courseId'] + ' ' + data['classId']
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                self.courseID = ""
            QA = QueryAns(self.driver.page_source,
                          course=self.course_name,
                          courseID=self.courseID)
            ans_flag, ans_lt = QA.work()
            # print(ans_flag)
            # print(ans_lt)
            # sleep(20)

            # print(ans_lt)
            # 开始答题
            # //*[@id="ZyBottom"]/div/div[1]/div
            # //*[@id="ZyBottom"]/div/div[2]/ul/li[1]/label/input
            # //*[@id="ZyBottom"]/div/div[2]/ul/li[2]/label/input
            # //*[@id="ZyBottom"]/div/div[4]/div[2]/ul/li[1]/label/input
            # //*[@id="ZyBottom"]/div/div[4]/div[4]/div[2]/ul/li[1]/label/input
            # //*[@id="ZyBottom"]/div/div[4]/div[4]/div[4]/div[2]/div/ul/li[1]/label/input
            try:
                for i in range(0, len(ans_lt)):
                    for j in range(0, len(ans_lt[i])):
                        if ans_lt[i][j] == 0:
                            continue
                        try:
                            # print(i,j,ans_lt[i][j])
                            radio = self.driver.find_element_by_xpath(
                                '//*[@id="ZyBottom"]/div' + '/div[4]' * i +
                                '/div[2]/ul/li[' + str(ans_lt[i][j]) +
                                ']/label/input')
                        except KeyboardInterrupt:
                            raise KeyboardInterrupt
                        except:
                            radio = self.driver.find_element_by_xpath(
                                '//*[@id="ZyBottom"]/div' + '/div[4]' * i +
                                '/div[2]/div/ul/li[' + str(ans_lt[i][j]) +
                                ']/label/input')
                        self.driver.execute_script(
                            "arguments[0].scrollIntoView();arguments[0].click();",
                            radio)
                        # action_chains.move_to_element(radio)
                        # radio.click()
                        sleep(1)
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                #print('==========', file=self._out_fp)
                #print(traceback.format_exc(), file=self._out_fp)
                print(COLOR.ERR, "  答题失败!", COLOR.END, file=self._out_fp)
                #log_fp.write("  答题失败!" + '\n')
                sleep(5)
                return 1
                #str(self._chapter) + '-' + str(self._section)

            # 点击提交并确定,检测验证码
            # //*[@id="tempsave"]
            # //*[@id="ZyBottom"]/div/div[4]/div[4]/div[4]/div[5]/a[1]
            # //*[@id="ZyBottom"]/div/div[4]/div[4]/div[4]/div[5]/a[2]
            # //*[@id="ZyBottom"]/div/div[4]/div[4]/div[4]/div[4]/div[5]/a[2]
            # //*[@id="ZyBottom"]/div[2]/a[2]/span
            try:
                bn = self.driver.find_element_by_xpath(
                    '//*[@id="ZyBottom"]/div' + '/div[4]' * (len(ans_lt) - 2) +
                    '/div[5]/a[' + str(ans_flag) + ']')  # 多个题目
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                bn = self.driver.find_element_by_xpath(
                    '//*[@id="ZyBottom"]/div[2]/a[' + str(ans_flag) +
                    ']')  # 只有一个题
            # action_chains.move_to_element(bn)
            # bn.click()
            self.driver.execute_script(
                "arguments[0].scrollIntoView();arguments[0].click();", bn)
            sleep(1)

            try:  # 提交验证码
                self.driver.switch_to.default_content()
                while 1:
                    img = self.driver.find_element_by_id('imgVerCode')
                    img.screenshot('ans_vercode.png')
                    if SYSTEM == 0:
                        img = Image.open('ans_vercode.png')
                        img.show()
                    else:
                        p = Popen(['./src/viu', 'ans_vercode.png'])
                        p.communicate()
                        sleep(1.5)
                    numVerCode = input(COLOR.NOTE +
                                       "  please input the ans_vercode:" +
                                       COLOR.END,
                                       file=self._out_fp)
                    #log_fp.write('  input the ans_vercode\n')
                    # self.driver.find_element_by_id('code').send_keys(numVerCode)
                    self.driver.find_element_by_xpath(
                        '//input[@id="code"]').send_keys(numVerCode)
                    self.driver.find_element_by_xpath('//a[@id="sub"]').click()
                    sleep(1)
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                wait.until(
                    EC.presence_of_element_located((By.XPATH, '//iframe[1]')))
                iframe = self.driver.find_element_by_xpath('//iframe[1]')
                self.driver.switch_to.frame(iframe)
                wait.until(
                    EC.presence_of_element_located(
                        (By.XPATH,
                         first_road + task_road[v_num - 1] + '/iframe[1]')))
                iframe = self.driver.find_element_by_xpath(first_road +
                                                           task_road[v_num -
                                                                     1] +
                                                           '/iframe[1]')
                self.driver.switch_to.frame(iframe)
                wait.until(
                    EC.presence_of_element_located((By.XPATH, '//iframe[1]')))
                iframe = self.driver.find_element_by_xpath('//iframe[1]')
                self.driver.switch_to.frame(iframe)

            # //*[@id="confirmSubWin"]/div/div/a[1]
            wait.until(
                EC.presence_of_element_located(
                    (By.XPATH, '//*[@id="confirmSubWin"]/div/div/a[1]')))
            bn = self.driver.find_element_by_xpath(
                '//*[@id="confirmSubWin"]/div/div/a[1]')
            # action_chains.move_to_element(bn)
            try:
                # bn.click()
                self.driver.execute_script("arguments[0].click();", bn)
                print(COLOR.OK,
                      'questions of the section is finished! continue~',
                      COLOR.END,
                      file=self._out_fp)
                #log_fp.write(' finish the questions ' + '\n')
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                #print('=======', file=self._out_fp)
                #print(traceback.format_exc(), file=self._out_fp)
                send_err(traceback.format_exc())
                print(COLOR.ERR, "  提交失败!", COLOR.END, file=self._out_fp)
                return 1
            self.driver.switch_to.parent_frame()
            self.driver.switch_to.parent_frame()
            sleep(5)
        # self.driver.switch_to_alert().accept()
        # if(len(err_lt)==0):
        return 0
Exemple #12
0
    def play_media(self,url):
        wait = WebDriverWait(self.driver, 30)
        action_chains = ActionChains(self.driver)

        self.driver.get(url)
        # 点击视频确保进入视频界面(若出现问题增多可以改换bs4或者re分析)
        media_tag = ['@title="视频"', '@title="视频 "', '@title="微课"', 'last()-1']
        try:
            wait.until(EC.presence_of_element_located(
                (By.XPATH, '//div[@class="left"]/div/div[@class="main"]/div[@class="tabtags"]')))
            for tag in media_tag:
                try:
                    bt = self.driver.find_element_by_xpath(
                        '//div[@class="left"]/div/div[@class="main"]/div[@class="tabtags"]/span['+tag+']')
                    break
                except KeyboardInterrupt:
                    raise KeyboardInterrupt
                except:
                    pass
            sleep(5)
            self.driver.execute_script("arguments[0].scrollIntoView();arguments[0].click();", bt)
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            pass
        
        try:
            wait.until(EC.presence_of_element_located((By.XPATH,'//div[@class="switchbtn"]')))
            switch_btn=self.driver.find_element_by_xpath('//div[@class="switchbtn"]')
            action_chains.move_to_element(switch_btn)
            switch_btn.click()
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            pass

        try:
            wait.until(EC.presence_of_element_located((By.XPATH, '//iframe')))
            iframe = self.driver.find_element_by_xpath('//iframe')
            self.driver.switch_to.frame(iframe)
            sleep(1)
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            print(COLOR.NOTE, ' no videos,continue~', COLOR.END, file=self._out_fp)
            #log_fp.write(' no videos,continue~\n')
            return

        # 多视频处理
        try:
            video_num = self.driver.execute_script(
                "window.scrollTo(0,document.body.scrollHeight);return document.getElementsByClassName('ans-job-icon').length")
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            video_num = self.driver.execute_script(
                "return document.getElementsByClassName('ans-job-icon').length")
        try:
            self.driver.execute_script("window.scrollTo(0,0)")
        except KeyboardInterrupt:
            raise KeyboardInterrupt
        except:
            pass

        wait.until(EC.presence_of_all_elements_located((By.XPATH, '//div[@class="ans-cc"]')))
        ans_cc = self.driver.find_element_by_xpath('//div[@class="ans-cc"]')
        for i in range(3):
            try:
                h5_text = ans_cc.get_attribute('innerHTML')
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                sleep(1)
        video_road = PlayMedia.get_road(h5_text, video_num)  # bs4处理得到各个视频路径

        print(COLOR.DISPLAY, ' there are ' + str(video_num) + ' media in this section:', COLOR.END, file=self._out_fp)
        #log_fp.write(' there are ' + str(video_num) + ' videos in this section:\n')

        # 开始播放所有视频
        first_road = '//div[@class="ans-cc"]'

        for v_num in range(1, video_num + 1):
            # log
            #self.driver.refresh()
            self.driver.switch_to.default_content()
            for i in range(5):
                try:
                    wait.until(EC.presence_of_element_located((By.XPATH, '//iframe')))
                    iframe = self.driver.find_element_by_xpath('//iframe')
                    self.driver.switch_to.frame(iframe)
                    break
                except KeyboardInterrupt:
                    raise KeyboardInterrupt
                except:
                    sleep(i+0.5)

            print(COLOR.DISPLAY, ' go ' + str(v_num) + ':', COLOR.END, file=self._out_fp)
            #log_fp.write(' go ' + str(v_num) + ':\n')
            # 拖动滚动条
            #self.driver.execute_script("window.scrollTo(0,arguments[0])", 400 + 700 * (v_num - 1))
            sleep(2)

            goal_road = first_road + video_road[v_num - 1]
            # 查看是否有任务点标识并查看是或否已经完成该任务点
            try:
                flag = self.driver.find_element_by_xpath(goal_road)
                self.driver.execute_script(
                    '''var goal=document.evaluate(arguments[0],document).iterateNext();goal.scrollIntoView();''', goal_road)
                sleep(5)
                icon_flag = 1
                nowflag = flag.get_attribute('class')
                if 'finished' in nowflag:
                    print(COLOR.OK + ' Well! the video is already finished! continue~' + COLOR.END, file=self._out_fp)
                    #log_fp.write(' Well! the video is already finished! continue~' + '\n')
                    self._end = 0
                    # 如果视频任务已完成,访问下一个视频
                    continue
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                #print(traceback.format_exc())
                icon_flag = 0

            #print(1)
            # try:
            iframe_flag = 0
            for i in range(10):
                try:
                    wait.until(EC.presence_of_element_located((By.XPATH, goal_road + '/iframe')))
                    iframe = self.driver.find_element_by_xpath(goal_road + '/iframe')
                    self.driver.switch_to.frame(iframe)
                    iframe_flag = 1
                    sleep(2)
                    break
                except KeyboardInterrupt:
                    raise KeyboardInterrupt
                except:
                    #print(traceback.format_exc())
                    # log
                    sleep(i+1)
            if iframe_flag == 0:
                print(COLOR.ERR+"  can't into the video,continue"+COLOR.END, file=self._out_fp)
                continue

            #print(2)

            try:
                ppt_num = eval(self.driver.execute_script("return document.getElementsByClassName('all')[0].innerText"))
                for i in range(0, ppt_num):
                    self.driver.execute_script("document.getElementsByClassName('mkeRbtn')[0].click()")
                    sleep(1)
                continue
            except KeyboardInterrupt:
                raise KeyboardInterrupt
            except:
                pass

            #print(2.5)

            # 通过js代码开始视频播放
            play_ok = 0
            for i in range(3):
                try:
                    self.driver.execute_script(
                        """
                        var video=document.querySelector('video');video.scrollIntoView();video.play();
                        video.onmouseout=function(){return false;}
                        """)
                    play_ok = 1
                    sleep(2)
                    self.driver.execute_script("document.querySelector('video').autoplay=true;")
                    self.driver.execute_script("document.querySelector('video').play();")
                    self.driver.execute_script(
                        "document.querySelector('video').playbackRate=arguments[0];document.querySelector('video').defaultPlaybackRate=arguments[0]", PlayMedia.rate)
                    sleep(1)
                    #self.driver.execute_script("document.querySelector('video').load();")
                    break
                except KeyboardInterrupt:
                    raise KeyboardInterrupt
                except:
                    #print(format_exc())
                    send_err(format_exc())
                    sleep(i+1)
            #print(3)

            audio = 0
            if play_ok == 0:
                for i in range(3):
                    try:
                        self.driver.execute_script(
                            "var audio=document.querySelector('audio');audio.scrollIntoView();audio.play();audio.onmouseout=function(){return false;}")
                        play_ok = 1
                        audio = 1
                        self.driver.execute_script("document.querySelector('audio').autoplay=true;")
                        self.driver.execute_script(
                            "document.querySelector('audio').playbackRate=arguments[0];document.querySelector('audio').defaultPlaybackRate=arguments[0]", PlayMedia.rate)
                        #self.driver.execute_script("document.querySelector('audio').load();")
                        break
                    except KeyboardInterrupt:
                        raise KeyboardInterrupt
                    except:
                        sleep(i+1)
            if audio == 1:
                media_type = 'audio'
            else:
                media_type = 'video'

            #print(media_type)

            if play_ok == 0:
                # 未播放成功
                self.driver.switch_to.parent_frame()
                print(COLOR.DISPLAY+' this is not a media, go ahead!'+COLOR.END, file=self._out_fp)
                #log_fp.write(" this is not a video, go ahead!\n")
                continue
            else:
                # 开倍速 & 获取时间信息
                sleep(2)
                for i in range(5):
                    total_tm = self.driver.execute_script(
                        "return document.querySelector(arguments[0]).duration", media_type)
                    #print(total_tm)
                    now_tm = self.driver.execute_script(
                        "return document.querySelector(arguments[0]).currentTime", media_type)
                    #print(now_tm)
                    self.driver.execute_script("document.querySelector(arguments[0]).play();", media_type)
                    if total_tm != None and now_tm != None:
                        break
                    else:
                        sleep(i+1)
                total_tm = int(total_tm)
                now_tm = int(now_tm)
                need_tm = total_tm-now_tm
                print("   now_tm:", now_tm, '\t', "total_tm:", total_tm, '\t', "need_tm:", need_tm, file=self._out_fp)

            #print(4)

            real_time = 0
            while 1:
                real_time += 10
                try:
                    now_tm = self.driver.execute_script(
                        "return document.querySelector(arguments[0]).currentTime", media_type)
                    need_tm = total_tm-int(now_tm)
                    self.driver.execute_script("document.querySelector(arguments[0]).play();", media_type)
                except KeyboardInterrupt:
                    raise KeyboardInterrupt
                except:
                    pass
                # 交互
                progress = (total_tm-need_tm)*100/total_tm
                print(COLOR.OK+"   progress:{0:.2f}%\trest:{1}         ".format(progress,
                                                                                need_tm)+COLOR.END, file=self._out_fp, end="\r")
                self._out_fp.flush()

                # 剩余时间<5min则间隔性检验任务是否已完成
                if (icon_flag == 1 and need_tm <= 300):
                    self.driver.switch_to.parent_frame()
                    flag = self.driver.find_element_by_xpath(goal_road)
                    nowflag = flag.get_attribute('class')
                    self.driver.switch_to.frame(self.driver.find_element_by_xpath(goal_road + '/iframe'))
                    if 'finished' in nowflag:
                        print(COLOR.OK, ' Well!the video is finished ahead of time! continue~', COLOR.END, file=self._out_fp)
                        #log_fp.write(' Well!the video is finished ahead of time! continue~' + '\n')
                        sleep(10)
                        break

                if need_tm <= 2 or real_time > (total_tm+100):
                    print(COLOR.OK, ' Well!the video is finished! continue~', COLOR.END, file=self._out_fp)
                    #log_fp.write(' Well!the video is finished! continue~' + '\n')
                    sleep(10)
                    break

                # 自动检测答题
                pre = 1  # 选项默认值
                try:
                    uls = self.driver.find_element_by_xpath(
                        '//div[@class="x-container ans-timelineobjects x-container-default"]/span/div/div/ul')
                    que_type = self.driver.find_element_by_xpath(
                        '//div[@class="ans-videoquiz-title"]').get_attribute('textContent')
                    #log_fp.write('que_type:' + que_type + '\n')
                    que_type = re_search(r'[[]([\w\W]+?)[]]', que_type).group(1)
                    #log_fp.write('      monitor question,' + que_type + '\n')
                    if "多选题" in que_type:
                        # print(uls.find_elements_by_xpath('//li[@class="ans-videoquiz-opt"]'))
                        opt_num = len(uls.find_elements_by_xpath('//li[@class="ans-videoquiz-opt"]'))  # 选项个数
                        #print(opt_num,file=self._out_fp)
                        for opt_i in range(2, opt_num + 1):  # 选择个数2,3,4,……
                            fin_que = 1
                            for opt_j in range(1, opt_num - opt_i + 2):  # 起始位置
                                #print('      select:',file=self._out_fp)
                                for opt_k in range(0, opt_i):  # 个数
                                    option = uls.find_element_by_xpath('//li[' + str(opt_j + opt_k) + ']/label/input')
                                    self.driver.execute_script("arguments[0].click();", option)
                                sleep(5)
                                bn = self.driver.find_element_by_xpath(
                                    '//div[@class="x-container ans-timelineobjects x-container-default"]/span/div/div/div[2]')
                                self.driver.execute_script("arguments[0].click();", bn)
                                try:
                                    self.driver.switch_to_alert().accept()
                                except:
                                    fin_que = 0
                                    break
                                try:
                                    while 1:  # 多选题答错会弹出不止一个alert
                                        self.driver.switch_to_alert().accept()
                                except:
                                    sleep(0.5)

                                for opt_k in range(0, opt_i):  # 个数
                                    option = uls.find_element_by_xpath('//li[' + str(opt_j + opt_k) + ']/label/input')
                                    self.driver.execute_script("arguments[0].click();", option)
                                sleep(5)
                                bn = self.driver.find_element_by_xpath(
                                    '//div[@class="x-container ans-timelineobjects x-container-default"]/span/div/div/div[2]')
                                self.driver.execute_script("arguments[0].click();", bn)
                                try:
                                    while 1:  # 多选题答错会弹出不止一个alert
                                        self.driver.switch_to_alert().accept()
                                except:
                                    sleep(0.5)
                                sleep(0.5)

                            if fin_que == 0:
                                break
                        #log_fp.write('      solve the question\n')
                        sleep(10)
                    else:
                        while 1:
                            try:
                                option = uls.find_element_by_xpath('//li[' + str(pre) + ']/label/input')
                                self.driver.execute_script("arguments[0].click();", option)
                                # action_chains.move_to_element(option)
                                # option.click()
                                #log_fp.write('      select ' + chr(pre + 64) + '\n')
                                bn = self.driver.find_element_by_xpath(
                                    '//div[@class="x-container ans-timelineobjects x-container-default"]/span/div/div/div[2]')
                                self.driver.execute_script("arguments[0].click();", bn)
                                # action_chains.move_to_element(bn)
                                # bn.click()
                                # action_chains.click(bn)
                                try:
                                    while 1:
                                        self.driver.switch_to_alert().accept()
                                except KeyboardInterrupt:
                                    raise KeyboardInterrupt
                                except:
                                    sleep(0.3)
                                    pre += 1
                            except KeyboardInterrupt:
                                raise KeyboardInterrupt
                            except:
                                #log_fp.write('      solve the question\n')
                                sleep(10)
                                break
                except KeyboardInterrupt:
                    raise KeyboardInterrupt
                except:  # 10s延时
                    sleep(10)

            print(COLOR.OK+' finish the video                     '+COLOR.END, file=self._out_fp)