from helper import login, logout import time import pytest from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_admin_can_create_lecturer_account(driver, url, admin_username, admin_password, restore_database): # Administrator (admin@qq.com, password 123) logs in driver.maximize_window() login(driver, url, admin_username, admin_password) # Create a Lecturer account for Mr Lan (mrlan@qq.com, password [123Abc!]) tab = driver.find_element(By.ID, 'tab_ins_accounts') tab.click() elem = driver.find_element(By.NAME, 'fullname') elem.send_keys('Mr Lan') elem = driver.find_element(By.NAME, 'email') elem.send_keys('mrlan@qq.com') elem = driver.find_element(By.NAME, 'password') elem.send_keys('123Abc!!') radio_button = driver.find_element(By.NAME, 'type') radio_button.click() button = driver.find_element(By.NAME, 'create_btn') button.click() # Log out Admin account logout(driver) # Log in Lecturer account login(driver, url, 'mrlan@qq.com', '123Abc!!') elems = driver.find_elements(By.CLASS_NAME, 'nav-link') assert '(Lecturer)' in elems[0].text assert 'Mr Lan' in elems[0].text driver.quit() def test_lecturer_can_create_course(driver, url, restore_database): # Lecturer lanhui@qq.com logs in driver.maximize_window() login(driver, url, 'lanhui@qq.com', '123') # Create a course called CSC1001 Advanced Software Engineering, 2024 elem = driver.find_element(By.NAME, 'name') elem.send_keys('Advanced Software Engineering') elem = driver.find_element(By.NAME, 'code') elem.send_keys('CSC1001') elem = driver.find_element(By.NAME, 'academic') elem.send_keys('2004') elem = driver.find_element(By.NAME, 'faculty') elem.send_keys('School of Computer Science and Technology') elem = driver.find_element(By.CLASS_NAME, 'btn-primary') elem.click() elems = driver.find_elements(By.CLASS_NAME, 'btn-default') last_elem = elems[-1] assert 'Advanced Software Engineering' in last_elem.text assert '(CSC1001)' in last_elem.text # Logout logout(driver) driver.quit() def test_lecturer_can_post_assignment(driver, url, restore_database): # Lecturer lanhui@qq.com logs in driver.maximize_window() login(driver, url, 'lanhui@qq.com', '123') # Create an assignment called Take-home quiz 1 for course (CSC1111) - Project Management elem = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, '//div[@class="col-md-8"]/a[1]/div')) ) elem.click() elem = driver.find_element(By.NAME, 'deadlinedate') elem.send_keys('002024/12/30') elem = driver.find_element(By.NAME, 'deadlinetime') elem.send_keys('23:59') elem = driver.find_element(By.NAME, 'title') elem.send_keys('Take-home quiz 1') elem = driver.find_element(By.NAME, 'instructions') elem.send_keys('This is a closed-book quiz.') elem = driver.find_element(By.NAME, 'marks') elem.send_keys('10') radio_button = driver.find_element(By.NAME, 'type') radio_button.click() elem = driver.find_element(By.CLASS_NAME, 'btn-primary') elem.click() # Check if the assignment has been successfully posted elem = driver.find_element(By.CLASS_NAME, 'card-title') assert 'Take-home quiz 1 (10 Marks, Individual)' in elem.text elem = driver.find_element(By.CLASS_NAME, 'text-muted') assert 'Deadline: 2024-12-30' in elem.text driver.quit() def test_lecturer_can_add_student_numbers(driver, url, restore_database): # Lecturer lanhui@qq.com logs in driver.maximize_window() login(driver, url, 'lanhui@qq.com', '123') # Add ASE student numbers student_numbers = ''' 202420781739 202420781740 202420781741 202420781742 202420781743 202420781745 202420581366 202420581368 202420581369 202420581370 202420581372 202420581373 202420581374 202420581376 202420581378 202420581381 ''' elem = driver.find_element(By.ID, 'admin_tab') elem.click() elem = driver.find_element(By.NAME, 'users') elem.send_keys(student_numbers) elem = driver.find_element(By.ID, 'register_btn') elem.click() elems = driver.find_elements(By.CSS_SELECTOR, 'p') added = 0 student_lst = [number.strip() for number in student_numbers.strip().split('\n')] print(student_lst) for student_no in student_lst: for elem in elems: if student_no in elem.text and 'added' in elem.text: added += 1 break assert added == len(student_lst) driver.quit() def test_student_with_valid_student_number_can_sign_up(driver, url, restore_database): # Student with recognizable student number 202400000001 can sign up an account driver.get(url) driver.maximize_window() elem = driver.find_element(By.ID, 'signup_link') elem.click() elem = driver.find_element(By.NAME, 'fullname') elem.send_keys('Good Student') elem = driver.find_element(By.NAME, 'user_student_id') elem.send_keys('202400000001') elem = driver.find_element(By.NAME, 'email') elem.send_keys('goodstudent@qq.com') elem = driver.find_element(By.NAME, 'password') elem.send_keys('[123Abc]') elem = driver.find_element(By.NAME, 'confirmpassword') elem.send_keys('[123Abc]') elem = driver.find_element(By.ID, 'signup_btn') elem.click() logout(driver) # Log in Student account login(driver, url, '202400000001', '[123Abc]') elems = driver.find_elements(By.CLASS_NAME, 'nav-link') assert 'Student ID' in elems[0].text assert 'Good Student' in elems[0].text driver.quit() def test_student_with_invalid_student_number_cannot_sign_up(driver, url, restore_database): # Student with unrecognizable student number cannot sign up an account driver.get(url) driver.maximize_window() elem = driver.find_element(By.ID, 'signup_link') elem.click() elem = driver.find_element(By.NAME, 'fullname') elem.send_keys('Good Student') elem = driver.find_element(By.NAME, 'user_student_id') elem.send_keys('202400000002') elem = driver.find_element(By.NAME, 'email') elem.send_keys('goodstudent@qq.com') elem = driver.find_element(By.NAME, 'password') elem.send_keys('[123Abc]') elem = driver.find_element(By.NAME, 'confirmpassword') elem.send_keys('[123Abc]') elem = driver.find_element(By.ID, 'signup_btn') elem.click() # Log in Student account login(driver, url, '202400000002', '[123Abc]') elems = driver.find_elements(By.CLASS_NAME, 'nav-link') assert not 'Student ID' in elems[0].text assert not 'Good Student' in elems[0].text driver.quit() def test_student_with_weak_password_cannot_sign_up(driver, url, restore_database): driver.get(url) driver.maximize_window() weak_password = '123Abc' elem = driver.find_element(By.ID, 'signup_link') elem.click() elem = driver.find_element(By.NAME, 'fullname') elem.send_keys('Good Student') elem = driver.find_element(By.NAME, 'user_student_id') elem.send_keys('202400000001') elem = driver.find_element(By.NAME, 'email') elem.send_keys('goodstudent@qq.com') elem = driver.find_element(By.NAME, 'password') elem.send_keys(weak_password) elem = driver.find_element(By.NAME, 'confirmpassword') elem.send_keys(weak_password) elem = driver.find_element(By.ID, 'signup_btn') elem.click() # Log in Student account login(driver, url, '202400000001', weak_password) elems = driver.find_elements(By.CLASS_NAME, 'nav-link') assert not 'Student ID' in elems[0].text assert not 'Good Student' in elems[0].text driver.quit() def test_student_can_join_course(driver, url, restore_database): # Student can join (CSC1111) - Project Management login(driver, url, '201825800050', '123') driver.maximize_window() # Search for CSC1111 elem = driver.find_element(By.NAME, 'search') elem.send_keys('CSC1111') elem = driver.find_element(By.CLASS_NAME, 'btn-primary') elem.click() elems = driver.find_elements(By.CLASS_NAME, 'btn-default') assert 'CSC1111' in elems[0].text # Join elem = driver.find_element(By.CLASS_NAME, 'btn-success') # find the green Join button elem.click() # Log out, then log in to check the course-joining status logout(driver) login(driver, url, '201825800050', '123') elems = driver.find_elements(By.CLASS_NAME, 'btn-default') assert 'CSC1111' in elems[0].text assert 'Project Management' in elems[0].text assert 'Joined' in elems[0].text def test_student_can_submit_assignment(driver, url, restore_database): ''' Note: Make sure the fields Posted_Date and Deadline in the second row of lab_reports_table are in the current year''' # Student can submit assignment for CSC1111 login(driver, url, '201825800050', '123') driver.maximize_window() # Enter into the course and the find the assignment elems = driver.find_elements(By.CLASS_NAME, 'btn-default') elems[1].click() elem = driver.find_element(By.XPATH, '//div[@id="menu1"]/div/div/p/a[text()="Submit"]') # find the submit button elem.click() # Fill submission title, attach file, and submit elem = driver.find_element(By.NAME, 'title') elem.send_keys('Assignment submission from Mohamed') elem = driver.find_element(By.NAME, 'attachment1') elem.send_keys('/home/mrlan/Downloads/test/SeleniumHui/helper.py') # attach a file elem = driver.find_element(By.XPATH, '//form/button') elem.click() # Go the Submitted tab elem = driver.find_element(By.ID, 'myTab') elems = elem.find_elements(By.CLASS_NAME, 'nav-link') elems[2].click() elem = driver.find_element(By.XPATH, '//div[@id="menu3"]/div') assert 'Reading 2 (6 Marks)' in elem.text assert 'SUBMITTED' in elem.text assert 'helper.py' in elem.text def test_student_can_request_remarking(driver, url, restore_database): # Student logs in login(driver, url, '201825800050', '123') driver.maximize_window() # Enter into the course elems = driver.find_elements(By.CLASS_NAME, 'btn-default') elems[1].click() # Go the Marked tab elem = driver.find_element(By.ID, 'myTab') elems = elem.find_elements(By.CLASS_NAME, 'nav-link') elems[3].click() # Send remarking request remarking_buttons = driver.find_elements(By.CLASS_NAME, 'btn-light') remarking_buttons[0].click() alert = driver.switch_to.alert alert.send_keys('I need higher marks, teacher.') alert.accept() elem = driver.find_element(By.XPATH, '//div[@id="menu4"]/div/div/p/span') assert 'Remarking request sent' == elem.text def test_lecturer_can_mark_assignment(driver, url, restore_database): # Lecturer lanhui@qq.com logs in driver.maximize_window() login(driver, url, 'lanhui@qq.com', '123') # Enter into the course and the find the assignment elem = driver.find_element(By.XPATH, '//div[1]/a[3]/div') # course Software Engineering elem.click() elem = driver.find_element(By.XPATH, '//div[2]/div[2]/div/a[2]') # View link elem.click() elem = driver.find_element(By.CLASS_NAME, 'btn-primary') # Blue Mark button elem.click() # Submit mark and comment elem = driver.find_element(By.NAME, 'marks') elem.send_keys('1') elem = driver.find_element(By.NAME, 'feedback') elem.send_keys('Inadequate') form = driver.find_element(By.ID, 'submit-form') form.submit() elem = driver.find_element(By.ID, 'myTab') elems = elem.find_elements(By.CLASS_NAME, 'nav-link') assert 'Marked submissions (1)' == elems[1].text elems[1].click() elem = driver.find_element(By.XPATH, "//div[@id='menu2']/div/b") assert 'Reading 1 submission' in elem.text def test_lecturer_cannot_see_tas_not_from_his_course(driver, url, restore_database): # Lecturer lanhui@qq.com logs in driver.maximize_window() login(driver, url, 'peter@qq.com', '123') elem = driver.find_element(By.ID, 'admin_tab') elem.click() tab = driver.find_element(By.ID, 'existing_accounts_tab') tab.click() elem = driver.find_element(By.ID, 'tab-existing-accounts') assert 'No TA' in elem.text # Logout logout(driver) driver.quit()