Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -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
-----

Expand Down
9 changes: 9 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
--------------------
Expand Down Expand Up @@ -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
---------------
Expand Down
68 changes: 52 additions & 16 deletions pytest_splinter/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -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='')
9 changes: 9 additions & 0 deletions tests/test_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import pytest

from splinter.driver import DriverAPI
from pytest_splinter.plugin import get_args


@pytest.fixture
Expand Down Expand Up @@ -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'