├── yahooJP ├── users.xlsx ├── excel_users.py ├── users.py ├── base.py ├── locators.py ├── testPages.py └── pages.py └── README.md /yahooJP/users.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michdol/Selenium/HEAD/yahooJP/users.xlsx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Learning Selenium Webdriver with Python 2 | yahooJP contains few tests written in Python and Selenium Webdriver. Writing those scripts I was 3 | learning the Page Object Model methodology. #More words so it will look like documentation# 4 | -------------------------------------------------------------------------------- /yahooJP/excel_users.py: -------------------------------------------------------------------------------- 1 | import xlrd 2 | 3 | 4 | file_location = "./users.xlsx" 5 | workbook = xlrd.open_workbook(file_location) 6 | sheet = workbook.sheet_by_index(0) 7 | 8 | data = [[sheet.cell_value(r, c) for c in range(sheet.ncols)] for r in range(1, sheet.nrows)] 9 | 10 | 11 | 12 | def excel_get_email(name): 13 | for i in data: 14 | if name == i[1]: 15 | return i[3] 16 | 17 | 18 | def excel_get_password(name): 19 | for i in data: 20 | if name == i[1]: 21 | return i[4] 22 | -------------------------------------------------------------------------------- /yahooJP/users.py: -------------------------------------------------------------------------------- 1 | users_list = [ 2 | # valid user 3 | {'name': "Michal", 4 | 'email': 'michalfrompoland1@yahoo.co.jp', 5 | 'id': 'michalfrompoland1', 6 | 'password': 'michal666!', 7 | 'postal code': '102-0072', 8 | 'birth date': '1992/08/07', 9 | '秘密の質問': 'Zorro'}, 10 | 11 | # invalid user 12 | {'name': "Invalid", 13 | 'email': 'somerandomemail@yahoo.co.jp', 14 | 'id': 'notreallyneeded1', 15 | 'password': 'WorshipMe', 16 | 'postal code': 'either', 17 | 'birth date': '3218/80/77', 18 | '秘密の質問': 'I have not idea what I\'m doing' 19 | } 20 | ] 21 | 22 | 23 | def get_email(name): 24 | for i in users_list: 25 | if i['name'] == name: 26 | ind = users_list.index(i) 27 | return users_list[ind]['id'] 28 | 29 | 30 | def get_password(name): 31 | for i in users_list: 32 | if i['name'] == name: 33 | ind = users_list.index(i) 34 | return users_list[ind]['password'] 35 | -------------------------------------------------------------------------------- /yahooJP/base.py: -------------------------------------------------------------------------------- 1 | from selenium.webdriver.support.ui import WebDriverWait 2 | from selenium.common.exceptions import NoSuchElementException 3 | from selenium.webdriver.common.action_chains import ActionChains 4 | 5 | class Page(object): 6 | def __init__(self, driver, base_url='http://yahoo.co.jp/'): 7 | self.base_url = base_url 8 | self.driver = driver 9 | self.timeout = 30 10 | 11 | def find_element(self, *locator): 12 | return self.driver.find_element(*locator) 13 | 14 | def find_elements(self, *locator): 15 | return self.driver.find_elements(*locator) 16 | 17 | def get_titile(self): 18 | return self.driver.title 19 | 20 | def get_url(self): 21 | return self.driver.current_url() 22 | 23 | def hover(self, *locator): 24 | element = self.find_element(*locator) 25 | hover = ActionChains(self.driver).move_to_element(element) 26 | hover.perform() 27 | 28 | def check_element_exists(self, *locator): 29 | try: 30 | self.find_element(*locator) 31 | except NoSuchElementException: 32 | return False 33 | return True 34 | 35 | def checkbox_is_selected(self, *locator): 36 | return True if (self.find_element(*locator).is_selected()) else False 37 | 38 | def wait_for_element(self, *locator): 39 | return WebDriverWait(self.driver, 30).until(lambda self: self.find_element(*locator)) -------------------------------------------------------------------------------- /yahooJP/locators.py: -------------------------------------------------------------------------------- 1 | from selenium.webdriver.common.by import By 2 | 3 | 4 | class MainPageLocators(object): 5 | HEADER = (By.XPATH, "//*[@id='masthead']/h1/a/img") 6 | SEARCHBAR = (By.ID, "srchtxt") 7 | SEARCHBUTTON = (By.ID, "srchbtn") 8 | MAIL = (By.XPATH, "//*[@id='mhi6th']/a") 9 | 10 | 11 | class LoginPageLocators(object): 12 | HEADER = (By.ID, "ygmhlog") 13 | EMAIL = (By.ID, "username") 14 | PASSWORD = (By.ID, "passwd") 15 | LOGINBUTTON = (By.ID, ".save") 16 | FAILEDLOGIN = (By.XPATH, ".//*[@id='themeBox']/div[1]/h2") 17 | 18 | 19 | class MailPageLocators(object): 20 | HEADER = (By.ID, "ygmhlog") 21 | LOGOUT = (By.XPATH, "//*[@id='normalHeader']/div[2]/a[3]") 22 | CONFIRMLOGOUT = (By.XPATH, "//*[@id='yregct']/div[1]/h1") 23 | EMAILS = (By.CLASS_NAME, "list-view-items-inner") 24 | THEEMAIL = (By.XPATH, ".//div[@data-action='select-message']") 25 | SENDER = (By.XPATH, ".//div[@class='from']") 26 | TITLE = (By.XPATH, ".//div[@class='subj']") 27 | 28 | class SearchResultsPageLocators(object): 29 | SEARCHBAR = (By.ID, 'yschsp') 30 | CONTRIBUTORS = (By.LINK_TEXT, 'Selenium Contributors') 31 | LIST = (By.ID, 'mainContent') 32 | SELENIUMHEADER = (By.XPATH, ".//*[@id='header']/h1/a") 33 | NAMES = (By.XPATH, ".//div[@class='contributor']/h3/a") -------------------------------------------------------------------------------- /yahooJP/testPages.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from yahooJP.pages import * 3 | from selenium import webdriver 4 | 5 | 6 | class TestPages(unittest.TestCase): 7 | def setUp(self): 8 | self.driver = webdriver.Firefox() 9 | self.driver.maximize_window() 10 | self.driver.get('http://yahoo.co.jp') 11 | 12 | def test_check_page_loaded(self): 13 | page = MainPage(self.driver) 14 | self.assertTrue(page.check_page_loaded()) 15 | 16 | def test_login_to_email(self): 17 | page = MainPage(self.driver) 18 | login_page = LoginPage(self.driver) 19 | mail_page = MailPage(self.driver) 20 | page.go_to_mail_page() 21 | self.assertTrue(login_page.check_page_loaded()) 22 | login_page.login('Michal') 23 | self.assertTrue(mail_page.check_page_loaded()) 24 | 25 | def test_get_emails_and_log_out(self): 26 | page = MainPage(self.driver) 27 | login_page = LoginPage(self.driver) 28 | mail_page = MailPage(self.driver) 29 | page.go_to_mail_page() 30 | login_page.login('Michal') 31 | emails = mail_page.get_emails() 32 | print(emails) 33 | self.assertTrue(mail_page.log_out()) 34 | 35 | def test_login_invalid_user(self): 36 | page = MainPage(self.driver) 37 | login_page = LoginPage(self.driver) 38 | page.go_to_mail_page() 39 | self.assertTrue(login_page.login_invalid_user('Invalid')) 40 | 41 | def test_search(self): 42 | page = MainPage(self.driver) 43 | search_result_page = SearchResultPage(self.driver) 44 | self.assertTrue(page.enter_search_term('selenium webdriver creator')) 45 | search_result_page.go_to_result() 46 | search_result_page.get_contributors_names() 47 | 48 | # Again login with valid and invalid user but using excel for storing data 49 | 50 | def test_excel_login_valid(self): 51 | page = MainPage(self.driver) 52 | login_page = LoginPage(self.driver) 53 | mail_page = MailPage(self.driver) 54 | page.go_to_mail_page() 55 | login_page.excel_login('Michal') 56 | self.assertTrue(mail_page.log_out()) 57 | 58 | def test_excel_login_invalid(self): 59 | page = MainPage(self.driver) 60 | login_page = LoginPage(self.driver) 61 | page.go_to_mail_page() 62 | self.assertTrue(login_page.excel_login_invalud_user('Invalid')) 63 | 64 | def tearDown(self): 65 | self.driver.quit() 66 | 67 | if __name__ == '__main__': 68 | unittest.main() 69 | -------------------------------------------------------------------------------- /yahooJP/pages.py: -------------------------------------------------------------------------------- 1 | from yahooJP.base import Page 2 | from yahooJP.locators import * 3 | from time import sleep 4 | from yahooJP.users import get_password, get_email 5 | from yahooJP.excel_users import excel_get_email, excel_get_password 6 | 7 | 8 | class MainPage(Page): 9 | def check_page_loaded(self): 10 | return self.find_element(*MainPageLocators.HEADER) 11 | 12 | def go_to_mail_page(self): 13 | self.find_element(*MainPageLocators.MAIL).click() 14 | self.wait_for_element(*LoginPageLocators.HEADER) 15 | return LoginPage(self.driver) 16 | 17 | def enter_search_term(self, term): 18 | searchbar = self.find_element(*MainPageLocators.SEARCHBAR) 19 | searchbutton = self.find_element(*MainPageLocators.SEARCHBUTTON) 20 | searchbar.send_keys(term) 21 | sleep(1) 22 | searchbutton.click() 23 | results_search_bar = self.wait_for_element(*SearchResultsPageLocators.SEARCHBAR) 24 | return results_search_bar.get_attribute('value') == term 25 | 26 | 27 | class SearchResultPage(Page): 28 | def go_to_result(self): 29 | self.find_element(*SearchResultsPageLocators.CONTRIBUTORS).click() 30 | self.wait_for_element(*SearchResultsPageLocators.SELENIUMHEADER) 31 | 32 | def get_contributors_names(self): 33 | list = self.find_element(*SearchResultsPageLocators.LIST) 34 | names = list.find_elements(*SearchResultsPageLocators.NAMES) 35 | for name in names: 36 | print(name.text) 37 | 38 | 39 | class LoginPage(Page): 40 | def check_page_loaded(self): 41 | return self.find_element(*LoginPageLocators.HEADER) 42 | 43 | def enter_email(self, name): 44 | self.driver.find_element(*LoginPageLocators.EMAIL).send_keys(get_email(name)) 45 | 46 | def enter_password(self, name): 47 | self.driver.find_element(*LoginPageLocators.PASSWORD).send_keys(get_password(name)) 48 | 49 | def click_login(self): 50 | self.driver.find_element(*LoginPageLocators.LOGINBUTTON).click() 51 | 52 | def login(self, name): 53 | self.enter_email(name) 54 | self.enter_password(name) 55 | sleep(1) 56 | self.click_login() 57 | self.wait_for_element(*MailPageLocators.HEADER) 58 | return MailPage(self.driver) 59 | 60 | def login_invalid_user(self, name): 61 | self.enter_email(name) 62 | self.enter_password(name) 63 | sleep(1) 64 | self.click_login() 65 | return self.check_element_exists(*LoginPageLocators.FAILEDLOGIN) 66 | 67 | # Same methods for login as above but using excel for storing data 68 | 69 | def excel_enter_email(self, name): 70 | self.driver.find_element(*LoginPageLocators.EMAIL).send_keys(excel_get_email(name)) 71 | 72 | def excel_enter_password(self, name): 73 | self.driver.find_element(*LoginPageLocators.PASSWORD).send_keys(excel_get_password(name)) 74 | 75 | def excel_login(self, name): 76 | self.excel_enter_email(name) 77 | self.excel_enter_password(name) 78 | sleep(1) 79 | self.click_login() 80 | self.wait_for_element(*MailPageLocators.HEADER) 81 | return MailPage(self.driver) 82 | 83 | def excel_login_invalud_user(self, name): 84 | self.excel_enter_email(name) 85 | self.excel_enter_password(name) 86 | sleep(1) 87 | self.click_login() 88 | return self.check_element_exists(*LoginPageLocators.FAILEDLOGIN) 89 | 90 | 91 | class MailPage(Page): 92 | def check_page_loaded(self): 93 | return self.find_element(*MailPageLocators.HEADER) 94 | 95 | def log_out(self): 96 | self.find_element(*MailPageLocators.LOGOUT).click() 97 | return self.wait_for_element(*MailPageLocators.CONFIRMLOGOUT) 98 | 99 | def get_emails(self): 100 | emails_list = self.find_element(*MailPageLocators.EMAILS) 101 | emails = emails_list.find_elements(*MailPageLocators.THEEMAIL) 102 | emails_to_return = [] 103 | for index, i in enumerate(emails): 104 | sender = i.find_element(*MailPageLocators.SENDER).text 105 | title = i.find_element(*MailPageLocators.TITLE).text 106 | emails_to_return.append({'index':index + 1, 'sender': sender, 'title': title}) 107 | 108 | return emails_to_return 109 | --------------------------------------------------------------------------------