diff --git a/.gitignore b/.gitignore index 25db079..e267cb8 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ # IDEs and editors /.idea +*.idea .project .classpath .c9/ @@ -35,6 +36,15 @@ npm-debug.log testem.log /typings +env/ +bin/ +*.log +*.swp +*.pyc +*.komodoproject +/__init__.py +/__init__.pyc +.pyc # e2e /e2e/*.js @@ -43,3 +53,4 @@ testem.log #System Files .DS_Store Thumbs.db + diff --git a/tests/byndmaptests/browser.py b/tests/byndmaptests/browser.py new file mode 100644 index 0000000..f6e8579 --- /dev/null +++ b/tests/byndmaptests/browser.py @@ -0,0 +1,121 @@ +import os + +from selenium import webdriver +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC +from selenium.webdriver.firefox.firefox_binary import FirefoxBinary + + +DRIVER = os.getenv('DRIVER', 'chrome') +BASE_URL = os.getenv('BASE_URL', 'https://bynd-map.firebaseapp.com/') + + +def _run_google_authentication(driver, url): + driver.get(url) + wait = WebDriverWait(driver, 120) + element = wait.until(EC.title_contains('Beyond Map')) + + +def get_browser_driver(): + return globals()["get_%s_driver" % DRIVER]() + + +def get_chrome_driver(): + desired_capabilities = webdriver.DesiredCapabilities.CHROME + desired_capabilities['loggingPrefs'] = {'browser': 'ALL'} + + chrome_options = webdriver.ChromeOptions() + chrome_options.add_argument("--user-data-dir=/tmp/browserdata/chrome") + + desired_capabilities.update(chrome_options.to_capabilities()) + + # browser = webdriver.Remote( + # desired_capabilities=desired_capabilities, + # command_executor="http://localhost:14444/wd/hub" + # ) + + browser = webdriver.Chrome(executable_path='chromedriver', desired_capabilities=desired_capabilities) + + # Desktop size + browser.set_window_position(0, 0) + browser.set_window_size(1366, 768) + + # Run authentication + _run_google_authentication(browser, BASE_URL) + + return browser + + +def get_chrome_mobile_driver(): + desired_capabilities = webdriver.DesiredCapabilities.CHROME + desired_capabilities['loggingPrefs'] = {'browser': 'ALL'} + + mobile_emulation = {"deviceName": "Google Nexus 5"} + chrome_options = webdriver.ChromeOptions() + chrome_options.add_experimental_option("mobileEmulation", mobile_emulation) + chrome_options.add_argument("--user-data-dir=/tmp/browserdata/chrome") + + desired_capabilities.update(chrome_options.to_capabilities()) + + # browser = webdriver.Remote( + # desired_capabilities=desired_capabilities, + # command_executor="http://localhost:14444/wd/hub" + # ) + + browser = webdriver.Chrome(executable_path='chromedriver', desired_capabilities=desired_capabilities) + + # Run authentication + _run_google_authentication(browser, BASE_URL) + + return browser + + +def get_firefox_driver(): + desired_capabilities = webdriver.DesiredCapabilities.FIREFOX + desired_capabilities['loggingPrefs'] = {'browser': 'ALL'} + + desired_capabilities['marionette'] = False + + firefox_path = '/Applications/FirefoxNightly.app/Contents/MacOS/firefox-bin' + firefox_log_file = open('/tmp/firefox.log', 'w') + + desired_capabilities['binary'] = FirefoxBinary(firefox_path=firefox_path, log_file=firefox_log_file) + + # firefox_options = webdriver.firefox.options.Options(); + # desired_capabilities.update(firefox_options.to_capabilities()) + + # browser = webdriver.Remote( + # desired_capabilities=desired_capabilities, + # command_executor="http://localhost:24444/wd/hub" + # ) + + profile = webdriver.FirefoxProfile(profile_directory="/tmp/browserdata/firefox") + + browser = webdriver.Firefox(capabilities=desired_capabilities, firefox_profile=profile) + #browser = webdriver.Firefox() + # Desktop size + browser.set_window_position(0, 0) + browser.set_window_size(1366, 768) + + # Run authentication + _run_google_authentication(browser, BASE_URL) + + return browser + + +def get_safari_driver(): + desired_capabilities = webdriver.DesiredCapabilities.SAFARI + desired_capabilities['loggingPrefs'] = {'browser': 'ALL'} + + browser = webdriver.Safari() + + # Desktop size + browser.set_window_position(0, 0) + browser.set_window_size(1366, 768) + + # Run authentication + _run_google_authentication(browser, BASE_URL) + + return browser + + diff --git a/tests/byndmaptests/pages/basepage.py b/tests/byndmaptests/pages/basepage.py new file mode 100644 index 0000000..ab202f3 --- /dev/null +++ b/tests/byndmaptests/pages/basepage.py @@ -0,0 +1,40 @@ +import time +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains + + +class BasePage(object): + url = '' + + def __init__(self, driver, base_url): + self.driver = driver + self.base_url = base_url + + def click_element(self, *locator): + self.driver.find_element(*locator).click() + + def get_page_title(self): + return self.driver.title + + def navigate(self): + if self.url.startswith('/'): + return self.driver.get(self.base_url + self.url) + return self.driver.get(self.url) + + def is_title_matches(self): + return self.title == self.driver.title + + def scroll_to_element(self, element): + actions = ActionChains(self.driver) + actions.move_to_element(element) + actions.perform() + + def scroll_to_bottom(self): + # Scroll to the bottom of the page + self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") + + def get_scroll_position(self): + return self.driver.execute_script("return window.scrollY;") + + def get_error_logs(self): + return self.driver.get_log("browser") diff --git a/tests/byndmaptests/pages/homepage.py b/tests/byndmaptests/pages/homepage.py new file mode 100644 index 0000000..bb20182 --- /dev/null +++ b/tests/byndmaptests/pages/homepage.py @@ -0,0 +1,101 @@ +import time + +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys +from byndmaptests.pages.basepage import BasePage + + +class HomePageLocators(object): + LOGIN = (By.CSS_SELECTOR, 'login alt mat-raised-button') + LOGO = (By.CSS_SELECTOR, '.header-logo') + RANDOM_LOCATION_BTN = (By.CSS_SELECTOR, '.header-logo') + TOOLBAR = (By.CSS_SELECTOR, '.mat-toolbar-row >span.logo') + HEADER_TITLE = (By.CLASS_NAME, 'logo') + #SEARCH + SEARCH_FIELD = (By.CSS_SELECTOR, 'input#md-input-1') + SORT_POST_MENU = (By.CSS_SELECTOR, 'md-select') + #search-sort mat-select ng-tns-c10-2 mat-primary ng-pristine ng-valid ng-touched + ADD_LOCATION_FIELDS = (By.CSS_SELECTOR, '.mat-input-wrapper') + LOCATION_TITLE = (By.CSS_SELECTOR, 'h3:nth-child(1)') + #POSTS + LIST_CONTAINER = (By.CLASS_NAME, 'full-list') + POSTS = (By.CSS_SELECTOR, '#md-card.form-container.mat-card') + + #Individual posts + CHOSEN_POST = (By.CSS_SELECTOR, '.mat-card') + + #Search + ENTER_NEW_LOCATION = (By.CSS_SELECTOR, 'input#autocomplete') + + +class HomePage(BasePage): + url = '/' + title = 'Beyond Map' + + # if applicable, needs a test in test_home + def get_login(self): + return self.driver.find_element(*HomePageLocators.LOGIN) + + def is_title_matches(self): + element = self.driver.find_element(*HomePageLocators.HEADER_TITLE) + return self.title == element.text + + # passed + def get_logo(self): + return self.driver.find_element(*HomePageLocators.LOGO) + + # passed + def get_random_loc_btn(self): + return self.driver.find_element(*HomePageLocators.RANDOM_LOCATION_BTN) + + # passed + def get_toolbar(self): + return self.driver.find_element(*HomePageLocators.TOOLBAR) + + def get_header(self): + return self.driver.find_element(*HomePageLocators.HEADER_TITLE) + + def get_search(self): + return self.driver.find_element(*HomePageLocators.SEARCH_FIELD) + + def search_for_term(self, term): + element = self.driver.find_element(*HomePageLocators.SEARCH_FIELD) + element.clear() + element.send_keys(term) + element.send_keys(Keys.ENTER) + time.sleep(1) + + def search_for_newterm(self, term): + element = self.driver.find_element(*HomePageLocators.SEARCH_FIELD) + element.clear() + element.send_keys(term) + element.send_keys(Keys.ENTER) + time.sleep(2) + # return self.driver.find_elements(*HomePageLocators.SEARCH_FEILD) + + def get_sort_menu(self): + return self.driver.find_element(*HomePageLocators.SORT_POST_MENU) + + def get_location_field(self): + return self.driver.find_element(*HomePageLocators.ADD_LOCATION_FIELDS) + + def get_location_title(self, param): + return self.driver.find_element(*HomePageLocators.LOCATION_TITLE) + + def get_list_container(self): + return self.driver.find_elements(*HomePageLocators.LIST_CONTAINER) + + def get_list_of_post(self): + return self.driver.find_elements(*HomePageLocators.POSTS) + + # Get individual card + def get_card(self): + return self.driver.find_element(*HomePageLocators.CHOSEN_POST) + + + # def get_card_loc(self): + # return self.driver.find_element(*HomePageLocators.POST_LOC) + + def get_location_title(self, param): + pass + diff --git a/tests/byndmaptests/tests/test_home.py b/tests/byndmaptests/tests/test_home.py new file mode 100644 index 0000000..bfc86b1 --- /dev/null +++ b/tests/byndmaptests/tests/test_home.py @@ -0,0 +1,80 @@ + +import unittest + +from byndmaptests.browser import get_browser_driver, BASE_URL +from byndmaptests.pages.homepage import HomePage + + +class HomepageTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.driver = get_browser_driver() + cls.page = HomePage(cls.driver, BASE_URL) + cls.page.navigate() + + def test_no_404_errors(self): + logs = self.page.get_error_logs() + for l in logs: + self.assertNotIn('status of 4', l['message'], msg="4xx errors detected") + + def test_get_logo(self): + assert self.page.get_logo(), "Logo is missing" + + def test_get_rndm_loc(self): + assert self.page.get_random_loc_btn(), "Random button is missing" + + def test_get_toolbar(self): + title = self.page.get_toolbar() + assert "Beyond Adventure Log", title + + def test_get_searchbar(self): + assert self.page.get_search(), "Searchbar is missing" + + def test_search_term(self): + # want to assert that the term search matches the term entered + location_name = self.page.search_for_term('New York') + assert "New York", location_name + + def test_search_term2(self): + location_name = self.page.search_for_term('London') + assert "London", location_name + + # assert len(results) > 0, "No search results found" + # + # # Select card + # location = results[0] + # homepage = HomePage(self.driver, BASE_URL) + # homepage.url = location.get_attribute('href') + # homepage.title = location.text + # homepage.navigate() + # + # assert len(homepage.get_page_title()) > 10, "Search result does not exist" + + def test_get_sort_menu(self): + list = self.page.get_sort_menu(), "Sort menu is missing" + assert len(list) < 5, "List items are missing" + + def test_get_loc_field(self): + assert self.page.get_location_field(), "location field is missing" + + def test_get_header_title(self): + assert self.page.get_header(), "Location header is missing" + + def test_get_list_container(self): + items = self.page.get_list_container() + assert len(items) >= 1, "Container is missing- No list" + + def test_get_location_title(self): + loc_title_field = self.page.get_location_title('Add a location') + assert "Add a location", loc_title_field + + def test_get_listitems(self): + post = self.page.get_list_of_post() + assert post >= 1, "Missing posts" + print len(post) + + + @classmethod + def tearDownClass(cls): + cls.driver.close()