为什么 Selenium 总是使用 Web 驱动程序创建临时的 Firefox 配置文件?

Why Selenium always create temporary Firefox Profiles using Web Driver?

为什么 Selenium 总是使用 Web 驱动程序创建临时 Firefox 配置文件,尽管我告诉它使用现有配置文件?

根据this answer it is not possible to stop Selenium from creating temporary Firefox Profiles using Web Driver. But with chromedriver I can achieve this. So why it is different for Firefox. I checked the FirefoxProfile.cs of Selenium repo发现下面的代码片段是用来复制profile的---

public void WriteToDisk()
    {
        this.profileDir = GenerateProfileDirectoryName();
        if (!string.IsNullOrEmpty(this.sourceProfileDir))
        {
            FileUtilities.CopyDirectory(this.sourceProfileDir, this.profileDir);
        }
        else
        {
            Directory.CreateDirectory(this.profileDir);
        }

        this.InstallExtensions();
        this.DeleteLockFiles();
        this.DeleteExtensionsCache();
        this.UpdateUserPreferences();
    }

但是chorme没有这样的东西。

是不是因为webdriver安装了一个扩展(webdriver.xpi)来和firefox通信,而chromedriver.exe是用来和chrome交互的。

如果是这个原因,在 3.0 版中,webdriver 使用 geckodriver.exe 与 firefox 通信。那么在 3.0 版本之后,webdriver 将不再为 firefox 创建临时配置文件吗?

更新: 今天我玩了 webdriver v 3.0+,发现关闭 legacymode 的最新版本仍在生成名为 rust_mozprofile.wUqPXh48avDR 的临时配置文件。我的假设是这个临时配置文件是由 geckodriver.exe 生成的,它写在 Rust

我在 3 年前使用过 chrome 驱动程序,不确定 chromedriver.exe 是否也会生成此类临时文件。期待专家解答...

Firefox 驱动程序使用临时配置文件的主要原因是为了支持 运行 多个独立的 Firefox 同时实例的用例。有一次,当 Firefox 启动时,它会在配置文件目录中放置一个哨兵或锁定文件,如果用户试图启动一个新的 Firefox 实例,它会检测到该文件,阻止他们这样做。无论 Firefox 是否仍然表现出这种行为,驱动程序仍然需要与一些旧版本的浏览器一起工作,并且必须考虑到这一点。当用户想要使用特定配置文件时,Selenium 项目针对 WebDriver 问题的解决方案是将该配置文件的内容复制到新目录,然后启动指向副本的 Firefox。

听起来 Mozilla 的实现在很大程度上做了同样的事情。我猜这是出于同样的原因——支持多实例用例。

我不知道你们自 2017 年以来是如何处理它的,但我也花了一些时间在这上面,我找到了一个方便的解决方案(Python 3.8 和 W10)。

我首先尝试在我之前“自然”创建的 Firefox 中加载配置文件,我的意思是没有 Selenium。我在上面配置了一个代理,并且记录了 cookies(在网站上登录的帐户)。

尽管这里描述了所有的 goods 方法,但我多次未能用 Selenium 加载它。 其实我从来没有加载它。

所以我让 Selenium 创建一个临时配置文件,在上面配置我的代理并登录我的用户;然后我在 url 字段中输入了这个:

about:support

我找到了Selenium创建的临时文件夹;文件夹是:

C:\Users\ADMIN\AppData\Local\Temp\rust_mozprofileilHfxV

我在我的 python 脚本中复制/粘贴了这条路径...并且成功了!

但是处理放在临时文件夹中的东西是有风险的:总有一天它会被删除。

所以我将 rust_mozprofileilHfxV 文件夹移动到我选择的文件夹中,并将这种方式提供给 firefox_profile 选项并且......它也有效!

似乎用 Selenium 创建的配置文件具有某种指纹(因为由铁锈制成)。如果 Selenium 没有看到它,它会创建一个新的配置文件。

另一件奇怪的事情,似乎有些 cookie(它们是 cookie 吗?)没有加载到这个 selenium 配置文件中。 我的帐户仍处于登录状态,但我在页面上检查并配置了几个选项;在 Firefox 的正常会话中,它会保留它们,如果我离开并回来。 但是对于这个“rust_made_by_selenium”配置文件,它不会保留它们。

我当然可以通过抓取来处理它。

这是我的经历!