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)+'\n')
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)