关于某某进修网站的Python脚本selenium的学习使用

初学者,花费一两天时间写的某个进修网站自动学习的脚本,此脚本只针对专门网站,并不能用于其他网站使用
selenium库提供的很多查找方式,程序内并没有全部用到,程序执行效率并不高,但好在能代替人工。
如有可优化,可提高执行效率的方式,还请留言交流

#引入库
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
import time

获取用户信息
username = input('请输入账号:')

psw = input('请输入密码:')
# 创建浏览器对象
driver = webdriver.Chrome()
driver.implicitly_wait(5)

# 访问网站
driver.get("http://XXXXXXXXXXX")
# 输入账号
driver.find_element_by_class_name('userName_input').send_keys(username)
# 输入密码
driver.find_element_by_class_name('userPwd_input').send_keys(psw)
# 点击登录
driver.find_element_by_class_name('subBtn').click()
time.sleep(3)
# 设置单页显示课程数量
select = Select(driver.find_element_by_xpath('//*[@lay-ignore]'))
select.select_by_visible_text("90 条/页")
driver.maximize_window()
tit = 1
tn = 0
# 找出标题及数量
try:
while tit:
titlen = driver.find_element_by_xpath('//*[@id="Ability"]/div[1]/ul/li[%d]' % tit)
print(titlen.text)
tn += 1
tit += 1
except NoSuchElementException as t:
print(tn)


# 判断是否找到提示框对象函数
def is_element_present():
try:
element = driver.find_element_by_class_name('layui-layer-title')
if element.text == '信息':
return 1
except NoSuchElementException as e:
return False


# 列出学习目录及是否已完成
def lastnum():
for l in lastn:
print(l.get_attribute('data-index'))
nowlen = int(l.get_attribute('data-index'))

nums = driver.find_elements_by_tag_name('td')

a = 1 + nowlen * 5
lernd = nums[a + 1].text
needlen = nums[a + 2].text
print(nums[a + 1].text, nums[a + 2].text)
if lernd == needlen:
print('第' + str(nowlen + 1) + '课' + nums[a - 1].text + '已完成\n')

elif int(lernd) < int(needlen):
print('第' + str(nowlen + 1) + '课' + nums[a - 1].text + '未完成\n')
print(nums[a + 3].text)
# nums[a + 3].click()
nums[a + 3].find_element_by_link_text('去学习').click()
b = int(nums[a + 2].text)
return b


# break


def answer():
problem = driver.find_element_by_xpath('//*[@class="layui-layer-title"]')
prn = problem.text
num1 = int(prn[4])
print(num1)
num2 = int(prn[6])
print(num2)
vs = prn[5]
if vs == '+':
ans = num1 + num2
print(ans)
return ans
elif vs == '-':
ans = num1 - num2
return ans


# 尝试寻找播放按钮及已完成提示
def tryplay(xp):
try:
if xp == '//*[@class="layui-layer-content"]':
completed = driver.find_element_by_xpath(xp)
if completed.text == '当前课程学习环节已达到最高时间要求不再计分':
print('已完成本课学习')
driver.find_element_by_class_name('layui-layer-btn0').click()
return 2
elif xp == '//*[@class="layui-layer-title"]':
summ = driver.find_element_by_xpath(xp)
if '请回答' in summ.text:
driver.find_element_by_xpath('//*[@class ="layui-input"]').send_keys(str(answer()))
driver.find_element_by_class_name('layui-layer-btn0').click()
return 3
elif xp == '//*[@class="prism-big-play-btn pause"]':
element = driver.find_element_by_xpath(xp)
if element:
print('重新播放')
try:
element.click()
except NoSuchElementException as a:
return 1
finally:
return 1

except NoSuchElementException as e:
print('播放中')
return 4
# elif xpcont in e:
# print('未完成观看任务')
# return 4


while tn:
titneedlen = driver.find_element_by_xpath('//*[@id="Ability"]/div[1]/ul/li[%d]' % tn)
titneedlen.click()
select = Select(driver.find_element_by_xpath('//*[@lay-ignore]'))
select.select_by_visible_text("90 条/页")
# select.select_by_value("90")
# 查找学习目录
time.sleep(1)
lastn = driver.find_elements_by_xpath('//*[@id="Ability"]/div[2]/div[1]/div[2]/table/tbody/tr')


# 获取所需学习时间
las=lastnum()
if las!=None:
needlernum = int(las)
else:
needlernum=500
hadetime = 0
# 记录主页句柄
mainwin = driver.current_window_handle
# 打印主页句柄及标题
print(mainwin)
print(driver.title)
if needlernum != 500:
# 切换窗口
for handle in driver.window_handles:
# 先切换到该窗口
driver.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if '线上研修' in driver.title:
print(driver.title)
# 如果是,那么这时候WebDriver对象就是对应的该该窗口,正好,跳出循环,
break

# 调用判断函数,判断是否找到对象,并处理提示框
time.sleep(2)
if is_element_present() == 1:
print('有信息提示框')
driver.find_element_by_class_name('layui-layer-btn1').click()
driver.find_element_by_class_name('prism-play-btn').click()
else:
print('无提示框')
if driver.find_element_by_xpath('//*[@class="layui-icon layui-icon-video"][1]'):
iti=driver.find_element_by_xpath('//*[@class="layui-icon layui-icon-video"][1]')
print(iti.text)
try:
driver.find_element_by_xpath('//*[@class="layui-icon layui-icon-video"][1]').click()
print('开始播放')
except :
driver.find_element_by_xpath('//dd[2]').click()
driver.find_element_by_xpath('//*[@class="layui-icon layui-icon-video"][1]').click()
print('找到视频并开始播放')

if is_element_present() == 1:
print('有信息提示框')
driver.find_element_by_class_name('layui-layer-btn1').click()
driver.find_element_by_class_name('prism-play-btn').click()
else:
driver.find_element_by_class_name('prism-play-btn').click()

while hadetime <= needlernum:
# 获取已学习时常
timeed = driver.find_element_by_class_name('time').text
print(timeed)
if len(timeed) == 10:

hadetime = int(timeed[7])
elif len(timeed) == 11:

hadetime = int(timeed[7:9])
elif len(timeed) == 12:

hadetime = int(timeed[7:10])
print('--------------')
print('需观看' + str(needlernum))
print('--------------')
print('已观看' + str(hadetime))
time.sleep(3)
xpc = tryplay('//*[@class="layui-layer-content"]')
time.sleep(3)
xpd = tryplay('//*[@class="layui-layer-title"]')
time.sleep(3)
xpb = tryplay('//*[@class="prism-big-play-btn pause"]')
time.sleep(3)
if xpb == 1:
print('重新开始播放' + '已观看' + str(hadetime) + '分钟')
elif xpc == 2:
driver.close()
driver.switch_to.window(mainwin)
driver.refresh()
time.sleep(3)
break
else:
print('已观看' + str(hadetime) + '分钟')
pass
else:
print('已完成全部学习')
tn -= 1
if tn==0:
break
posted @ 2021-04-25 11:22  哈喽悟噢德  阅读(150)  评论(0)    收藏  举报