为什么Selenium在使用Web Driver时总是创建临时的Firefox配置文件?

5

为什么Selenium在使用Web Driver时总是创建临时的Firefox配置文件,即使我告诉它使用现有的配置文件?

根据这个答案,无法阻止Selenium使用Web Driver创建临时的Firefox配置文件。但是,使用chromedriver可以实现这一点。那么为什么Firefox不同呢?我检查了Selenium repo的FirefoxProfile.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();
    }

但是对于chrome来说,没有这样的事情。

是因为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 是否也会生成这种类型的临时文件。期待专家的答案...

2个回答

2
Firefox驱动程序使用临时配置文件的主要原因是支持同时运行多个独立的Firefox实例的用例。一旦Firefox启动,它会在配置文件目录中放置一个sentinel或锁定文件,并且如果用户尝试启动新的Firefox实例,则会检测到该文件并阻止其这样做。无论Firefox是否仍然表现出这种行为,驱动程序仍必须与一些较旧版本的浏览器配合使用,并加以考虑。Selenium项目解决WebDriver中的该问题的方法是,当用户想要使用特定的配置文件时,将该配置文件的内容复制到新目录中,并启动指向该副本的Firefox。听起来Mozilla的实现基本上也是同样的原因 - 支持多实例用例。

理论上,如果我有10个预先制作的配置文件,那么我可以在不复制它们的情况下同时使用它们来启动10个浏览器,对吗? - Rasel
2
当Selenium完成后,如果它能删除临时文件中的那些配置文件那就太好了。 - 111
如果使用 quit(),它会删除临时文件夹--请参见 https://dev59.com/r2w15IYBdhLWcg3wJ4ms#30447335 - user202729

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创建的配置文件具有某种指纹(因为由rust创建)。如果Selenium找不到它,则会创建新的配置文件。

另一个奇怪的事情是,似乎在这个Selenium配置文件中没有加载某些cookie(它们是cookie吗?)。

我的账户仍然登录着,但我检查并配置了页面上的一些选项;在Firefox的普通会话中,它会保留它们,即使我离开并回来。但是对于这个“由Selenium创建的rust_made”配置文件,它不会保留它们。

当然,我可以通过爬取来解决这个问题。

以上是我的经验!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接