Source code for fobi.tests.base
import logging
import os
from datetime import datetime
from django.conf import settings
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
from django.core.management import call_command
from django.urls import reverse
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
from selenium.webdriver.support.wait import WebDriverWait
from . import constants
from .helpers import get_or_create_admin_user, phantom_js_clean_up, setup_app
__title__ = "fobi.tests.test_browser_build_dynamic_forms"
__author__ = "Artur Barseghyan <artur.barseghyan@gmail.com>"
__copyright__ = "2014-2019 Artur Barseghyan"
__license__ = "GPL 2.0/LGPL 2.1"
__all__ = ("BaseFobiBrowserBuldDynamicFormsTest",)
logger = logging.getLogger(__name__)
TIMEOUT = 4
LONG_TIMEOUT = 8
WAIT = False
WAIT_FOR = 0
[docs]class BaseFobiBrowserBuldDynamicFormsTest(StaticLiveServerTestCase):
"""Browser tests django-fobi bulding forms functionality.
Backed up by selenium. This test is based on the bootstrap3 theme.
"""
reset_sequences = True
cleans_up_after_itself = True
try:
LIVE_SERVER_URL = settings.LIVE_SERVER_URL
except Exception as e:
LIVE_SERVER_URL = None
[docs] def tearDown(self):
"""Tear down."""
super(BaseFobiBrowserBuldDynamicFormsTest, self).tearDown()
call_command(
"flush",
verbosity=0,
interactive=False,
reset_sequences=True,
allow_cascade=True,
inhibit_post_migrate=False,
)
[docs] @classmethod
def setUpClass(cls):
"""Set up class."""
chrome_driver_path = getattr(
settings, "CHROME_DRIVER_EXECUTABLE_PATH", None
)
chrome_driver_options = getattr(settings, "CHROME_DRIVER_OPTIONS", None)
firefox_bin_path = getattr(settings, "FIREFOX_BIN_PATH", None)
phantom_js_executable_path = getattr(
settings, "PHANTOM_JS_EXECUTABLE_PATH", None
)
if chrome_driver_path is not None:
cls.driver = webdriver.Chrome(
executable_path=chrome_driver_path,
options=chrome_driver_options,
)
elif phantom_js_executable_path is not None:
if phantom_js_executable_path:
cls.driver = webdriver.PhantomJS(
executable_path=phantom_js_executable_path
)
else:
cls.driver = webdriver.PhantomJS()
elif firefox_bin_path:
binary = FirefoxBinary(firefox_bin_path)
cls.driver = webdriver.Firefox(firefox_binary=binary)
else:
cls.driver = webdriver.Firefox()
setup_app(fobi_sync_plugins=True)
# user = get_or_create_admin_user()
# create_form_with_entries(user)
super(BaseFobiBrowserBuldDynamicFormsTest, cls).setUpClass()
[docs] @classmethod
def tearDownClass(cls):
"""Tear down class."""
try:
cls.driver.quit()
phantom_js_clean_up()
except Exception as err:
print(err)
super(BaseFobiBrowserBuldDynamicFormsTest, cls).tearDownClass()
call_command(
"flush",
verbosity=0,
interactive=False,
reset_sequences=True,
allow_cascade=True,
inhibit_post_migrate=False,
)
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +++++++++++++++++++++++++ Internals +++++++++++++++++++++++++++
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# +++++++++++++++++++++++++++ General +++++++++++++++++++++++++++
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
def _maximize_window(self):
self.driver.set_window_position(0, 0)
self.driver.set_window_size(1024 * 2, 768 * 2)
self.driver.maximize_window()
def _get_live_server_url(self):
"""Get live server URL."""
return (
self.LIVE_SERVER_URL
if self.LIVE_SERVER_URL
else self.live_server_url
)
def _authenticate(self):
"""Authenticate."""
# Make sure the user exists
user = get_or_create_admin_user()
self.driver.get(
"{0}{1}".format(self._get_live_server_url(), reverse("auth_login"))
)
self._maximize_window()
username_input = self.driver.find_element(By.NAME, "username")
username_input.send_keys(constants.FOBI_TEST_USER_USERNAME)
password_input = self.driver.find_element(By.NAME, "password")
password_input.send_keys(constants.FOBI_TEST_USER_PASSWORD)
self.driver.find_element(By.XPATH, '//button[@type="submit"]').click()
# Wait until the list view opens
WebDriverWait(self.driver, timeout=TIMEOUT).until(
# lambda driver: driver.find_element(By.ID, 'id_main')
lambda driver: driver.find_element(
By.XPATH, '//body[contains(@class, "theme")]'
)
)
def _sleep(self, wait=WAIT_FOR):
"""Sleep."""
if WAIT and wait:
self.driver.implicitly_wait(wait)
def _click(self, element):
"""Click on any element."""
self.driver.execute_script("arguments[0].click();", element)
def _aggressive_click(self, element):
"""Aggressive click."""
link = element.get_attribute("href")
self.driver.get(link)
def _scroll_to_element(self, form_element, simple=False):
"""Scroll to element."""
coordinates = form_element.location_once_scrolled_into_view
if simple:
return
x = coordinates.get("x", 0)
y = coordinates.get("y", 0)
self.driver.execute_script("window.scrollTo({0}, {1});".format(x, y))
self.driver.execute_script("window.scrollBy({0}, {1});".format(0, -100))
def _move_to_element(self, form_element, simple=False):
"""Move to element."""
ActionChains(self.driver).move_to_element(form_element).perform()
def _scroll_to(self, x, y):
"""Scroll to."""
self.driver.execute_script("window.scrollTo({0}, {1});".format(x, y))
def _scroll_by(self, x, y):
"""Scroll by."""
self.driver.execute_script("window.scrollBy({0}, {1});".format(x, y))
def _scroll_page_top(self):
"""Scroll to the page top."""
html = self.driver.find_element(By.TAG_NAME, "html")
html.send_keys(Keys.HOME)
def _scroll_page_bottom(self):
"""Scroll to the page bottom."""
html = self.driver.find_element(By.TAG_NAME, "html")
html.send_keys(Keys.END)
[docs] def take_screenshot(self, name="screenshot"):
now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = os.path.join(settings.STATIC_ROOT, f"{name}-{now}.png")
self.driver.get_screenshot_as_file(filename)
logger.debug(f"Screenshot saved in: {filename}")
return filename