-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
135 lines (112 loc) · 4.67 KB
/
main.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
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import openpyxl
from os import getenv
from dotenv import load_dotenv
from time import sleep
load_dotenv()
class Member():
def __init__(self, _student_id: str, _name: str, _job: str = None, _phone: str = None) -> None:
self.student_id = _student_id
self.name = _name
self.job = _job or "社員"
self.phone = _phone
def __str__(self) -> str:
return f"({self.student_id}, {self.name}, {self.job}, {self.phone})"
def __repr__(self) -> str:
return f"({self.student_id}, {self.name}, {self.job}, {self.phone})"
def WaitForLoad(time: float = 0.2):
def decorator(func):
def wrapper(*args):
func(*args)
sleep(time)
return wrapper
return decorator
class WebControler():
def __init__(self, driver_option):
self.main_url = "https://clubs.ntust.edu.tw/Login/"
self.member_manage_url = "https://clubs.ntust.edu.tw/ClubManagement/MemberList"
self.driver = Chrome(options=driver_option)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
self.driver.close()
@WaitForLoad()
def click_button(self, selector: str) -> None:
self.driver.find_element(By.CSS_SELECTOR, selector).click()
@WaitForLoad()
def send_string(self, name: str, msg: str) -> None:
self.driver.find_element(By.NAME, name).send_keys(msg)
@WaitForLoad()
def set_select_menu(self, name: str, index: int) -> None:
Select(self.driver.find_element(By.NAME, name)).select_by_index(index)
@WaitForLoad(0.5)
def login(self, username: str, password: str) -> None:
self.click_button("#accordion > div:nth-child(4) > div > h4 > a")
self.send_string("username", username)
self.send_string("password", password)
self.click_button("#login-form > div.modal-footer > div > button")
def add_new_member(self, member: Member) -> None:
self.send_string("StudentID", member.student_id)
self.send_string("Name", member.name)
if member.job != "社員":
self.set_select_menu("Identity", 0)
self.send_string("Title", member.job)
if member.phone is not None:
self.send_string("Phone", member.phone)
self.click_button("body > div.container > div:nth-child(2) > div.col-sm-9.col-md-9 > form:nth-child(1) > p:nth-child(8) > button")
def login_to_member_manage(self) -> None:
self.driver.get(self.main_url)
self.login(getenv("USERNAME"), getenv("PASSWORD"))
# change to member manage page
self.driver.get(self.member_manage_url)
def add_new_member_TEST():
driver_option = ChromeOptions()
driver_option.add_argument("start-maximized")
with WebControler(driver_option) as web_controler:
web_controler.login_to_member_manage()
# 普通社員
test_member = Member("B10901001", "測試員")
# 幹部
test_member2 = Member("B10901002", "測試員2", "測試職位2")
web_controler.add_new_member(test_member)
web_controler.add_new_member(test_member2)
def login_to_member_manage_TEST():
driver_option = ChromeOptions()
driver_option.add_argument("start-maximized")
with WebControler(driver_option) as web_controler:
web_controler.login_to_member_manage()
def load_xlsx(file_path: str) -> list[Member]:
workbook = openpyxl.load_workbook(file_path)
worksheet = workbook[workbook.sheetnames[0]]
rows = worksheet.iter_rows(min_row=2, min_col=1)
members = [Member(*[c.value for c in row]) for row in rows if row[0].value is not None]
return members
def load_xlsxTEST(filename: str):
members = load_xlsx(filename)
for member in members:
print(member)
def main(filename: str):
driver_option = ChromeOptions()
driver_option.add_argument("start-maximized")
members = load_xlsx(filename)
failed_members = []
with WebControler(driver_option) as web_controler:
web_controler.login_to_member_manage()
for member in members:
try:
web_controler.add_new_member(member)
except Exception:
failed_members.append(member)
if len(failed_members) == 0:
print("All members are added successfully.")
else:
print(f'Failed: {len(failed_members)} members.')
for member in failed_members:
print(member)
if "__main__" == __name__:
filename = "test.xlsx"
# main(filename)
load_xlsxTEST(filename)