Skip to content

Commit

Permalink
Fix #21
Browse files Browse the repository at this point in the history
In #21 i found a bug in chrome driver:
https://bugs.chromium.org/p/chromedriver/issues/detail?id=3358

Add a work-a-round for this, by set LANG/LANGUAGE environment variables.
btw. `env` argument has a wrong type annotation in upstream, see:
SeleniumHQ/selenium#10072
  • Loading branch information
jedie committed Nov 22, 2021
1 parent efa4715 commit 295d798
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 17 deletions.
7 changes: 3 additions & 4 deletions django_tools/selenium/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,11 +78,10 @@ def __repr__(self):
return self.items().__str__()


def assert_browser_language(driver: RemoteWebDriver, languages: [list, tuple]):
def assert_browser_language(driver: RemoteWebDriver, language: str):
browser_languages = driver.execute_script('return window.navigator.languages')
browser_language = browser_languages[0]
assert browser_language in languages, (
f'Browser language "{browser_language}" is not in {languages}'
assert browser_languages == [language], (
f'Browser language "{browser_languages}" is not in {[language]}'
)


Expand Down
23 changes: 14 additions & 9 deletions django_tools/selenium/chromedriver.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

from django_tools.selenium.base import LocalStorage, SeleniumBaseTestCase, assert_browser_language
from django_tools.selenium.base import LocalStorage, SeleniumBaseTestCase


log = logging.getLogger(__name__)
Expand Down Expand Up @@ -49,7 +49,6 @@ def test_admin_login_page(self):
'--incognito',
'--disable-gpu',
'--disable-dev-shm-usage', # https://bugs.chromium.org/p/chromedriver/issues/detail?id=2473
'--lang=en-US'
)
desired_capabilities = {
'loggingPrefs': {
Expand All @@ -58,7 +57,7 @@ def test_admin_login_page(self):
'performance': 'ALL',
}
}
accept_languages = 'en-US,en;q=0.8'
accept_languages = 'en-US'

@classmethod
def setUpClass(cls):
Expand All @@ -71,8 +70,11 @@ def setUpClass(cls):
else:
options = webdriver.ChromeOptions()
options.add_experimental_option('w3c', False) # needed to get browser logs

# Note: accept_languages will be ignored in headless mode!
# See: https://github.com/jedie/django-tools/issues/21
# Work-a-round: set via "env" in Service() below
options.add_experimental_option('prefs', {'intl.accept_languages': cls.accept_languages})
options.add_argument(f'--accept-language="{cls.accept_languages}"')

for argument in cls.options:
options.add_argument(argument)
Expand All @@ -83,17 +85,20 @@ def setUpClass(cls):
log.debug('Browser options:\n%s', pprint.pformat(options.to_capabilities()))
service = Service(
executable_path=str(executable),
log_path=f'{cls.filename}.log'
log_path=f'{cls.filename}.log',

# accept_languages doesn't work in headless mode
# Set browser language via environment:
env={ # noqa -> https://github.com/SeleniumHQ/selenium/pull/10072
'LANG': 'en_US',
'LANGUAGE': 'en_US',
}
)
cls.driver = webdriver.Chrome(
options=options,
service=service,
)

# Test may fail, if a other language is activated.
# So check this after startup:
assert_browser_language(driver=cls.driver, languages=('en', 'en-US'))

cls.local_storage = LocalStorage(cls.driver)

def get_browser_log(self):
Expand Down
18 changes: 14 additions & 4 deletions django_tools_test_project/tests/test_unittest_selenium.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from selenium.common.exceptions import NoSuchElementException

# https://github.com/jedie/django-tools
from django_tools.selenium.base import assert_browser_language
from django_tools.selenium.chromedriver import SeleniumChromiumTestCase, chromium_available
from django_tools.selenium.django import (
SeleniumChromiumStaticLiveServerTestCase,
Expand All @@ -29,13 +30,15 @@ class ExampleChromiumTests(SeleniumChromiumStaticLiveServerTestCase):
def test_admin_login_page(self):
self.driver.get(self.live_server_url + "/admin/login/")

# FIXME: Depends on version?!?
languages = self.driver.execute_script('return window.navigator.languages')
language = languages[0]
assert language in ('en', 'en-US')
# We can't check the page content, if the browser send wrong accept languages to server.
# Check this:
assert_browser_language(driver=self.driver, language='en-US')

# Following tests will fail if server response with other translations:
self.assert_equal_page_title("Log in | Django site admin")
self.assert_in_page_source(f' lang="en"')
self.assert_in_page_source('<form action="/admin/login/" method="post" id="login-form">')

self.assert_no_javascript_alert()


Expand All @@ -44,8 +47,15 @@ class ExampleFirefoxTests(SeleniumFirefoxStaticLiveServerTestCase):
def test_admin_login_page(self):
self.driver.get(self.live_server_url + "/admin/login/")

# We can't check the page content, if the browser send wrong accept languages to server.
# Check this:
assert_browser_language(driver=self.driver, language='en-US')

# Following tests will fail if server response with other translations:
self.assert_equal_page_title("Log in | Django site admin")
self.assert_in_page_source(f' lang="en"')
self.assert_in_page_source('<form action="/admin/login/" method="post" id="login-form">')

self.assert_no_javascript_alert()


Expand Down

0 comments on commit 295d798

Please sign in to comment.