在安徽信息工程学院,每名学子都需要刷一个fif课堂,这个很麻烦,于是我就写了一个代码
以上代码需要安装驱动,修改你的账户和账户密码(对于纯小白来说,这确实有点难度,不过你可以联系我,我会慢慢想你解释)
#测试框架:先获取题目,判断题目类型,写入文本,再向chatgpt请求,把答案填到测试页,再向文本/写下答案
#派生框架:先获取题目,直接读取文本,获取答案
#测试框架
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.common.by import By
import time
def pre_works():
print("即将开始,请按提示步骤完成刷题\n")
print("本王比较懒,只写了edge的兼容,若edge请立即下载,并登录到刷题界面")
wd=webdriver.Edge(service=Service(r'D:\python\edgedriver_win64')) #等待安装:(注意,每个人的驱动不同)
print("请完整复制开始刷题的路径\n")
print("建议路径:https://www.fifedu.com/iplat/fifLogin/index.html?v=5.2.2\n")
moocurl=input()
wd.get(moocurl)
print("请在60秒内完成你的账号和密码输入\n")
print("请输入你的账户")
account="aiit账号写这里"
print("请输入你的密码")
password="密码写这里"
accountinput=wd.find_element(By.XPATH,"//*[@id='userName']")
accountinput.send_keys(account)
passwordinput=wd.find_element(By.XPATH,"//*[@id='passWord']")
passwordinput.send_keys(password)
login=wd.find_element(By.XPATH,"//*[@id='userLogin']/div[1]/div/div[2]/div[3]/div[2]/button")
time.sleep(1)
login.click()
print("请立刻转到视频界面\n")
print("当前页面的全部应用,找到fif在线课程\n")
time.sleep(80)
before=wd.current_window_handle
print("窗口为:",before,"\n")
all_windows=wd.window_handles
target_window=None
for window in all_windows:
wd.switch_to.window(window)
if "练习题-学生答题" in wd.title:
target_window=window
break
if target_window is not None:
wd.switch_to.window(target_window)
now=wd.current_window_handle
print("窗口为:", now)
while True:
time.sleep(5)
video_element=wd.find_element(By.XPATH, "/html/body/div[2]/div[2]/div[1]/div/div/video")
while not video_element.is_displayed():
pass
#上一段代码指的是目标元素没有完全展示就一直等待
while True:
is_ended = video_element.get_attribute('ended')
if is_ended:
wd.find_element(By.XPATH, "/html/body/div[2]/div[1]/div[2]/button[2]").click()
break
#死循环,如果视频放到最后,那么就点击下一页
wd.quit()
if __name__=='__main__':
pre_works()
本篇代码看着还不是很好,毕竟我写c和c++写的更多,而且很多代码并不是用的很好,比如说延时,我用的是time.sleep。
selenium注意:在这里记录一下报错日志:find_element(By.XPATH, 'xpath')这是新版的写法,老版会报错。然后就是选择到视频是否到了结尾,可以这是这个video标签的属性,所以说要get_attribute('ended'),来实现,这个报错我找了好久,我的js基础确实不是很好,往后还得多练练
结束:感觉我代码的方法还是太冗长,以后还要多看看大佬们的好代码,共勉!