Source code for pom.base
"""
----------------
POM base classes
----------------
"""
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import logging
import re
from selenium import webdriver
from pom import ui
from pom import utils
from pom.exceptions import PomError
__all__ = [
'App',
'Page',
'register_pages',
]
LOGGER = logging.getLogger(__name__)
browsers = {
'chrome': webdriver.Chrome,
'edge': webdriver.Edge,
'firefox': webdriver.Firefox,
'ie': webdriver.Ie,
'opera': webdriver.Opera,
'safari': webdriver.Safari,
'phantom': webdriver.PhantomJS,
}
[docs]def register_pages(pages):
"""Decorator to register pages in application."""
def wrapper(cls):
"""Wrapper to register pages."""
cls._registered_pages.extend(pages)
cls._registered_pages.sort(
key=lambda page: len(page.url), reverse=True)
for page in pages:
func_name = utils.camel2snake(page.__name__)
def page_getter(self, page=page):
return page(self)
page_getter.__name__ = func_name
page_getter = property(utils.cache(page_getter))
setattr(cls, func_name, page_getter)
return cls
return wrapper
[docs]class App(object):
"""Web application.
Args:
url (str): URL of web application.
browser (str): Name of browser to launch.
*args: Selenium arguments.
**kwgs: Selenium keyword arguments.
"""
_registered_pages = []
def __init__(self, url, browser, *args, **kwgs):
self.app_url = url.strip('/')
LOGGER.info('Start {!r} browser'.format(browser))
self.webdriver = browsers[browser](*args, **kwgs)
[docs] def open(self, url):
"""Open web application URL.
Args:
url (str): URL.
"""
self.webdriver.get(self.app_url + url)
[docs] def quit(self):
"""Close browser."""
LOGGER.info('Close browser')
self.webdriver.quit()
@property
def current_page(self):
"""Current opened web application page.
Returns:
Page: Current opened page.
Raises:
PomError: If current page is not defined.
"""
current_url = self.webdriver.current_url
for page in self._registered_pages:
if re.match(self.app_url + page.url, current_url):
return getattr(self, utils.camel2snake(page.__name__))
else:
raise PomError("Can't define current page")
[docs]class Page(ui.Container):
"""Page of web application.
Args:
app (App): Web application.
"""
url = None
def __init__(self, app):
self.app = app
self.webdriver = self.webelement = app.webdriver
@utils.log
[docs] def refresh(self):
"""Refresh page."""
self.webdriver.refresh()
@utils.log
[docs] def open(self):
"""Open page."""
self.app.open(self.url)
@utils.log
[docs] def forward(self):
"""Forward."""
self.webdriver.forward()
@utils.log
[docs] def back(self):
"""Back."""
self.webdriver.back()
@property
@utils.log
def source(self):
"""Page source code."""
return self.webdriver.page_source
@utils.log
[docs] def exec_js(self, js_code, async=False):
"""Execute javascript code.
Args:
js_code (str): Valid javascript code.
async (bool, optional): Flag to execute javascript code
asynchronously or not. Defaults to ``False``.
"""
if async:
self.webdriver.execute_async_script(js_code)
else:
self.webdriver.execute_script(js_code)