diff --git a/CHANGES.rst b/CHANGES.rst index 3c82cd1..fd56be1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,11 +1,18 @@ Changelog ========= +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/README.rst b/README.rst index 04b38d3..ea2045c 100644 --- a/README.rst +++ b/README.rst @@ -124,6 +124,11 @@ Fixtures This fixture gets the value from the command-line option `splinter-make-screenshot-on-failure` (see below). +* splinter_driver_executable + Filesystem path of the webdriver executable. + This fixture gets the value from the command-line option + `splinter-webdriver-executable` (see below). + Command-line options -------------------- @@ -165,6 +170,10 @@ Command-line options pytest-splinter browser screenshot directory. Defaults to the current directory. +* `--splinter-webdriver-executable` + Filesystem path of the webdriver executable. Used by phantomjs and chrome drivers. + Defaults to the None in which case the shell PATH variable setting determines the location of the executable. + Browser fixture --------------- diff --git a/pytest_splinter/plugin.py b/pytest_splinter/plugin.py index 30cd594..486c81c 100644 --- a/pytest_splinter/plugin.py +++ b/pytest_splinter/plugin.py @@ -210,6 +210,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.""" @@ -241,6 +247,38 @@ def session_tmpdir(request): return tmpdir(request) +def get_args(driver=None, + download_dir=None, + download_ftypes=None, + firefox_pref=None, + firefox_prof_dir=None, + remote_url=None, + executable=None, + driver_kwargs=None): + """ construct arguments to be passed to webdriver on initialization. """ + kwargs = {} + + if driver == 'firefox': + kwargs['profile_preferences'] = dict({ + 'browser.download.folderList': 2, + 'browser.download.manager.showWhenStarting': False, + 'browser.download.dir': download_dir, + 'browser.helperApps.neverAsk.saveToDisk': download_ftypes, + 'browser.helperApps.alwaysAsk.force': False, + 'pdfjs.disabled': True, # disable internal ff pdf viewer to allow auto pdf download + }, **firefox_pref) + kwargs['profile'] = firefox_prof_dir + elif driver == 'remote': + kwargs['url'] = remote_url + elif driver in ('phantomjs', 'chrome'): + if executable: + kwargs['executable_path'] = executable + if driver_kwargs: + kwargs.update(driver_kwargs) + + return kwargs + + @pytest.fixture(scope='session') def browser_instance_getter( browser_patches, @@ -259,6 +297,7 @@ def browser_instance_getter( splinter_selenium_socket_timeout, splinter_selenium_speed, splinter_webdriver, + splinter_webdriver_executable, splinter_window_size, session_tmpdir, browser_pool, @@ -268,22 +307,14 @@ 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 - if splinter_driver_kwargs: - kwargs.update(splinter_driver_kwargs) + kwargs = get_args(driver=splinter_webdriver, + download_dir=splinter_file_download_dir, + download_ftypes=splinter_download_file_types, + firefox_pref=splinter_firefox_profile_preferences, + firefox_prof_dir=splinter_firefox_profile_directory, + remote_url=splinter_remote_url, + executable=splinter_webdriver_executable, + driver_kwargs=splinter_driver_kwargs) return Browser( splinter_webdriver, visit_condition=splinter_browser_load_condition, @@ -438,3 +469,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='') diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 4acd1ad..03b13f0 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(): + """ Test argument construction for webdrivers """ + arg1 = get_args(driver='phantomjs', executable='/tmp') + arg2 = get_args(driver='chrome', executable='/tmp') + assert arg1['executable_path'] == '/tmp' + assert arg2['executable_path'] == '/tmp'