from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from selenium.common.exceptions import NoSuchElementException,StaleElementReferenceException,ElementNotVisibleException,TimeoutException,WebDriverException import time import os import sys import re from datetime import date def BeforeEndDate(): endate=date(SetYear,SetMonth,SetDay) stdate=date.today() isReg=(stdate<=endate) if isReg: print("程序有效期至:"+str(endate)+' ') return True else: try: print("程序过期!") #os._exit(0) return False except: return False def SaveAnswer(txtlist): f=open(dbPath,'a+') print(txtlist) f.writelines(txtlist) f.close() def GetListFrom(txtPath): txtlist=[] with open(txtPath,'r',encoding = 'utf-8') as file_object: lines=set(file_object.readlines()) for index,line in enumerate(lines): oneline=line.strip() txtlist.append(oneline) return txtlist def JoinFolderpath(filepath):#获取文件释放路径 try: base_path = sys._MEIPASS except: base_path=os.path.abspath('.') fp=os.path.join(base_path, filepath) return fp def GetQnaDic(): dic={} fp=JoinFolderpath(eaxmPath) txtlist=GetListFrom(fp) for oneline in txtlist: if "=" in oneline: que=oneline.split('=')[0] an=oneline.split('=')[1] dic[que]=an return dic def EmKeytext(xpath,txt=""): if EmPresence(xpath): em=dr.find_element_by_xpath(xpath) em.clear() em.send_keys(txt) return True else: return False def EmPresence(xpath,duration=10,msg=""): wait=WebDriverWait(dr,duration) locator=(By.XPATH,xpath) try: em=wait.until(EC.visibility_of_element_located(locator)) return True except: return False def EmLenth(xpath): try: ems=dr.find_elements_by_xpath(xpath) return len(ems) except: return 0 def ClickEm(xpath,index=0,scroll=False,sleeptime=10,btnCaption="按钮"): try: btn=dr.find_elements_by_xpath(xpath)[index] print('定位'+btnCaption+str(index+1)+'成功') if scroll==True: try: dr.execute_script("return arguments[0].scrollIntoView();",btn) time.sleep(1) print('滚屏到【'+btnCaption+str(index+1)+'】成功') except: print('滚屏到【'+btnCaption+str(index+1)+'】失败') try: dr.execute_script("arguments[0].click();",btn) print('单击【'+btnCaption+'】['+str(index+1)+']成功') time.sleep(sleeptime) return True except: print('单击【'+btnCaption+str(index+1)+'】失败') return False except: print('定位'+btnCaption+str(index+1)+'失败') return False def Login(): u_xpath='//input[@id=""]' if EmKeytext(u_xpath,USER): print('输入用户名') p_xpath='//input[@id=""]' if EmKeytext(p_xpath,PSWD): print('输入密码') v_xpath='//input[@id=""]' if EmKeytext(v_xpath): print('清空验证码') f_xpath='//"]' print('请在20秒内输入验证码并登陆') if EmPresence(f_xpath,20): print('登陆成功') return True print('登陆失败') return False def SwithNewPage(): handles=dr.window_handles newPage=dr.window_handles[len(handles)-1] try: dr.switch_to_window(newPage) print('切换窗口成功') return True except: print('切换窗口失败') return False #装饰器 用于装饰:需要打开新窗口并返回原窗口的函数 def SwithTab(study): def inner(mainHandle): print('do something before function '+study.__name__) SwithNewPage() time.sleep(3) print("装饰器内 执行函数: "+study.__name__) study(mainHandle) print('do some thing after function '+study.__name__) if dr.current_window_handle!=mainHandle: dr.close() time.sleep(2) SwithNewPage() dr.refresh() time.sleep(3) return inner def WatchVideo(secHandle): xpath='//td[contains(text(),"要求学习时长")]' if EmPresence(xpath,20): xpath='//span[starts-with(@class,"") and not(text()="")]' undoCount=EmLenth(xpath) while undoCount>0: ClickEm(xpath=xpath,index=0,scroll=False,sleeptime=3,btnCaption="观看第一个视频") xpath='//div[@class="prism-big-play-btn"] ClickEm(xpath=xpath,index=0,scroll=False,sleeptime=3,btnCaption="播放大按钮") counter=0 while CheckVideo()==False: counter=counter+1 if counter==600: break time.sleep(5) undoCount=EmLenth(xpath) def CheckVideo():#针对观看视频过程中出现的问题进行处理 isdone=False try: xpath='//span/span[text()="已完成"]' pre=EmPresence(xpath) if pre: return True except: return False def LoopStudyVideo():#进入课程,循环所有课程,观看视频 xpath='//td[@class="mycourse-row-operate"]/a[contains(text(),"进入课程") or contains(text(),"开始学习")]' courseCount=EmLenth(xpath) mainHandle=dr.current_window_handle #保留窗口句柄 for x in range(courseCount): ClickEm(xpath=xpath,index=x,scroll=False,sleeptime=3,btnCaption="进入课程 或 开始学习")#此处注意,观看视频index需要递增,因为还为考试仍然显示可学 StudyVideo(mainHandle) def LoopHomework(): xpath='//td[@class="mycourse-row-operate"]/a[contains(text(),"") or contains(text(),"")]' courseCount=EmLenth(xpath) mainHandle=dr.current_window_handle #保留窗口句柄 for x in range(courseCount): ClickEm(xpath=xpath,index=0,scroll=False,sleeptime=3,btnCaption="进入课程 或 开始学习")#此处注意INdex一直是0 ,因为测试结束后返回,课程已经完成。index发生了变化 #TryHomework(mainHandle) FinishHomework(mainHandle) @SwithTab def StudyVideo(mainHandle): xpath='//a[@class="course-intro-btn course-intro-footer-btn button-enable" and contains(text(),"")]' duration=10 if EmPresence(xpath): xpath='//li/a/span[contains(text(),"未")]' undoneCount=EmLenth(xpath) if undoneCount==0: print('当前视频已经完成所有视频的观看!') else: if ClickEm(xpath=xpath,index=0,scroll=False,sleeptime=3,btnCaption="继续学习"): WatchVideo(secHandle)