Skip to content

Commit

Permalink
Allow {RemoteNode} tag in baseline_name property
Browse files Browse the repository at this point in the history
  • Loading branch information
rgonalo committed Mar 24, 2016
1 parent ca88a00 commit 8796c85
Show file tree
Hide file tree
Showing 7 changed files with 160 additions and 86 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.rst
Expand Up @@ -18,7 +18,8 @@ v1.0.0
- Save WebElement in PageElement to avoid searching the same element multiple times
- Refactor to rename get_element to get_web_element in Utils class and element to web_element in PageElement class
- Allow to run API tests with behave: browser property must be empty
- Baseline name property can contain *{platformVersion}* to add actual platform version to the baseline name
- Baseline name property can contain *{PlatformVersion}* or *{RemoteNode}* to add actual platform version or remote
node name to the baseline name
- Add force parameter to *assert_screenshot* methods to compare the screenshot even if visual testing is disabled by
configuration

Expand Down
2 changes: 2 additions & 0 deletions docs/visual_testing.rst
Expand Up @@ -132,6 +132,8 @@ baseline_name
- *{Browser_browser}*: depending on the value of *browser* property, baseline_name might take one of these values: firefox, iexplore, chrome... This is the value by default.
- *{Browser_browser}-{Capabilities_version}-{Capabilities_platform}*: baseline_name might take one of these values: iexplore-11-WIN8, safari-9.0-YOSEMITE...
- *{AppiumCapabilities_deviceName}-{AppiumCapabilities_platformVersion}*: baseline_name might take one of these values: iPhone_6-8.3, iPhone_6-9.1, iPhone_6s-9.1...
- *{PlatformVersion}*: baseline_name will take the value of the mobile platform version, instead of the platformVersion configuration property
- *{RemoteNode}*: baseline_name will take the value of the remote node name

engine
~~~~~~
Expand Down
27 changes: 24 additions & 3 deletions toolium/driver_wrapper.py
Expand Up @@ -34,7 +34,8 @@ class DriverWrapper(object):
:type utils: toolium.utils.Utils
:type app_strings: dict
:type session_id: str
:type remote_video_node: str
:type remote_node: str
:type remote_node_video_enabled: bool
:type logger: logging.Logger
:type config_properties_filenames: str
:type config_log_filename: str
Expand All @@ -47,7 +48,8 @@ class DriverWrapper(object):
utils = None #: test utils instance
app_strings = None #: mobile application strings
session_id = None #: remote webdriver session id
remote_video_node = None #: remote webdriver video node
remote_node = None #: remote grid node
remote_node_video_enabled = False #: True if the remote grid node has the video recorder enabled
logger = None #: logger instance

# Configuration and output files
Expand Down Expand Up @@ -135,6 +137,21 @@ def configure_visual_baseline(self):
self.visual_baseline_directory = os.path.join(DriverWrappersPool.output_directory, 'visualtests',
'baseline', baseline_name)

def update_visual_baseline(self):
"""Configure baseline directory after driver is created"""
# Update baseline with real platformVersion value
if '{PlatformVersion}' in self.baseline_name:
platform_version = self.driver.desired_capabilities['platformVersion']
self.baseline_name = self.baseline_name.replace('{PlatformVersion}', str(platform_version))
self.visual_baseline_directory = os.path.join(DriverWrappersPool.output_directory, 'visualtests',
'baseline', self.baseline_name)

# Update baseline with remote node value
if '{RemoteNode}' in self.baseline_name:
self.baseline_name = self.baseline_name.replace('{RemoteNode}', str(self.remote_node))
self.visual_baseline_directory = os.path.join(DriverWrappersPool.output_directory, 'visualtests',
'baseline', self.baseline_name)

def configure(self, is_selenium_test=True, tc_config_files=ConfigFiles()):
"""Configure initial selenium instance using logging and properties files for Selenium or Appium tests
Expand Down Expand Up @@ -169,7 +186,8 @@ def connect(self, maximize=True):

# Save session id and remote node to download video after the test execution
self.session_id = self.driver.session_id
self.remote_video_node = self.utils.get_remote_video_node()
self.remote_node = self.utils.get_remote_node()
self.remote_node_video_enabled = self.utils.is_remote_video_enabled(self.remote_node)

# Save app_strings in mobile tests
if self.is_mobile_test() and not self.is_web_test() and self.config.getboolean_optional('Common',
Expand All @@ -180,6 +198,9 @@ def connect(self, maximize=True):
if maximize and self.is_maximizable():
self.driver.maximize_window()

# Update baseline
self.update_visual_baseline()

return self.driver

def is_android_test(self):
Expand Down
4 changes: 2 additions & 2 deletions toolium/driver_wrappers_pool.py
Expand Up @@ -109,9 +109,9 @@ def download_video(cls, driver_wrapper, name, test_passed=True):
video_name = '{}_driver{}' if len(cls.driver_wrappers) > 1 else '{}'
driver_index = 1
if ((driver_wrapper.config.getboolean_optional('Server', 'video_enabled')
or not test_passed) and driver_wrapper.remote_video_node):
or not test_passed) and driver_wrapper.remote_node_video_enabled):
video_name = video_name if test_passed else 'error_{}'.format(video_name)
driver_wrapper.utils.download_remote_video(driver_wrapper.remote_video_node, driver_wrapper.session_id,
driver_wrapper.utils.download_remote_video(driver_wrapper.remote_node, driver_wrapper.session_id,
video_name.format(name, driver_index))

@classmethod
Expand Down
161 changes: 116 additions & 45 deletions toolium/test/test_driver_wrapper.py
Expand Up @@ -53,123 +53,123 @@ def setUp(self):
DriverWrapper.config_properties_filenames = None

# Create a new wrapper
self.wrapper = DriverWrappersPool.get_default_wrapper()
self.driver_wrapper = DriverWrappersPool.get_default_wrapper()

config_files = ConfigFiles()
config_files.set_config_directory(os.path.join(self.root_path, 'conf'))
config_files.set_output_directory(os.path.join(self.root_path, 'output'))
DriverWrappersPool.configure_common_directories(config_files)
self.wrapper.configure_logger()
self.driver_wrapper.configure_logger()

def test_configure_properties(self):
os.environ["Config_prop_filenames"] = 'properties.cfg'
self.wrapper.configure_properties()
assert_equal('firefox', self.wrapper.config.get('Browser', 'browser')) # get last value
assert_equal('5', self.wrapper.config.get_optional('Common', 'implicitly_wait')) # only in properties
assert_equal(None, self.wrapper.config.get_optional('AppiumCapabilities', 'app')) # only in android
self.driver_wrapper.configure_properties()
assert_equal('firefox', self.driver_wrapper.config.get('Browser', 'browser')) # get last value
assert_equal('5', self.driver_wrapper.config.get_optional('Common', 'implicitly_wait')) # only in properties
assert_equal(None, self.driver_wrapper.config.get_optional('AppiumCapabilities', 'app')) # only in android

def test_configure_properties_android(self):
os.environ["Config_prop_filenames"] = 'android-properties.cfg'
self.wrapper.configure_properties()
assert_equal('android', self.wrapper.config.get('Browser', 'browser')) # get last value
assert_equal(None, self.wrapper.config.get_optional('Common', 'implicitly_wait')) # only in properties
self.driver_wrapper.configure_properties()
assert_equal('android', self.driver_wrapper.config.get('Browser', 'browser')) # get last value
assert_equal(None, self.driver_wrapper.config.get_optional('Common', 'implicitly_wait')) # only in properties
assert_equal('http://invented_url/Demo.apk',
self.wrapper.config.get_optional('AppiumCapabilities', 'app')) # only in android
self.driver_wrapper.config.get_optional('AppiumCapabilities', 'app')) # only in android

def test_configure_properties_two_files(self):
os.environ["Config_prop_filenames"] = 'properties.cfg;android-properties.cfg'
self.wrapper.configure_properties()
assert_equal('android', self.wrapper.config.get('Browser', 'browser')) # get last value
assert_equal('5', self.wrapper.config.get_optional('Common', 'implicitly_wait')) # only in properties
self.driver_wrapper.configure_properties()
assert_equal('android', self.driver_wrapper.config.get('Browser', 'browser')) # get last value
assert_equal('5', self.driver_wrapper.config.get_optional('Common', 'implicitly_wait')) # only in properties
assert_equal('http://invented_url/Demo.apk',
self.wrapper.config.get_optional('AppiumCapabilities', 'app')) # only in android
self.driver_wrapper.config.get_optional('AppiumCapabilities', 'app')) # only in android

def test_configure_properties_two_files_android_first(self):
os.environ["Config_prop_filenames"] = 'android-properties.cfg;properties.cfg'
self.wrapper.configure_properties()
assert_equal('firefox', self.wrapper.config.get('Browser', 'browser')) # get last value
assert_equal('5', self.wrapper.config.get_optional('Common', 'implicitly_wait')) # only in properties
self.driver_wrapper.configure_properties()
assert_equal('firefox', self.driver_wrapper.config.get('Browser', 'browser')) # get last value
assert_equal('5', self.driver_wrapper.config.get_optional('Common', 'implicitly_wait')) # only in properties
assert_equal('http://invented_url/Demo.apk',
self.wrapper.config.get_optional('AppiumCapabilities', 'app')) # only in android
self.driver_wrapper.config.get_optional('AppiumCapabilities', 'app')) # only in android

def test_configure_properties_system_property(self):
os.environ["Config_prop_filenames"] = 'properties.cfg'
os.environ["Browser_browser"] = 'opera'
self.wrapper.configure_properties()
assert_equal('opera', self.wrapper.config.get('Browser', 'browser'))
self.driver_wrapper.configure_properties()
assert_equal('opera', self.driver_wrapper.config.get('Browser', 'browser'))

def test_configure_properties_file_default_file(self):
self.wrapper.configure_properties()
assert_equal('firefox', self.wrapper.config.get('Browser', 'browser'))
self.driver_wrapper.configure_properties()
assert_equal('firefox', self.driver_wrapper.config.get('Browser', 'browser'))

def test_configure_properties_file_not_found(self):
os.environ["Config_prop_filenames"] = 'notfound-properties.cfg'
with assert_raises(Exception) as cm:
self.wrapper.configure_properties()
self.driver_wrapper.configure_properties()
assert_in('Properties config file not found', str(cm.exception))

def test_configure_properties_no_changes(self):
# Configure properties
os.environ["Config_prop_filenames"] = 'properties.cfg'
self.wrapper.configure_properties()
assert_equal('firefox', self.wrapper.config.get('Browser', 'browser'))
self.driver_wrapper.configure_properties()
assert_equal('firefox', self.driver_wrapper.config.get('Browser', 'browser'))

# Modify property
new_browser = 'opera'
self.wrapper.config.set('Browser', 'browser', new_browser)
assert_equal(new_browser, self.wrapper.config.get('Browser', 'browser'))
self.driver_wrapper.config.set('Browser', 'browser', new_browser)
assert_equal(new_browser, self.driver_wrapper.config.get('Browser', 'browser'))

# Trying to configure again
self.wrapper.configure_properties()
self.driver_wrapper.configure_properties()

# Configuration has not been initialized
assert_equal(new_browser, self.wrapper.config.get('Browser', 'browser'))
assert_equal(new_browser, self.driver_wrapper.config.get('Browser', 'browser'))

def test_configure_properties_change_configuration_file(self):
# Configure properties
os.environ["Config_prop_filenames"] = 'properties.cfg'
self.wrapper.configure_properties()
assert_equal('firefox', self.wrapper.config.get('Browser', 'browser'))
self.driver_wrapper.configure_properties()
assert_equal('firefox', self.driver_wrapper.config.get('Browser', 'browser'))

# Modify property
new_browser = 'opera'
self.wrapper.config.set('Browser', 'browser', new_browser)
assert_equal(new_browser, self.wrapper.config.get('Browser', 'browser'))
self.driver_wrapper.config.set('Browser', 'browser', new_browser)
assert_equal(new_browser, self.driver_wrapper.config.get('Browser', 'browser'))

# Change file and try to configure again
os.environ["Config_prop_filenames"] = 'android-properties.cfg'
self.wrapper.configure_properties()
self.driver_wrapper.configure_properties()

# Check that configuration has been initialized
assert_equal('android', self.wrapper.config.get('Browser', 'browser'))
assert_equal('android', self.driver_wrapper.config.get('Browser', 'browser'))


class DriverWrapperLoggerTests(DriverWrapperCommon):
def setUp(self):
self.wrapper = DriverWrappersPool.get_default_wrapper()
self.driver_wrapper = DriverWrappersPool.get_default_wrapper()
config_files = ConfigFiles()
config_files.set_config_directory(os.path.join(self.root_path, 'conf'))
config_files.set_output_directory(os.path.join(self.root_path, 'output'))
DriverWrappersPool.configure_common_directories(config_files)

def test_configure_logger(self):
os.environ["Config_log_filename"] = 'logging.conf'
self.wrapper.configure_logger()
assert_equal('DEBUG', logging.getLevelName(self.wrapper.logger.getEffectiveLevel()))
self.driver_wrapper.configure_logger()
assert_equal('DEBUG', logging.getLevelName(self.driver_wrapper.logger.getEffectiveLevel()))

def test_configure_logger_file_not_configured(self):
self.wrapper.configure_logger()
self.wrapper.logger.info('No error, default logging configuration')
self.driver_wrapper.configure_logger()
self.driver_wrapper.logger.info('No error, default logging configuration')

def test_configure_logger_file_not_found(self):
os.environ["Config_log_filename"] = 'notfound-logging.conf'
self.wrapper.configure_logger()
self.wrapper.logger.info('No error, default logging configuration')
self.driver_wrapper.configure_logger()
self.driver_wrapper.logger.info('No error, default logging configuration')

def test_configure_logger_no_changes(self):
# Configure logger
os.environ["Config_log_filename"] = 'logging.conf'
self.wrapper.configure_logger()
self.driver_wrapper.configure_logger()
logger = logging.getLogger('selenium.webdriver.remote.remote_connection')
assert_equal('DEBUG', logging.getLevelName(logger.level))

Expand All @@ -179,7 +179,7 @@ def test_configure_logger_no_changes(self):
assert_equal(new_level, logging.getLevelName(logger.level))

# Trying to configure again
self.wrapper.configure_logger()
self.driver_wrapper.configure_logger()

# Configuration has not been initialized
assert_equal(new_level, logging.getLevelName(logger.level))
Expand All @@ -197,12 +197,83 @@ def test_configure_logger_change_configuration_file(self):

# Change file and try to configure again
os.environ["Config_log_filename"] = 'warn-logging.conf'
self.wrapper.configure_logger()
self.driver_wrapper.configure_logger()

# Check that configuration has been initialized
assert_equal('WARNING', logging.getLevelName(logger.level))


class DriverWrapperBaselineTests(DriverWrapperCommon):
def setUp(self):
# Reset wrappers pool values
DriverWrappersPool._empty_pool()
DriverWrapper.config_properties_filenames = None

# Create a new wrapper
self.driver_wrapper = DriverWrappersPool.get_default_wrapper()

config_files = ConfigFiles()
config_files.set_config_directory(os.path.join(self.root_path, 'conf'))
config_files.set_output_directory(os.path.join(self.root_path, 'output'))
DriverWrappersPool.configure_common_directories(config_files)
self.driver_wrapper.configure_properties()

def test_configure_visual_baseline_not_configured(self):
self.driver_wrapper.config.remove_option('VisualTests', 'baseline_name')

self.driver_wrapper.configure_visual_baseline()

expected_baseline_directory = os.path.join(self.root_path, 'output', 'visualtests', 'baseline', 'firefox')
assert_equal(self.driver_wrapper.baseline_name, 'firefox')
assert_equal(self.driver_wrapper.visual_baseline_directory, expected_baseline_directory)

def test_configure_visual_baseline_browser(self):
self.driver_wrapper.config.set('VisualTests', 'baseline_name', '{Browser_browser}')

self.driver_wrapper.configure_visual_baseline()

expected_baseline_directory = os.path.join(self.root_path, 'output', 'visualtests', 'baseline', 'firefox')
assert_equal(self.driver_wrapper.baseline_name, 'firefox')
assert_equal(self.driver_wrapper.visual_baseline_directory, expected_baseline_directory)

def test_update_visual_baseline_platform_version(self):
# Configure baseline and driver mock
self.driver_wrapper.config.set('VisualTests', 'baseline_name', 'ios_{PlatformVersion}')
self.driver_wrapper.driver = mock.MagicMock()
self.driver_wrapper.driver.desired_capabilities.__getitem__.return_value = '9.3'

self.driver_wrapper.configure_visual_baseline()
self.driver_wrapper.update_visual_baseline()

expected_baseline_directory = os.path.join(self.root_path, 'output', 'visualtests', 'baseline', 'ios_9.3')
assert_equal(self.driver_wrapper.baseline_name, 'ios_9.3')
assert_equal(self.driver_wrapper.visual_baseline_directory, expected_baseline_directory)

def test_update_visual_baseline_remote_node(self):
# Configure baseline and remote node
self.driver_wrapper.config.set('VisualTests', 'baseline_name', 'firefox_{RemoteNode}')
self.driver_wrapper.remote_node = '255.255.255.255'

self.driver_wrapper.configure_visual_baseline()
self.driver_wrapper.update_visual_baseline()

expected_baseline_directory = os.path.join(self.root_path, 'output', 'visualtests', 'baseline',
'firefox_255.255.255.255')
assert_equal(self.driver_wrapper.baseline_name, 'firefox_255.255.255.255')
assert_equal(self.driver_wrapper.visual_baseline_directory, expected_baseline_directory)

def test_update_visual_baseline_remote_node_empty(self):
# Configure baseline
self.driver_wrapper.config.set('VisualTests', 'baseline_name', 'firefox_{RemoteNode}')

self.driver_wrapper.configure_visual_baseline()
self.driver_wrapper.update_visual_baseline()

expected_baseline_directory = os.path.join(self.root_path, 'output', 'visualtests', 'baseline', 'firefox_None')
assert_equal(self.driver_wrapper.baseline_name, 'firefox_None')
assert_equal(self.driver_wrapper.visual_baseline_directory, expected_baseline_directory)


# (browser, is_mobile, is_android, is_ios)
mobile_tests = (
('android-4.1.2-on-android', True, True, False),
Expand Down

0 comments on commit 8796c85

Please sign in to comment.