Search code examples
pythonseleniumfirefoxuser-profile

Browser started under selenium doesn't use addons


I'm using python+selenium, with profile that has addons. On startup it shows them all momentarily, but then they are concealed. They exist, they are not disabled, but invisible and don't work. I can disable and enable it, then it appears on the taskbar and is functional. screenshot

When invoking firefox manually with the profile, it works.

Here's what printed to the log.

1596129664500   mozrunner::runner   INFO    Running command: "/usr/bin/firefox" "-marionette" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofileO34n0s"
JavaScript error: resource:///modules/sessionstore/SessionStore.jsm, line 1325: uncaught exception: 2147746065
JavaScript error: resource://gre/modules/ExtensionContent.jsm, line 554: TypeError: Argument 1 of PrecompiledScript.executeInGlobal is not an object.
1596129672037   Marionette  INFO    Listening on port 41285
1596129672136   Marionette  WARN    TLS certificate errors will be ignored for this session
JavaScript error: undefined, line 14: Error: An unexpected error occurred
JavaScript error: moz-extension://45aaa1ae-14fe-4a8f-841d-6a9416fd5d09/lib/picture_in_picture_overrides.js, line 15: Error: Incorrect argument types for pictureInPictureParent.setOverrides.
1596129683512   Marionette  INFO    Stopped listening on port 41285

Can it be because of these errors?

The code itself is of no interest at all:

#!/usr/bin/env python

from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options

profile_path='./profile'

opts=Options()
opts.profile=profile_path
driver=Firefox(options=opts)

breakpoint()

Versions are probably more important:

  • Mozilla Firefox 68.9.0esr
  • geckodriver 0.26.0 (e9783a644016 2019-10-10 13:38 +0000)

I'm creating an empty directory, then running firefox --new-instance --profile ./profile, then installing addon manually into the profile. But here there is that profile


Solution

  • In your profile there is a file: prefs.js which contains a line user_pref("extensions.lastAppBuildId", "20200707180101"); this line might be at fault for the disabled addons. You could therefore test to decrease this number by 1 or remove the whole line (untested).

    profile.set_preference("extensions.lastAppBuildId", "<apppID> -1 ")
    

    Full example code:

    from selenium.webdriver import FirefoxProfile
    from selenium import webdriver
    path = '%APPDATA%\Mozilla\Firefox\Profiles\azk4wioue.default' #path to your profile
    profile = FirefoxProfile(path) 
    profile.set_preference("extensions.lastAppBuildId", "<apppID> -1 ")
    
    driver = webdriver.Firefox(profile)
    

    Example to use an existing firefox profile:

    # go to the the following folder %APPDATA%\Mozilla\Firefox\Profiles\
    # there the firefox profiles should be stored, the default one ending with .default
    # now provide the profile to the driver like this:
    profile = FirefoxProfile('%APPDATA%\Mozilla\Firefox\Profiles\azk4wioue.default') 
    driver = webdriver.Firefox(firefox_profile=profile)
    

    Alternatively install the addon clean on each run through a temporary profile.

    # go to https://addons.mozilla.org and search for the plugin you want, e.g.:https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/
    # rightclick on the button "add to firefox"
    # download the target file to a folder of your choice
    
    # then include the addon like this:
    driver.install_addon('/Users/someuser/app/extension.xpi', temporary=True)
    

    Alternatively 2, you can try setting the extension this way:

    from selenium.webdriver import FirefoxProfile
    from selenium import webdriver
    profile = webdriver.FirefoxProfile()
    profile.add_extension(extension='/Users/someuser/app/extension.xpi')
    
    driver = webdriver.Firefox(profile)
    

    If the addons are there after loading the profile but disabled, you can also try this:

    def newTab(fx, url="about:blank"):
        wnd = fx.execute(selenium.webdriver.common.action_chains.Command.NEW_WINDOW)
        handle = wnd["value"]["handle"]
        fx.switch_to.window(handle)
        fx.get(url) # changes handle
        return fx.current_window_handle
    
    def retoggleAllTheAddons(fx):
        initialHandlesCount = len(fx.window_handles)
        addonsTabHandle = newTab(fx, "about:addons")
        fx.execute_script("""
            let hb = document.getElementById("html-view-browser");
            let al = hb.contentWindow.window.document.getElementsByTagName("addon-list")[0];
            let cards = al.getElementsByTagName("addon-card");
            for(let card of cards){
                card.addon.disable();
                card.addon.enable();
            }
        """)
        if len(fx.window_handles) != 1:
            fx.switch_to.window(addonsTabHandle)
            fx.close()