【问题标题】:Can Selenium use a specific Firefox profile without making a copySelenium 可以在不复制的情况下使用特定的 Firefox 配置文件吗
【发布时间】:2018-03-12 12:13:25
【问题描述】:

我在 Linux 下的 python 中使用 selenium,并将其设置为使用特定的 Firefox 配置文件。那部分工作正常。但是,它是在 /tmp 中创建配置文件的副本,而不是直接在我使用 webdriver.FirefoxProfile 指定的位置('~/.mozilla/firefox/ki1relie.testprof')中使用配置文件目录。是否有选项告诉 selenium 我想使用原始配置文件目录而不复制它?

【问题讨论】:

  • -profile 参数应该可以实现:options.add_argument('-profile "/path to profile directory"')
  • 那行不通。我尝试了多个选项和选项组合,但没有一个完全有效。
  • 我可以确认,虽然这应该是可能的,但它似乎总是使 firefox 崩溃。

标签: python selenium selenium-webdriver


【解决方案1】:

关于这个问题的好读物是firefox_profile.FirefoxProfile() 代码的构造函数。它直接指出

def __init__(self, profile_directory=None):
    """
    Initialises a new instance of a Firefox Profile
:args:
 - profile_directory: Directory of profile that you want to use. If a
   directory is passed in it will be cloned and the cloned directory
   will be used by the driver when instantiated.
   This defaults to None and will create a new
   directory when object is created.
"""

在 OOP 中,您可以根据需要对其进行子类化。像这样:

import copy
import json
import os

from selenium import webdriver
from selenium.webdriver.firefox import firefox_profile
    
class MyVeryFirefoxProfile(firefox_profile.FirefoxProfile):

    def __init__(self, profile_directory=None):
        """
        Initialises a new instance of a Firefox Profile

        :args:
         - profile_directory: Directory of profile that you want to use.
           If a directory is passed it will be used as is, with no cloning attempts.
           Otherwise it will be handled as usual (new empty profile dir on user's temp)
        """
        if (profile_directory == None):
            # just pass it to super
            super().__init__(profile_directory)
            return
                    
        if not firefox_profile.FirefoxProfile.DEFAULT_PREFERENCES:
            with open(os.path.join(os.path.dirname(firefox_profile.__file__),
                                   firefox_profile.WEBDRIVER_PREFERENCES)) as default_prefs:
                firefox_profile.FirefoxProfile.DEFAULT_PREFERENCES = json.load(default_prefs)

        self.default_preferences = copy.deepcopy(
            firefox_profile.FirefoxProfile.DEFAULT_PREFERENCES['mutable'])
        self.profile_dir = profile_directory
        self.tempfolder = None # if smart enough, it will understand :-)
        #===================================================================
        # newprof = os.path.join(self.tempfolder, "webdriver-py-profilecopy")
        # shutil.copytree(self.profile_dir, newprof,
        #                 ignore=shutil.ignore_patterns("parent.lock", "lock", ".parentlock"))
        # self.profile_dir = newprof
        # os.chmod(self.profile_dir, 0o755)
        #===================================================================
        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")
        if os.path.isfile(self.userPrefs):
            os.chmod(self.userPrefs, 0o644)

def main():
    profile = MyVeryFirefoxProfile(os.path.abspath(FIREFOX_PROFILE_PATH))
    driver = webdriver.Firefox(firefox_profile=profile)
    .. blah ..
    # and no more bloating temp folders ;-)
    
    # but don't forget to fool this killer just before calling quit()
    driver.profile = None
    driver.quit()

    # otherwise your profile will be killed from disk

【讨论】:

    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 2015-07-03
    • 2011-11-28
    • 2016-11-07
    相关资源
    最近更新 更多