【问题标题】:Firefox v67 Private Browsing with geckodriver does not always enable addons使用 geckodriver 的 Firefox v67 隐私浏览并不总是启用插件
【发布时间】:2019-10-31 07:37:37
【问题描述】:

最新的 Firefox 版本 67 禁用了隐私浏览插件。这些可以按照本指南添加。 https://support.mozilla.org/en-US/kb/extensions-private-browsing

问题在于,即使使用该指南,geckodriver 下的插件也无法始终启用。

这在 Firefox v66 中运行没有问题。

  1. 我已经运行了一个带有默认 firefox 配置文件(来自 profile.ini 的 Profile0)和两个附加组件(coil 和 LastPass)的实例。我看到插件弹出大约 2 秒钟,然后消失。
  2. 我已在私人浏览器中手动启用它们,方法是转到 about: addons。看来,如果它们已经在浏览器中启用以供私人浏览器使用,并且在私人浏览中不可见,则将权限更改为不允许仍然可以在私人浏览中启用它们,然后允许它们保持启用状态。很奇怪。
  3. 我卸载了一个插件关闭了所有浏览器,再次启动脚本,它第一次工作。然后在第二次运行时,它又回到了上面提到的 2 秒启用然后消失模式。
  4. 当 geckodriver 复制配置文件以供使用时,我检查了在 temp 下创建的临时配置文件。包括附加组件。
  5. 手动打开私人浏览器会显示两个加载项,因此它看起来是 geckodriver + firefox v67 特有的。但是,私人浏览器没有让我登录我的插件。

        def get_firefox_profile_dir(self):
        from pathlib import Path
        self.gecko_path = os.path.dirname(__file__)

        if sys.platform in ['linux', 'linux2']:
            import subprocess
            self.ff_gecko = Path(self.gecko_path + '/geckodriver')

            bits = 'uname -m'
            ver_32_64 = subprocess.getstatusoutput(bits)

            cmd = "ls -d /home/$USER/.mozilla/firefox/*.default/"
            fp = subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE)
            FF_PRF_DIR = fp.communicate()[0][0:-2]
            FF_PRF_DIR_DEFAULT = str(FF_PRF_DIR, 'utf-8')

            ff_ext_path = os.path.join(FF_PRF_DIR_DEFAULT, 'extensions')
            self.ff_coil_loc = os.path.join(ff_ext_path, self.ff_coil_extId)
            ff_coil_enabled = os.path.exists(self.ff_coil_loc)
            if ff_coil_enabled:
                if 'x86_64' in ver_32_64:
                    if not self.ff_gecko.is_file():
                        import wget
                        self.gecko_targz = 'geckodriver-v0.24.0-linux64.tar.gz'
                        wget.download(self.gecko_source_linux64, self.gecko_path)
                        self.file_unzip_tar(self.gecko_path + '/' + self.gecko_targz)
                        os.remove(self.gecko_path  + '/' + self.gecko_targz)
                    if self.ff_gecko.is_file():
                            self.data_path = FF_PRF_DIR_DEFAULT
                            self.gecko = self.ff_gecko
                            return
                if 'i368' in ver_32_64:
                    if not self.ff_gecko.is_file():
                        import wget
                        self.gecko_targz = 'geckodriver-v0.24.0-linux32.tar.gz'
                        wget.download(self.gecko_source_linux32, self.gecko_path)
                        self.file_unzip_tar(self.gecko_path + '/' + self.gecko_targz)
                        os.remove(self.gecko_path + '/' + self.gecko_targz)
                    if self.ff_gecko.is_file():
                            self.data_path = FF_PRF_DIR_DEFAULT
                            self.gecko = self.ff_gecko
                            return
        elif sys.platform == 'win32' or 'nt':
            from pathlib import Path
            self.gecko = self.gecko_path + "\geckodriver.exe"
            mozilla_profile = os.path.join(os.getenv('APPDATA'), r'Mozilla\Firefox')
            mozilla_profile_ini = os.path.join(mozilla_profile, r'profiles.ini')
            profile = configparser.ConfigParser()
            profile.read(mozilla_profile_ini)

            FF_PRF_DIR_DEFAULT = os.path.normpath(os.path.join(mozilla_profile, profile.get('Profile0', 'Path')))
            ff_ext_path = os.path.join(FF_PRF_DIR_DEFAULT, 'extensions')
            self.ff_coil_loc = os.path.join(ff_ext_path, self.ff_coil_extId)
            ff_coil_enabled = os.path.exists(self.ff_coil_loc)

            if ff_coil_enabled:
                ff_gecko = Path(self.gecko)
                if ff_gecko.is_file():

                    self.data_path = FF_PRF_DIR_DEFAULT
                    return
                else:
                    import wget
                    wget.download(self.gecko_source_win64)
                    self.file_zunip('geckodriver-v0.24.0-win64.zip')
                    if ff_gecko.is_file():
                        os.remove('geckodriver-v0.24.0-win64.zip')
                        self.data_path = FF_PRF_DIR_DEFAULT

                        return
self.get_firefox_profile_dir()
            self.driver = webdriver.Firefox(options=self.options, firefox_profile=self.data_path, executable_path=self.gecko)
            self.driver.get(self.url)  # OPEN URL

我希望 FF 插件能够被启用,因为它们已被浏览器手动允许,并且它们将在正常模式下登录。

【问题讨论】:

    标签: python firefox-addon geckodriver selenium-firefoxdriver


    【解决方案1】:

    看来核心问题与升级到 v67 有关,并且配置文件中的一些未知项目已损坏。配置文件重置解决了该问题。

    https://support.mozilla.org/en-US/kb/refresh-firefox-reset-add-ons-and-settings

    更新:经过进一步测试,我发现它显示了短期稳定性,并且动态加载时扩展会被命中和错过(更多错过)。换句话说,在配置文件重置插件最初工作几次之后,它们不再使用 selenium 加载

    【讨论】:

      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 2015-10-23
      • 2019-03-13
      • 1970-01-01
      • 2020-06-04
      • 2020-10-08
      • 1970-01-01
      相关资源
      最近更新 更多