用python+selenium实现一步到达学者网的作业

正常情况下进入学者网作业界面的步骤:

1浏览器

2点击学者网(已收藏)

3输入账号

4输入密码

5点击登录

6点击学习课程

7找到课程点击课程名

8跳转页面至课程封面,点击进入课程

9点击课程作业

10查看作业,交作业

这么繁琐的流程,几乎超过了7±2的法则了,即使可以用登录管家把账号密码保存下来,也只是省略了输入密码账号的过程(其实一般登录管家不只是记录一个网站的登录,所以也要考虑点击登录管家和找到学者网的步骤)。最近学习的selenium可以很方便的解决这个问题。

大家可以去网上搜索selenium webdriver (python)第三版来学习,至于安装selenium的过程我也是折腾了很久的,不过几乎所有的问题都是可以解决的,我遇到很多奇葩的问题。比如

图片一图片一

我发现了用find_element_by_class_name().click()的时候就出现一些问题让我很头疼。一开始我没留意到自己是这么写的find_elements_by_class_name().click(),非常低级的错误,有大神指点一下为什么吗?

 driver.find_elements_by_id("").click()

AttributeError: 'list' object has no attribute 'click'

然后我继续调试,发现对于上图这部分内的任何一个元素click还是不起作用的,具体原因我也没搞懂,网上说是所有的element都已click,但是就会报错错误

Traceback (most recent call last):
  File "C:\Users\Administrator\PycharmProjects\untitled3\loginscholar.py", line 29, in <module>
    driver.find_element_by_class_name("head-toolbar-item-detail w1").click()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 415, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 756, in find_element
    'value': value})['value']
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 238, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 193, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Compound class names not permitted
  (Session info: chrome=57.0.2987.110)
  (Driver info: chromedriver=2.28.455520 (cc17746adff54984afff480136733114c6b3704b),platform=Windows NT 6.1.7601 SP1 x86_64)

于是我决定独辟蹊径,我发现了课程作业的网址是这样的:

http://www.scholat.com/course/S_homeworkList.html?courseId=219

很容易猜想出只要获得id就应该可以进入该课程的作业界面了吧,前提是我已经登录这个学者网

然后我就到前面一个页面去寻找,在进入课程的html中

<a id="loginHref1" onclick="checkLogin(219)">进入课程/Enter </a>

有一个checkLogin(219)和 网址上的219是相同的,所以我用以下代码简单获取了课程的id

courseid=driver.find_element_by_id("loginHref1").get_attribute("onclick")
start=courseid.find('(')
end=courseid.find(')')
courseid=courseid[start+1:end]

url2 = "http://www.scholat.com/course/S_homeworkList.html?courseId="+courseid
然后上面这一行就是将课程id和作业界面的网址前缀联系起来。

具体的实现代码如下

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

courses = ['操作系统', '网页设计与制作', '数据库原理与实践', '计算机网络', '软件需求']
print("请输入数字代表课程:1.操作系统2.网页设计与制作3.数据库原理与实践4.计算机网络5.软件需求")
coursenumber = int(input())-1
print("你将进入"+courses[coursenumber])
driver = webdriver.Chrome()
driver.get("http://www.scholat.com/login.jsp")
print("请输入你学者网的账号")
user=input()
print("请输入你的密码")
passWord=input()
email=driver.find_element_by_id("j_username")
email.clear()
email.send_keys(user)
password=driver.find_element_by_id("j_password_ext")
password.clear()
password.send_keys(passWord)
password.send_keys(Keys.ENTER)
driver.find_element_by_id("t6").click()
driver.find_element_by_id("ui-id-4").click()

url1 = driver.find_element_by_link_text(courses[coursenumber]).get_attribute("href")
driver.get(url1)
courseid=driver.find_element_by_id("loginHref1").get_attribute("onclick")
start=courseid.find('(')
end=courseid.find(')')
courseid=courseid[start+1:end]
print("该课程课程号为"+courseid)
driver.find_element_by_id("loginHref1").click()
url2 = "http://www.scholat.com/course/S_homeworkList.html?courseId="+courseid
driver.get(url2)
time.sleep(100)
driver.quit()
图片二
其实算了一下整个过程包括所有页面跳转只是花了大约七秒钟。

图片三图片二


图片三
好吧,这个仅仅是开始。
什么,我的计算机网络作业还没提交,唉,又要去补作业了。

猜你喜欢

转载自blog.csdn.net/sinat_33487968/article/details/65935223
今日推荐