-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparseGrades.py
143 lines (111 loc) · 4.46 KB
/
parseGrades.py
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!/usr/bin/env python
# Grade parser: Gets grades from SIS from the most recent semester and prints
# them out.
# Zach Kirsch | December 2016
#
# Dependencies:
# Selenium (pip install selenium)
# PhantomJS (http://phantomjs.org/download.html)
# Firefox
#
# Usage: python parseGrades.py <username> <password file>
###############################################################################
###############################################################################
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.common.exceptions import TimeoutException
import time
import datetime
import sys
import os.path
###############################################################################
###############################################################################
# Constants
delay = 30 # will wait this many seconds before timing out
login_url = ("https://sis.uit.tufts.edu/psp/paprod/EMPLOYEE/EMPL/h/" +
"?tab=PAPP_GUEST#")
dt = datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
sis_url = ("https://sis.uit.tufts.edu/psp/paprod/EMPLOYEE/EMPL/h/?tab=DEFAULT" +
"&tm=" + dt + "#1")
path_to_phantomjs_binary = './phantomjs'
path_to_geckodriver_binary = './geckodriver'
path_to_firefox_binary = './firefox'
###############################################################################
###############################################################################
# Fill out forms and login to site
def login(driver):
username = driver.find_element_by_name('userid')
password = driver.find_element_by_name('pwd')
username.send_keys(USER)
password.send_keys(PASS)
password.send_keys(Keys.RETURN)
# see if it worked
try:
WebDriverWait(driver, delay).until(EC.presence_of_element_located(
(By.CLASS_NAME, 'tfp_mp_slide')))
except TimeoutException:
print "Error logging in"
sys.exit(1)
# get grades
def get_grades(driver):
grades_table = driver.find_elements(By.TAG_NAME, "table")[11]
courses = grades_table.find_elements(By.TAG_NAME, "tr")
for course in courses:
details = course.find_elements(By.TAG_NAME, "td")
# makes sure it's a grade row
if len(details) != 6:
continue
course_name = details[0].text
prof = details[2].text
grade = details[3].text
grading_basis = details[4].text
graded = grading_basis in ["Graded", "P/NP"]
# only print graded courses
if not graded:
continue
print grade.ljust(2) + " in " + course_name + " (" + prof + ")"
# waits for element to appear
def wait_for_element(elem):
try:
located = EC.presence_of_element_located(elem)
WebDriverWait(driver, delay).until(located)
except:
print "Timeout"
sys.exit(1)
###############################################################################
###############################################################################
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: {} <username> <password file>".format(sys.argv[0]))
exit(1)
USER = sys.argv[1].upper()
with open(sys.argv[2]) as f:
PASS = f.readline().rstrip("\n")
# Initialize and load the web page
driver = webdriver.PhantomJS(executable_path=path_to_phantomjs_binary,
service_log_path=os.path.devnull,
service_args=['--ignore-ssl-errors=true'])
driver.set_window_size(2400,2000)
# firefox_binary = FirefoxBinary(path_to_firefox_binary)
# driver = webdriver.Firefox(executable_path=path_to_geckodriver_binary,
# firefox_binary=firefox_binary)
try:
driver.get(login_url)
wait_for_element((By.NAME, 'userid'))
login(driver)
# after logged in, go to sis grades url
driver.get(sis_url)
# go back a semester
wait_for_element((By.ID, 'tfp_grades_lft_arrow'))
back_arrow = driver.find_element_by_id('tfp_grades_lft_arrow')
back_arrow.click()
# wait for slide transition
time.sleep(2)
get_grades(driver)
finally:
driver.close()
driver.quit()