From 3e36ec413f7b500d93efddfec66f1a2a81bd718b Mon Sep 17 00:00:00 2001 From: Suresh V Date: Tue, 7 Apr 2015 16:19:08 +0530 Subject: [PATCH 1/5] Make browser_instance_getter session scoped --- pytest_splinter/plugin.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/pytest_splinter/plugin.py b/pytest_splinter/plugin.py index 477b7ce..18705f5 100644 --- a/pytest_splinter/plugin.py +++ b/pytest_splinter/plugin.py @@ -17,6 +17,7 @@ import pytest # pragma: no cover import splinter # pragma: no cover from _pytest import junitxml +from _pytest.tmpdir import tmpdir from selenium.webdriver.support import wait @@ -29,6 +30,9 @@ NAME_RE = re.compile('[\W]') +@pytest.fixture(scope='session') +def session_tmpdir(request): + return tmpdir(request) def _visit(self, url): """Override splinter's visit to avoid unnecessary checks and add wait_until instead.""" @@ -234,7 +238,7 @@ def browser_patches(splinter_selenium_socket_timeout): patch_webdriverelement() -@pytest.fixture +@pytest.fixture(scope='session') def browser_instance_getter( request, browser_patches, @@ -254,7 +258,7 @@ def browser_instance_getter( splinter_selenium_speed, splinter_webdriver, splinter_window_size, - tmpdir, + session_tmpdir, browser_pool, ): """Splinter browser instance getter. To be used for getting of plugin.Browser's instances. @@ -314,7 +318,7 @@ def prepare_browser(parent): prepare_browser(parent) def make_screenshot_on_failure(): - if splinter_make_screenshot_on_failure and request.node.splinter_failure: + if splinter_make_screenshot_on_failure and getattr(request.node, 'splinter_failure', None): slaveoutput = getattr(request.config, 'slaveoutput', None) names = junitxml.mangle_testnames(request.node.nodeid.split("::")) classname = '.'.join(names[:-1]) @@ -325,7 +329,7 @@ def make_screenshot_on_failure(): if not os.path.exists(screenshot_dir): os.makedirs(screenshot_dir) else: - screenshot_dir = tmpdir.mkdir('screenshots').strpath + screenshot_dir = session_tmpdir.mkdir('screenshots').strpath screenshot_path = os.path.join(screenshot_dir, screenshot_file_name) LOGGER.info('Saving screenshot to {0}'.format(screenshot_path)) try: From f5a1d4beaf8558b46ca3918e70df9c01d24df9a5 Mon Sep 17 00:00:00 2001 From: Suresh V Date: Tue, 7 Apr 2015 16:20:31 +0530 Subject: [PATCH 2/5] Make browser_instance_getter session scoped --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index da83678..b8c6382 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,12 @@ Changelog ========= +Unreleased +---------- + +- make browser_instance_getter session scoped (sureshvv) + + 1.3.3 ----- From b761217bcac41466d61c7046b7e52b525d6daa1a Mon Sep 17 00:00:00 2001 From: Suresh V Date: Thu, 9 Apr 2015 14:52:04 +0530 Subject: [PATCH 3/5] command line option --splinter-webdriver-executable for chrome/phantomjs --- CHANGES.rst | 5 +++++ pytest_splinter/plugin.py | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 3c82cd1..8ba5f8a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,11 @@ Changelog ========= +Unreleased +---------- + +- add option --splinter-webdriver-executable for phantomjs and chrome (sureshvv) + 1.3.4 ----- diff --git a/pytest_splinter/plugin.py b/pytest_splinter/plugin.py index dd783f9..a21d295 100644 --- a/pytest_splinter/plugin.py +++ b/pytest_splinter/plugin.py @@ -29,10 +29,13 @@ NAME_RE = re.compile('[\W]') + @pytest.fixture(scope='session') def session_tmpdir(request): + """ provide a session scoped tmpdir. """ return tmpdir(request) + def _visit(self, url): """Override splinter's visit to avoid unnecessary checks and add wait_until instead.""" self.__dict__.pop('status_code', None) @@ -213,6 +216,12 @@ def splinter_screenshot_dir(request): return os.path.abspath(request.config.option.splinter_screenshot_dir) +@pytest.fixture(scope='session') +def splinter_webdriver_executable(request): + """Webdriver executable directory.""" + return os.path.abspath(request.config.option.splinter_webdriver_executable) + + @pytest.fixture(scope='session') def browser_pool(request, splinter_close_browser): """Browser 'pool' to emulate session scope but with possibility to recreate browser.""" @@ -258,6 +267,7 @@ def browser_instance_getter( splinter_make_screenshot_on_failure, splinter_remote_url, splinter_screenshot_dir, + splinter_webdriver_executable, splinter_selenium_implicit_wait, splinter_selenium_socket_timeout, splinter_selenium_speed, @@ -285,6 +295,9 @@ def get_browser(): kwargs['profile'] = splinter_firefox_profile_directory elif splinter_webdriver == 'remote': kwargs['url'] = splinter_remote_url + elif splinter_webdriver in ('phantomjs', 'chrome'): + if splinter_webdriver_executable: + kwargs['executable_path'] = splinter_webdriver_executable if splinter_driver_kwargs: kwargs.update(splinter_driver_kwargs) @@ -326,6 +339,7 @@ def prepare_browser(request, parent): return prepare_browser + @pytest.yield_fixture(autouse=True) def browser_screenshot(request, splinter_screenshot_dir): """Make browser screenshot on test failure.""" @@ -440,3 +454,8 @@ def pytest_addoption(parser): # pragma: no cover "--splinter-screenshot-dir", help="pytest-splinter browser screenshot directory. Defaults to the current directory.", action="store", dest='splinter_screenshot_dir', metavar="DIR", default='.') + group.addoption( + "--splinter-webdriver-executable", + help="pytest-splinter webdrive executable path. Defaults to unspecified in which case it is taken from PATH", + action="store", + dest='splinter_webdriver_executable', metavar="DIR", default='') From 740be292a938cdc466f6195eda9ae8fad0bf586b Mon Sep 17 00:00:00 2001 From: Suresh V Date: Sat, 11 Apr 2015 22:44:10 +0530 Subject: [PATCH 4/5] Improved test coverage --- pytest_splinter/plugin.py | 50 +++++++++++++++++++++++---------------- tests/test_plugin.py | 9 +++++++ 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/pytest_splinter/plugin.py b/pytest_splinter/plugin.py index a21d295..3463509 100644 --- a/pytest_splinter/plugin.py +++ b/pytest_splinter/plugin.py @@ -253,6 +253,33 @@ def session_tmpdir(request): return tmpdir(request) +def get_args(splinter_webdriver, splinter_file_download_dir, splinter_download_file_types, + splinter_firefox_profile_preferences, splinter_firefox_profile_directory, + splinter_remote_url, splinter_webdriver_executable, splinter_driver_kwargs): + """ pulled out for separate testing. """ + kwargs = {} + + if splinter_webdriver == 'firefox': + kwargs['profile_preferences'] = dict({ + 'browser.download.folderList': 2, + 'browser.download.manager.showWhenStarting': False, + 'browser.download.dir': splinter_file_download_dir, + 'browser.helperApps.neverAsk.saveToDisk': splinter_download_file_types, + 'browser.helperApps.alwaysAsk.force': False, + 'pdfjs.disabled': True, # disable internal ff pdf viewer to allow auto pdf download + }, **splinter_firefox_profile_preferences) + kwargs['profile'] = splinter_firefox_profile_directory + elif splinter_webdriver == 'remote': + kwargs['url'] = splinter_remote_url + elif splinter_webdriver in ('phantomjs', 'chrome'): + if splinter_webdriver_executable: + kwargs['executable_path'] = splinter_webdriver_executable + if splinter_driver_kwargs: + kwargs.update(splinter_driver_kwargs) + + return kwargs + + @pytest.fixture(scope='session') def browser_instance_getter( browser_patches, @@ -281,26 +308,9 @@ def browser_instance_getter( :return: function(parent). Each time this function will return new instance of plugin.Browser class. """ def get_browser(): - kwargs = {} - - if splinter_webdriver == 'firefox': - kwargs['profile_preferences'] = dict({ - 'browser.download.folderList': 2, - 'browser.download.manager.showWhenStarting': False, - 'browser.download.dir': splinter_file_download_dir, - 'browser.helperApps.neverAsk.saveToDisk': splinter_download_file_types, - 'browser.helperApps.alwaysAsk.force': False, - 'pdfjs.disabled': True, # disable internal ff pdf viewer to allow auto pdf download - }, **splinter_firefox_profile_preferences) - kwargs['profile'] = splinter_firefox_profile_directory - elif splinter_webdriver == 'remote': - kwargs['url'] = splinter_remote_url - elif splinter_webdriver in ('phantomjs', 'chrome'): - if splinter_webdriver_executable: - kwargs['executable_path'] = splinter_webdriver_executable - if splinter_driver_kwargs: - kwargs.update(splinter_driver_kwargs) - + kwargs = get_args(splinter_webdriver, splinter_file_download_dir, splinter_download_file_types, + splinter_firefox_profile_preferences, splinter_firefox_profile_directory, + splinter_remote_url, splinter_webdriver_executable, splinter_driver_kwargs) return Browser( splinter_webdriver, visit_condition=splinter_browser_load_condition, visit_condition_timeout=splinter_browser_load_timeout, **kwargs diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 4acd1ad..3f1bbc1 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -5,6 +5,7 @@ import pytest from splinter.driver import DriverAPI +from pytest_splinter.plugin import get_args @pytest.fixture @@ -107,3 +108,11 @@ def test_get_current_window_info(browser): def test_current_window_is_main(browser): """Test browser's driver current_window_is_main.""" assert browser.driver.current_window_is_main() + + +def test_executable(): + """ improve testing coverage """ + arg1 = get_args('phantomjs', '', '', '', '', '', '/tmp', '') + arg2 = get_args('chrome', '', '', '', '', '', '/tmp', '') + assert arg1['executable_path'] == '/tmp' + assert arg2['executable_path'] == '/tmp' From f45fbfbbfe4b8ef866370ad656e047e037af64b4 Mon Sep 17 00:00:00 2001 From: Suresh V Date: Sun, 12 Apr 2015 14:26:50 +0530 Subject: [PATCH 5/5] add option --splinter-webdriver-executable for phantomjs and chrome --- CHANGES.rst | 2 ++ pytest_splinter/plugin.py | 8 +------- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 8ba5f8a..fd56be1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -6,11 +6,13 @@ Unreleased - add option --splinter-webdriver-executable for phantomjs and chrome (sureshvv) + 1.3.4 ----- - make ``browser_instance_getter`` session scoped, add ``session_browser`` fixture (bubenkoff, sureshvv) + 1.3.3 ----- diff --git a/pytest_splinter/plugin.py b/pytest_splinter/plugin.py index 3463509..b9094ec 100644 --- a/pytest_splinter/plugin.py +++ b/pytest_splinter/plugin.py @@ -30,12 +30,6 @@ NAME_RE = re.compile('[\W]') -@pytest.fixture(scope='session') -def session_tmpdir(request): - """ provide a session scoped tmpdir. """ - return tmpdir(request) - - def _visit(self, url): """Override splinter's visit to avoid unnecessary checks and add wait_until instead.""" self.__dict__.pop('status_code', None) @@ -294,7 +288,6 @@ def browser_instance_getter( splinter_make_screenshot_on_failure, splinter_remote_url, splinter_screenshot_dir, - splinter_webdriver_executable, splinter_selenium_implicit_wait, splinter_selenium_socket_timeout, splinter_selenium_speed, @@ -311,6 +304,7 @@ def get_browser(): kwargs = get_args(splinter_webdriver, splinter_file_download_dir, splinter_download_file_types, splinter_firefox_profile_preferences, splinter_firefox_profile_directory, splinter_remote_url, splinter_webdriver_executable, splinter_driver_kwargs) + return Browser( splinter_webdriver, visit_condition=splinter_browser_load_condition, visit_condition_timeout=splinter_browser_load_timeout, **kwargs