diff --git a/.travis.yml b/.travis.yml old mode 100644 new mode 100755 index c675756..60c3372 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,12 @@ jobs: node_js: stable addons: firefox: latest-nightly - env: TOXENV=py36 MOZ_HEADLESS=1 GECKODRIVER=0.22.0 + chrome: stable + env: TOXENV=py36 MOZ_HEADLESS=1 GECKODRIVER=0.22.0 CHROMEDRIVER=2.40 before_install: + - wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER/chromedriver_linux64.zip + - mkdir $HOME/chromedriver && unzip /tmp/chromedriver.zip -d $HOME/chromedriver + - export PATH=$HOME/chromedriver:$PATH - wget -O /tmp/geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/v$GECKODRIVER/geckodriver-v$GECKODRIVER-linux64.tar.gz - mkdir $HOME/geckodriver && tar xvf /tmp/geckodriver.tar.gz -C $HOME/geckodriver - export PATH=$HOME/geckodriver:$PATH @@ -36,8 +40,12 @@ jobs: node_js: stable addons: firefox: latest-nightly - env: TOXENV=py27 MOZ_HEADLESS=1 GECKODRIVER=0.22.0 + chrome: stable + env: TOXENV=py27 MOZ_HEADLESS=1 GECKODRIVER=0.22.0 CHROMEDRIVER=2.40 before_install: + - wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/$CHROMEDRIVER/chromedriver_linux64.zip + - mkdir $HOME/chromedriver && unzip /tmp/chromedriver.zip -d $HOME/chromedriver + - export PATH=$HOME/chromedriver:$PATH - wget -O /tmp/geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/v$GECKODRIVER/geckodriver-v$GECKODRIVER-linux64.tar.gz - mkdir $HOME/geckodriver && tar xvf /tmp/geckodriver.tar.gz -C $HOME/geckodriver - export PATH=$HOME/geckodriver:$PATH diff --git a/README.rst b/README.rst old mode 100644 new mode 100755 index 0d1fed4..ebc1cea --- a/README.rst +++ b/README.rst @@ -73,7 +73,11 @@ Contributing ------------ Fork the repository and submit PRs with bug fixes and enhancements; -contributions are very welcome. You can run the tests using +contributions are very welcome. + +Node dependencies must be installed by running `npm install` inside the axe-selenium-python directory. + +You can run the tests using `tox `_: .. code-block:: bash diff --git a/axe_selenium_python/axe.py b/axe_selenium_python/axe.py old mode 100644 new mode 100755 index f1b6802..6e3bed8 --- a/axe_selenium_python/axe.py +++ b/axe_selenium_python/axe.py @@ -33,7 +33,8 @@ def execute(self, context=None, options=None): :param context: which page part(s) to analyze and/or what to exclude. :param options: dictionary of aXe options. """ - template = "return axe.run(%s).then(function(result){return result;});" + template = "var callback = arguments[arguments.length - 1];" \ + "axe.run(%s).then(results => callback(results))" args = "" # If context parameter is passed, add to args @@ -47,7 +48,7 @@ def execute(self, context=None, options=None): args += "%s" % options command = template % args - response = self.selenium.execute_script(command) + response = self.selenium.execute_async_script(command) return response def report(self, violations): diff --git a/axe_selenium_python/tests/test_axe.py b/axe_selenium_python/tests/test_axe.py old mode 100644 new mode 100755 index 775c3ed..0c99c3a --- a/axe_selenium_python/tests/test_axe.py +++ b/axe_selenium_python/tests/test_axe.py @@ -2,7 +2,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this file, # You can obtain one at http://mozilla.org/MPL/2.0/. -from os import path +from os import path, getenv import pytest from selenium import webdriver @@ -13,21 +13,49 @@ @pytest.fixture -def driver(): +def firefox_driver(): driver = webdriver.Firefox() yield driver driver.close() +@pytest.fixture +def chrome_driver(): + opts = webdriver.ChromeOptions() + opts.headless = True + opts.add_argument('--no-sandbox') + driver_path = getenv('CHROMEDRIVER_PATH') + driver = webdriver.Chrome(options=opts, executable_path=driver_path) \ + if driver_path else webdriver.Chrome(options=opts) + yield driver + driver.close() + + @pytest.mark.nondestructive -def test_run_axe_sample_page(driver): +def test_run_axe_sample_page_firefox(firefox_driver): """Run axe against sample page and verify JSON output is as expected.""" - driver.get("file://" + _DEFAULT_TEST_FILE) - axe = Axe(driver) - axe.inject() - data = axe.execute() + data = _perform_axe_run(firefox_driver) + + assert len(data["inapplicable"]) == 50 + assert len(data["incomplete"]) == 0 + assert len(data["passes"]) == 7 + assert len(data["violations"]) == 8 + + +@pytest.mark.nondestructive +def test_run_axe_sample_page_chrome(chrome_driver): + """Run axe against sample page and verify JSON output is as expected.""" + data = _perform_axe_run(chrome_driver) assert len(data["inapplicable"]) == 50 assert len(data["incomplete"]) == 0 assert len(data["passes"]) == 7 assert len(data["violations"]) == 8 + + +def _perform_axe_run(driver): + driver.get("file://" + _DEFAULT_TEST_FILE) + axe = Axe(driver) + axe.inject() + data = axe.execute() + return data