Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

# IDEs and editors
/.idea
*.idea
.project
.classpath
.c9/
Expand All @@ -35,6 +36,15 @@
npm-debug.log
testem.log
/typings
env/
bin/
*.log
*.swp
*.pyc
*.komodoproject
/__init__.py
/__init__.pyc
.pyc

# e2e
/e2e/*.js
Expand All @@ -43,3 +53,4 @@ testem.log
#System Files
.DS_Store
Thumbs.db

121 changes: 121 additions & 0 deletions tests/byndmaptests/browser.py
Original file line number Diff line number Diff line change
@@ -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


40 changes: 40 additions & 0 deletions tests/byndmaptests/pages/basepage.py
Original file line number Diff line number Diff line change
@@ -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")
101 changes: 101 additions & 0 deletions tests/byndmaptests/pages/homepage.py
Original file line number Diff line number Diff line change
@@ -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

80 changes: 80 additions & 0 deletions tests/byndmaptests/tests/test_home.py
Original file line number Diff line number Diff line change
@@ -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()