selenium - python Firefox webdriver - unsafe setters in firefox_profile.py

Problem: after setting the boolean flags for Firefox profile the webdriver fails with “Can’t load the profile” error.

I tried to disable native events for Firefox webdriver in a following way:

    ffp = webdriver.firefox.firefox_profile.FirefoxProfile(path)
    if (Config.ff_native_events_enabled == False):
        ffp.native_events_enabled = False
    ffb = webdriver.firefox.firefox_binary.FirefoxBinary(firefox_path=Config.browser_binary)
    selenium = webdriver.Firefox(firefox_profile=ffp, firefox_binary=ffb)

After that Firefox starts, but python code can not connect to the webdriver extension.

Test fails with error like this:

Traceback (most recent call last):
...
File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 45, in __init__
    self.binary, timeout),
File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/extension_connection.py", line 46, in __init__
    self.binary.launch_browser(self.profile)
File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 44, in launch_browser
    self._wait_until_connectable()
File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 86, in _wait_until_connectable
    self.profile.path, self._get_firefox_output()))
WebDriverException: Message: "Can't load the profile. Profile Dir: /tmp/tmp2aEvmI/webdriver-py-profilecopy Firefox output: "

Actually this error is not related to the profile loading and it fails in _wait_until_connectable method.

If I comment out the ffp.native_events_enabled = False string then everything works.

Solution

After some examination I found that webdriver (python code) passes parameters to the fireforx extension through the user.js file in the Firefox profile folder. And it looked like this:

    user_pref("security.warn_entering_weak", false);
    user_pref("security.fileuri.strict_origin_policy", false);
    user_pref("webdriver_enable_native_events", False);
    ...

Note that here we have lowercase ‘false’ for all options except the webdriver_enable_native_events. The python code which is responsible for this:

    # my code
    ffp.native_events_enabled = False

    # webdriver code
    @native_events_enabled.setter
    def native_events_enabled(self, value):
        self.default_preferences['webdriver_enable_native_events'] = str(value)

Here python boolean value is converted into the “False” string. The solution is to use in my code lowercase string instead of boolean:

    # my code
    ffp.native_events_enabled = "false"

I also added a bug report and hope this will be fixed in selenium code. The same problem exist for other boolean setters, like accept_untrusted_certs.

bug report

profile for Boris Serebrov on Stack Exchange, a network of free, community-driven Q&A sites