【问题标题】:Why Selenium always create temporary Firefox Profiles using Web Driver?为什么 Selenium 总是使用 Web 驱动程序创建临时 Firefox 配置文件?
【发布时间】:2017-03-24 03:13:56
【问题描述】:

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

根据this answer,无法阻止 Selenium 使用 Web 驱动程序创建临时 Firefox 配置文件。但是使用 chromedriver 我可以做到这一点。那么为什么它对 Firefox 不同。我检查了Selenium repoFirefoxProfile.cs,发现以下代码片段用于复制配置文件---

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 年前使用过 chromedriver,但不确定 chromedriver.exe 是否也会生成这种类型的临时文件。期待专家的解答...

【问题讨论】:

    标签: selenium firefox webdriver selenium-chromedriver geckodriver


    【解决方案1】:

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

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

    【讨论】:

    • 所以理论上,如果我有 10 个预制配置文件,那么我可以同时使用它们来启动 10 个浏览器而无需复制它们,对吧?
    • 如果 selenium 在完成后会从 tmp 中删除这些配置文件,那就太好了。
    • 如果使用了quit(),它确实会删除临时文件夹——见stackoverflow.com/a/30447335/5267751
    【解决方案2】:

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

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

    尽管这里描述了所有货物方法,但我多次未能使用 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”配置文件,它不会保留它们。

    我当然可以通过刮擦来处理它。

    这是我的经验!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-21
      • 2021-08-06
      • 2014-03-27
      • 1970-01-01
      • 2011-07-13
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多