紫玉说课没选上,我就想写个脚本挂着看有没有退呗~

初探

经过同学的推荐使用了selenium。做自动化测试很好啊,解决chekbox分分钟。开始啦~

上来就遇到问题了。要把geckodriver这个东西放到环境变量里。
最后选择手动配置路径:
dr = webdriver.Firefox(executable_path = '/Users/lixs/anaconda3/geckodriver')
虽然麻烦点,但是着急往下写。我们继续~

先试试用Cookie登录

1
2
3
4
5
6
driver.get('http://jwxk.ucas.ac.cn/courseManage/selectCourse?s=473bcdb8-8d5d-40af-9087-5071b63ff7a8')
#将用户名密码写入浏览器cookie中
driver.add_cookie({'name':'username','value':'chinalixs@qq.com'})
driver.add_cookie({'name':'pwd','value':'Jwsyb9503'})
#再次访问网站,将会自动登录
driver.get('http://jwxk.ucas.ac.cn/courseManage/')

不行,提示会话过期。先不用Cookie了以后再回来研究自动填表吧

1
2
3
4
5
6
7
# login
input = driver.find_element_by_name('userName')
input.send_keys('NAME')
input = driver.find_element_by_name('pwd')
input.send_keys('123456')
#点击登录
sb = driver.find_element_by_name('sb').click()

然后选课找课都是一个模子的。只能说这个selenium很给力~


知识点

  • 嵌套找xpath:
    driver.find_element_by_xpath('//form[@id="regfrm2"]//button[@name="sb"]').click()

  • time包 sleep(3) 等3秒做自动化测试很好用

  • 处理弹窗:

1
2
3
al = driver.switch_to_alert()
time.sleep(1)
al.accept()
  • 判断是否选上了driver.find_element_by_xpath('//input[@value="65A7F68B98BB6FB9"]').is_selected()

实战本地跑

截止到目前还是没选上的,因为没人退课啊。不过学到了selenium这个包。

具体思路就是监测那门课的 chekbox 前面的 √ 是否打上了,打不上就刷新,因为有了课余量那个 √ 是可以打上的,然后就一直刷新。
之前也是程序跑个20次左右就会报错,可能是请求太多了。然后刚好上次学到了 try/except ,哎呦不错哦。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
from selenium import webdriver
import time

driver = webdriver.Firefox(executable_path = '/Users/lixs/anaconda3/geckodriver')
driver.get('http://sep.ucas.ac.cn')
# login
input = driver.find_element_by_name('userName')
input.send_keys('chinalixs@qq.com')
input = driver.find_element_by_name('pwd')
input.send_keys('Jwsyb9503')
sb = driver.find_element_by_name('sb').click()

# 打开选课系统
from selenium import webdriver
import time
driver = webdriver.Firefox(executable_path = '/Users/lixs/anaconda3/geckodriver')
driver.get('http://sep.ucas.ac.cn')
# login
input = driver.find_element_by_name('userName')
input.send_keys('chinalixs@qq.com')
input = driver.find_element_by_name('pwd')
input.send_keys('Jwsyb9503')
sb = driver.find_element_by_name('sb').click()
# 打开选课系统
driver.find_element_by_xpath('//a[@href="/portal/site/226/821"]').click()
# 点击选课
driver.get('http://jwxk.ucas.ac.cn/courseManage/main')
#选学院
driver.find_element_by_id('id_913').click()
driver.find_element_by_xpath('//form[@id="regfrm2"]//button[@name="sb"]').click()
#选课
i = 1
def xuanke(i):
if i%100==0:
#每当i跑100次就返回一下防止内存爆炸
return
try:
driver.find_element_by_xpath('//input[@value="65A7F68B98BB6FB9"]').click()
if driver.find_element_by_xpath('//input[@value="65A7F68B98BB6FB9"]').is_selected():
print('选上啦!!!')
return
else:
print(i,'次没选上继续')
i += 1
#刷新一下
driver.refresh()
al = driver.switch_to_alert()
al.accept()
xuanke(i)

except:
print('---------------ERROR---------------------')
xuanke(i)
for a in range(10000):
xuanke(i)
#提交
sb = driver.find_element_by_xpath('//button[@type="submit"]').click()
#弹出一个提示,选确定
sb = driver.find_element_by_xpath('//button[@value="ok"]').click()
print('OVER')
driver.close()

代码历史:

  • 1.0版本 开始选课函数是 xuanke()
    后来我想引入一个统计变量看跑了多少次。就在函数外设了个变量。结果很低级的错误就出现了,函数定义怎么能改全局变量i呢。真的天真
  • 2.0版本 xuanke(i) 传入i。
    统计可以了,新问题也就出现了。老版的 xuanke(i) 里每跑2k次左右,就会内存爆炸,于是
  • 3.0版本 每i==100就return一次。

服务器跑

频繁地去刷新网页,跑了一会儿课没选上,我16g的mac内存占用100%,开始发热了。于是服务器跑的思想直接就冒了出来~

刚好看到这篇文章:《liunx centos7无GUI服务器跑Selenium部署说明》

安装chrome

  1. 添加chrome的repo源

    1
    2
     vi /etc/yum.repos.d/google.repo
    [google]name=Google-x86_64baseurl=http://dl.google.com/linux/rpm/stable/x86_64enabled=1gpgcheck=0gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
  2. 安装
    yum update , 然后yum install google-chrome-stable

注意:google-chrome一定一定不要用root用户去运行

安装chromedrive

https://sites.google.com/a/chromium.org/chromedriver/home 下载 chromedriver

配置在PATH路径或者在脚本中指定路径

1
2
3
4
5
6
7
8
9
wget -N http://chromedriver.storage.googleapis.com/2.29/chromedriver_linux64.zip unzip chromedriver_linux64.zip

chmod +x chromedriver

sudo mv -f chromedriver /usr/local/share/chromedriver

sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver

sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver

安装Xvfb

无GUI时,Xvfb为虚拟GUI

1
2
3
4
5
6
7
yum update

yum install Xvfb

yum -install libXfont

yum install xorg-x11-fonts*

安装selenium、pyvirtualdisplay

pip install selenium

pip install pyvirtualdisplay

5.写个小demo测试下效果

vim test.py

1
2
3
4
5
6
7
8
9
10
11
12
from selenium import webdriver
from pyvirtualdisplay import Display
  

display = Display(visible=0, size=(800,600))
display.start()
driver = webdriver.Chrome("./chromedriver")
driver.get("http://www.baidu.com")
print driver.page_source

driver.quit()
display.stop()

python test.py