Skip to content

Commit

Permalink
have python now use javascript/firefox-driver/webdriver.json
Browse files Browse the repository at this point in the history
behavior change to the preferences is that they now should be treated
like raw types rather than strings and allow the json library to translate
the types appropriated (e.g. True => true)

changed webdriver.json startup.homepage_welcome_url to be "about:blank"
this avoids loading the new Firefox start page (python was doing this previously)
  • Loading branch information
lukeis committed Oct 22, 2013
1 parent 281f430 commit 7436fc8
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 117 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ java/server/build/
dist/
py/selenium/webdriver/firefox/amd64/
py/selenium/webdriver/firefox/webdriver.xpi
py/selenium/webdriver/firefox/webdriver_prefs.json
py/selenium/webdriver/firefox/x86/
py/docs/build/
selenium.egg-info/
Expand Down
9 changes: 5 additions & 4 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -536,16 +536,16 @@ task :javadocs => [:common, :firefox, :htmlunit, :ie, :remote, :support, :chrome
sh cmd
end

task :py_prep_for_install_release => ["//javascript/firefox-driver:webdriver", :chrome] do
task :py_prep_for_install_release => ["//javascript/firefox-driver:webdriver", :chrome, "//javascript/firefox-driver:webdriver_prefs"] do
if python? then

firefox_py_home = "py/selenium/webdriver/firefox/"
xpi_zip_build = 'build/javascript/firefox-driver/webdriver.xpi'
firefox_build_dir = 'build/javascript/firefox-driver/'
x86 = firefox_py_home + "x86/"
amd64 = firefox_py_home + "amd64/"

if (windows?) then
xpi_zip_build = xpi_zip_build.gsub(/\//, "\\")
firefox_build_dir = firefox_build_dir.gsub(/\//, "\\")
firefox_py_home = firefox_py_home .gsub(/\//, "\\")
x86 = x86.gsub(/\//,"\\")
amd64 = amd64.gsub(/\//,"\\")
Expand All @@ -557,7 +557,8 @@ task :py_prep_for_install_release => ["//javascript/firefox-driver:webdriver", :
cp "cpp/prebuilt/i386/libnoblur.so", x86+"x_ignore_nofocus.so", :verbose => true
cp "cpp/prebuilt/amd64/libnoblur64.so", amd64+"x_ignore_nofocus.so", :verbose => true

cp xpi_zip_build , firefox_py_home, :verbose => true
cp firefox_build_dir + "webdriver.xpi" , firefox_py_home, :verbose => true
cp firefox_build_dir + "webdriver_prefs.json" , firefox_py_home, :verbose => true
end
end

Expand Down
1 change: 1 addition & 0 deletions javascript/firefox-driver/webdriver.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
"dom.report_all_js_exceptions": true,
"javascript.options.showInConsole": true,
"network.http.max-connections-per-server": 10,
"startup.homepage_welcome_url": "about:blank",
"webdriver_accept_untrusted_certs": true,
"webdriver_assume_untrusted_issuer": true
}
Expand Down
1 change: 1 addition & 0 deletions py/build.desc
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ py_test(
ff_specific_tests = [ "test/selenium/webdriver/firefox/*_tests.py" ],
deps = [ ":test_ff" ],
resources = [
{ "//javascript/firefox-driver:webdriver_prefs" : "selenium/webdriver/firefox/webdriver_prefs.json" },
{ "//javascript/firefox-driver:webdriver" : "selenium/webdriver/firefox/" }
],
browsers = [ "ff" ])
Expand Down
107 changes: 21 additions & 86 deletions py/selenium/webdriver/firefox/firefox_profile.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import base64
import copy
import json
import os
import re
import shutil
Expand All @@ -35,64 +36,15 @@


WEBDRIVER_EXT = "webdriver.xpi"
WEBDRIVER_PREFERENCES = "webdriver_prefs.json"
EXTENSION_NAME = "fxdriver@googlecode.com"

class FirefoxProfile(object):

ANONYMOUS_PROFILE_NAME = "WEBDRIVER_ANONYMOUS_PROFILE"
DEFAULT_PREFERENCES = {
"app.update.auto": "false",
"app.update.enabled": "false",
"browser.download.manager.showWhenStarting": "false",
"browser.EULA.override": "true",
"browser.EULA.3.accepted": "true",
"browser.link.open_external": "2",
"browser.link.open_newwindow": "2",
"browser.offline": "false",
"browser.safebrowsing.enabled": "false",
"browser.search.update": "false",
"extensions.blocklist.enabled": "false",
"browser.sessionstore.resume_from_crash": "false",
"browser.shell.checkDefaultBrowser": "false",
"browser.tabs.warnOnClose": "false",
"browser.tabs.warnOnOpen": "false",
"browser.startup.page": "0",
"browser.safebrowsing.malware.enabled": "false",
"startup.homepage_welcome_url": "\"about:blank\"",
"devtools.errorconsole.enabled": "true",
"dom.disable_open_during_load": "false",
"extensions.autoDisableScopes" : 10,
"extensions.logging.enabled": "true",
"extensions.update.enabled": "false",
"extensions.update.notifyUser": "false",
"network.manage-offline-status": "false",
"network.http.max-connections-per-server": "10",
"network.http.phishy-userpass-length": "255",
"offline-apps.allow_by_default": "true",
"prompts.tab_modal.enabled": "false",
"security.fileuri.origin_policy": "3",
"security.fileuri.strict_origin_policy": "false",
"security.warn_entering_secure": "false",
"security.warn_entering_secure.show_once": "false",
"security.warn_entering_weak": "false",
"security.warn_entering_weak.show_once": "false",
"security.warn_leaving_secure": "false",
"security.warn_leaving_secure.show_once": "false",
"security.warn_submit_insecure": "false",
"security.warn_viewing_mixed": "false",
"security.warn_viewing_mixed.show_once": "false",
"signon.rememberSignons": "false",
"toolkit.networkmanager.disable": "true",
"toolkit.telemetry.enabled": "false",
"toolkit.telemetry.prompted": "2",
"toolkit.telemetry.rejected": "true",
"javascript.options.showInConsole": "true",
"browser.dom.window.dump.enabled": "true",
"webdriver_accept_untrusted_certs": "true",
"webdriver_enable_native_events": "true",
"webdriver_assume_untrusted_issuer": "true",
"dom.max_script_run_time": "30",
}
with open(os.path.join(os.path.dirname(__file__), WEBDRIVER_PREFERENCES)) as default_prefs:
DEFAULT_PREFERENCES = json.load(default_prefs)


def __init__(self,profile_directory=None):
"""
Expand All @@ -104,7 +56,7 @@ def __init__(self,profile_directory=None):
directory when object is created.
"""
self.default_preferences = copy.deepcopy(
FirefoxProfile.DEFAULT_PREFERENCES)
FirefoxProfile.DEFAULT_PREFERENCES['mutable'])
self.profile_dir = profile_directory
self.tempfolder = None
if self.profile_dir is None:
Expand All @@ -116,7 +68,7 @@ def __init__(self,profile_directory=None):
shutil.copytree(self.profile_dir, newprof,
ignore=shutil.ignore_patterns("parent.lock", "lock", ".parentlock"))
self.profile_dir = newprof
self._read_existing_userjs()
self._read_existing_userjs(os.path.join(self.profile_dir, "user.js"))
self.extensionsDir = os.path.join(self.profile_dir, "extensions")
self.userPrefs = os.path.join(self.profile_dir, "user.js")

Expand All @@ -125,24 +77,15 @@ def set_preference(self, key, value):
"""
sets the preference that we want in the profile.
"""
clean_value = ''
if value is True:
clean_value = 'true'
elif value is False:
clean_value = 'false'
elif isinstance(value, bytes):
clean_value = '"%s"' % value.decode('utf-8')
elif isinstance(value, str): # unicode
clean_value = '"%s"' % value
else:
clean_value = str(int(value))

self.default_preferences[key] = clean_value
self.default_preferences[key] = value

def add_extension(self, extension=WEBDRIVER_EXT):
self._install_extension(extension)

def update_preferences(self):
for key, value in FirefoxProfile.DEFAULT_PREFERENCES['frozen'].items():
if key == 'browser.startup.homepage':
self.default_preferences[key] = value
self._write_user_prefs(self.default_preferences)

#Properties
Expand Down Expand Up @@ -179,8 +122,7 @@ def port(self, port):

@property
def accept_untrusted_certs(self):
return self._santise_pref(
self.default_preferences["webdriver_accept_untrusted_certs"])
return self.default_preferences["webdriver_accept_untrusted_certs"]

@accept_untrusted_certs.setter
def accept_untrusted_certs(self, value):
Expand All @@ -190,7 +132,7 @@ def accept_untrusted_certs(self, value):

@property
def assume_untrusted_cert_issuer(self):
return self._santise_pref(self.default_preferences["webdriver_assume_untrusted_issuer"])
return self.default_preferences["webdriver_assume_untrusted_issuer"]

@assume_untrusted_cert_issuer.setter
def assume_untrusted_cert_issuer(self, value):
Expand All @@ -201,7 +143,7 @@ def assume_untrusted_cert_issuer(self, value):

@property
def native_events_enabled(self):
return self._santise_pref(self.default_preferences['webdriver_enable_native_events'])
return self.default_preferences['webdriver_enable_native_events']

@native_events_enabled.setter
def native_events_enabled(self, value):
Expand Down Expand Up @@ -246,15 +188,6 @@ def set_proxy(self, proxy):
elif proxy.proxy_type is ProxyType.PAC:
self.set_preference("network.proxy.autoconfig_url", proxy.proxy_autoconfig_url)

#Private Methods
def _santise_pref(self, item):
if item == 'true':
return True
elif item == 'false':
return False
else:
return item

def _set_manual_proxy_preference(self, key, setting):
if setting is None or setting is '':
return
Expand All @@ -276,16 +209,18 @@ def _write_user_prefs(self, user_prefs):
"""
with open(self.userPrefs, "w") as f:
for key, value in user_prefs.items():
f.write('user_pref("%s", %s);\n' % (key, value))
f.write('user_pref("%s", %s);\n' % (key, json.dumps(value)))

def _read_existing_userjs(self):
userjs_path = os.path.join(self.profile_dir, 'user.js')
def _read_existing_userjs(self, userjs):
PREF_RE = re.compile(r'user_pref\("(.*)",\s(.*)\)')
try:
with open(userjs_path) as f:
with open(userjs) as f:
for usr in f:
matches = re.search(PREF_RE, usr)
self.default_preferences[matches.group(1)] = matches.group(2)
try:
self.default_preferences[matches.group(1)] = json.loads(matches.group(2))
except:
print "(skipping) failed to json.loads existing prefernce:", matches.group(1), matches.group(2)
except:
# The profile given hasn't had any changes made, i.e no users.js
pass
Expand Down
51 changes: 24 additions & 27 deletions py/test/selenium/webdriver/firefox/ff_profile_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
from selenium.webdriver.common.proxy import Proxy, ProxyType
from selenium.test.selenium.webdriver.common.webserver import SimpleWebServer


class TestFirefoxProfile:

def setup_method(self, method):
Expand All @@ -43,17 +42,15 @@ def setup_method(self, method):
self.webserver.start()

def test_that_we_can_accept_a_profile(self):
# The setup gave us a browser but we dont need it since we are doing our own thing
self.driver.quit()

self.profile1 = webdriver.FirefoxProfile()
self.profile1.set_preference("startup.homepage_welcome_url",
"%s" % "http://localhost:%d/%s.html" % (self.webserver.port, "simpleTest"))
self.profile1.update_preferences()

self.profile2 = webdriver.FirefoxProfile(self.profile1.path)
self.driver = webdriver.Firefox(firefox_profile=self.profile2)
title = self.driver.title
profile1 = webdriver.FirefoxProfile()
profile1.set_preference("startup.homepage_welcome_url",
"http://localhost:%d/%s.html" % (self.webserver.port, "simpleTest"))
profile1.update_preferences()

profile2 = webdriver.FirefoxProfile(profile1.path)
driver = webdriver.Firefox(firefox_profile=profile2)
title = driver.title
driver.quit()
assert "Hello WebDriver" == title

def test_that_prefs_are_written_in_the_correct_format(self):
Expand All @@ -64,7 +61,7 @@ def test_that_prefs_are_written_in_the_correct_format(self):
profile.set_preference("sample.preference", "hi there")
profile.update_preferences()

assert '"hi there"' == profile.default_preferences["sample.preference"]
assert 'hi there' == profile.default_preferences["sample.preference"]

encoded = profile.encoded
decoded = base64.decodestring(encoded)
Expand All @@ -75,7 +72,7 @@ def test_that_prefs_are_written_in_the_correct_format(self):
user_js = zip.read(entry)
for line in user_js.splitlines():
if line.startswith(b'user_pref("sample.preference",'):
assert True == line.endswith(b'"hi there");')
assert True == line.endswith(b'hi there");')
# there should be only one user.js
break
fp.close()
Expand All @@ -88,7 +85,7 @@ def test_that_unicode_prefs_are_written_in_the_correct_format(self):
profile.set_preference('sample.preference.2', unicode('hi there'))
profile.update_preferences()

assert '"hi there"' == profile.default_preferences["sample.preference.2"]
assert 'hi there' == profile.default_preferences["sample.preference.2"]

encoded = profile.encoded
decoded = base64.decodestring(encoded)
Expand All @@ -99,7 +96,7 @@ def test_that_unicode_prefs_are_written_in_the_correct_format(self):
user_js = zip.read(entry)
for line in user_js.splitlines():
if line.startswith(b'user_pref("sample.preference.2",'):
assert True == line.endswith(b'"hi there");')
assert True == line.endswith(b'hi there");')
# there should be only one user.js
break
fp.close()
Expand All @@ -111,7 +108,7 @@ def test_that_integer_prefs_are_written_in_the_correct_format(self):
profile = webdriver.FirefoxProfile()
profile.set_preference("sample.int.preference", 12345)
profile.update_preferences()
assert "12345" == profile.default_preferences["sample.int.preference"]
assert 12345 == profile.default_preferences["sample.int.preference"]

def test_that_boolean_prefs_are_written_in_the_correct_format(self):
# The setup gave us a browser but we dont need it
Expand All @@ -120,7 +117,7 @@ def test_that_boolean_prefs_are_written_in_the_correct_format(self):
profile = webdriver.FirefoxProfile()
profile.set_preference("sample.bool.preference", True)
profile.update_preferences()
assert "true" == profile.default_preferences["sample.bool.preference"]
assert True == profile.default_preferences["sample.bool.preference"]

def test_that_we_delete_the_profile(self):
path = self.driver.firefox_profile.path
Expand All @@ -132,7 +129,7 @@ def test_profiles_do_not_share_preferences(self):
self.profile1.accept_untrusted_certs = False
self.profile2 = webdriver.FirefoxProfile()
# Default is true. Should remain so.
assert self.profile2.default_preferences["webdriver_accept_untrusted_certs"] == 'true'
assert self.profile2.default_preferences["webdriver_accept_untrusted_certs"] == True

def test_none_proxy_is_set(self):
# The setup gave us a browser but we dont need it
Expand Down Expand Up @@ -173,11 +170,11 @@ def test_manual_proxy_is_set_in_profile(self):

self.profile.set_proxy(proxy)

assert self.profile.default_preferences["network.proxy.type"] == '1'
assert self.profile.default_preferences["network.proxy.no_proxies_on"] == '"localhost, foo.localhost"'
assert self.profile.default_preferences["network.proxy.http"] == '"some.url"'
assert self.profile.default_preferences["network.proxy.http_port"] == '1234'
assert self.profile.default_preferences["network.proxy.ssl"] == '"some2.url"'
assert self.profile.default_preferences["network.proxy.type"] == ProxyType.MANUAL['ff_value']
assert self.profile.default_preferences["network.proxy.no_proxies_on"] == 'localhost, foo.localhost'
assert self.profile.default_preferences["network.proxy.http"] == 'some.url'
assert self.profile.default_preferences["network.proxy.http_port"] == 1234
assert self.profile.default_preferences["network.proxy.ssl"] == 'some2.url'
assert "network.proxy.ssl_port" not in self.profile.default_preferences
assert "network.proxy.ftp" not in self.profile.default_preferences

Expand All @@ -191,8 +188,8 @@ def test_pac_proxy_is_set_in_profile(self):

self.profile.set_proxy(proxy)

assert self.profile.default_preferences["network.proxy.type"] == '2'
assert self.profile.default_preferences["network.proxy.autoconfig_url"] == '"http://some.url:12345/path"'
assert self.profile.default_preferences["network.proxy.type"] == ProxyType.PAC['ff_value']
assert self.profile.default_preferences["network.proxy.autoconfig_url"] == 'http://some.url:12345/path'

def test_autodetect_proxy_is_set_in_profile(self):
# The setup gave us a browser but we dont need it
Expand All @@ -204,7 +201,7 @@ def test_autodetect_proxy_is_set_in_profile(self):

self.profile.set_proxy(proxy)

assert self.profile.default_preferences["network.proxy.type"] == '4'
assert self.profile.default_preferences["network.proxy.type"] == ProxyType.AUTODETECT['ff_value']

def teardown_method(self, method):
try:
Expand Down

0 comments on commit 7436fc8

Please sign in to comment.