如何使用WebDriver阻止Selenium创建临时Firefox配置文件?

58

我正在使用Java的Selenium Web Driver API。每次我想要调试我的测试用例时,Firefox会在临时文件目录中创建一个临时配置文件,这会带来两个问题:

  1. 它肯定需要花费不必要的时间来创建配置文件,并且占用了不必要的空间。
  2. 我无法安装在下一次启动我的测试用例时可用的任何插件。

我该如何解决这个问题?


1
好问题 - 我也在寻找答案。这也是 Selenium 1 的一个问题。 - rs79
1
您将在此线程中找到详细的解释... http://stackoverflow.com/a/40521731/ - Rasel
10个回答

33

您可以控制Firefox驱动程序如何选择配置文件。将webdriver.firefox.profile属性设置为要使用的配置文件的名称。大多数人认为这是一个不好的主意,因为您会继承先前使用该配置文件的所有Cookie、缓存内容等,但如果确实需要这样做,也是允许的。

例如:

System.setProperty("webdriver.firefox.profile", "MySeleniumProfile");
WebDriver driver = new FirefoxDriver(...);

更新 - 由Ranhiru提供

我如何处理Java中的此问题

FirefoxProfile profile = new FirefoxProfile(new File("D:\\Selenium Profile"));                  
WebDriver driver = new FirefoxDriver(profile);

然后我在Firefox中更改了设置,使其在退出时清除所有的cookie和缓存。查看这里了解如何操作。


6
然后我在Firefox中更改了设置,在退出时清除所有的cookies和缓存。- 我认为这是不必要的,因为Selenium仍然会创建临时配置文件。它以你指定的配置文件为基础,即复制设置,所以原始配置文件不应该改变。 - Vsevolod Golovanov
4
这并没有解决问题#1。正如之前的答案所说,无论如何都会创建一个临时配置文件,因此会消耗时间和空间。 - gamliela
@VsevolodGolovanov,你找到解决方案了吗?目前我也遇到了这个问题。 - Yaswanth
@abc,1. 当时FF自带的开发者工具不够用,我有时候需要Firebug,所以这让我感到困扰。但是有时候设置一个基础配置文件就足以解决这个问题。2. 现在,FF的开发者工具已经足够成熟了,而且Firebug也已经死了,所以这不再是一个问题。3. 我目前已经将UI测试从FF切换到Chrome,因为FF切换到不完整的Marionette导致一些问题。4. 对我来说,“临时配置文件”的性能影响从来不是一个问题 - 如果测试本身非常耗费系统资源,那么它的影响可以忽略不计。 - Vsevolod Golovanov
@abc,就记录而言,目前在我的开发PC上,Chrome测试需要5秒钟才能启动,不记得使用FF需要多长时间了。 - Vsevolod Golovanov
@VsevolodGolovanov,在我的情况下,我们在Unix平台上运行我们的应用程序。我们调用Firefox并从网站中读取一些内容,当Firefox启动时,它将在“/tmp”目录下创建临时配置文件夹rust_mozprofile。因此,如果Firefox突然停止,则位于“/tmp”目录下的rust_mozprofile将不会被删除。因此,我只想将路径从“/tmp”重定向到“/home”。如果您知道如何将路径从“/tmp”重定向到“/home”,请告诉我。 - Yaswanth

25

确保你打电话

driver.quit();

而不是

driver.close();

close()不会删除临时文件


这应该是一条注释而不是答案。这如何回答问题? - stuxnetting
这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言 - 您始终可以在自己的帖子上发表评论,并且一旦您拥有足够的声望,您将能够评论任何帖子 - Johannes Klauß
7
这段话的意思是:如果你没有正确调用driver.quit(),你将会得到大量虚假配置数据,这会占用很多不必要的空间。 - m3nda
.close()也是Node.js实现的解决方案,可以避免留下一个大小为5MB的临时文件夹。 - David De Sloovere
请注意,如果有多个窗口,则close()quit()不同。 - user202729

3

在我查看了这个问题上的文档之后,答案其实很简单。我发现了FirefoxProfile类,并且构造函数需要传入Firefox配置文件的路径。

WebDriver driver = null;
FirefoxProfile profile = new FirefoxProfile(new File("C:\\Users\\Ranhiru\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\qp1nizdo.Selenium"));
driver = new FirefoxDriver(profile);

我通过运行带有-p标志的 "Firefox.exe" 创建了一个新的配置文件。

Firefox.exe -p

安装了我需要的扩展程序,就可以开始使用了! :)
更新
无论是否分配配置文件,临时文件夹中的临时配置文件都会被创建。通过创建和分配配置文件,您有机会在测试时使用Firebug / xpather /您最喜欢的扩展程序。

2
我花了好几个小时才弄清楚为什么它不使用指定的配置文件... 官方文档说:webdriver.firefox.profile 在启动 Firefox 时要使用的配置文件的名称。但它没有提到它仍然会创建新的匿名配置文件,只是将指定的配置文件作为源使用。哦,好吧,感谢您的更新,现在我明白了。 - Vsevolod Golovanov

2
您可以通过在FirefoxProfile类中调用addExtension(File)方法来加载所需插件的FirefoxWebDriver

示例:

try {
    File firebug = new File("C:\\FFPlugins\\firebug-1.7.3.xpi");
    File xpathChecker = new File("C:\\FFPlugins\\xpath_checker-0.4.4-fx.xpi");
    profile.addExtension(firebug);
    profile.setPreference("extensions.firebug.currentVersion", "1.7.3");
    profile.addExtension(xpathChecker);
    profile.setPreference("extensions.xpath_checker.currentVersion", "0.4.4");
} catch(IOException e) {
    e.printStackTrace();
}
driver = new FirefoxDriver(profile);

1
我已通过运行以下命令创建了自定义配置文件:

firefox -profileManager 

我需要添加任何所需的异常情况,因为由于Selenium每次打开干净的配置文件/实例,这些异常都会丢失。

然后,我直接使用以下内容创建我的Firefox浏览器:

private static String profilePath = "C:\\fitnesse\\Selenesse\\FFProfiles";
private static FirefoxProfile ffprofile = new FirefoxProfile(profilePath); 
private static IWebDriver driver = new FirefoxDriver(ffprofile);

0

您可以始终使用名为default的配置文件,这是用户默认使用的配置文件。在那里,您将拥有所有的cookie、插件等,并且您将能够毫无复杂性地使用它,使用

System.setProperty("webdriver.firefox.profile", "default");

在创建WebDriver之前

WebDriver driver = new FirefoxDriver();

如果要创建一些新的配置文件,您可以在shell中执行firefox -p,这将显示给您。

Add new profile to Firefox

并获得除已有的default之外的新配置文件。这将为您提供所需的所有自由。


0
  1. 使用以下命令启动 Firefox: firefox -P
  2. 创建新的配置文件(例如 webdriver1),添加必要的插件等。
  3. 将以下代码添加到您的测试用例中:

    DesiredCapabilities desiredCapabilities =
        new DesiredCapabilities("firefox", "", Platform.ANY);
    FirefoxProfile profile = new ProfilesIni().getProfile("webdriver1");
    desiredCapabilities.setCapability("firefox_profile", profile);
    WebDriver webdriver = new RemoteWebDriver(desiredCapabilities);
    

0

即使您明确指定了一个临时文件,也无法阻止Selenium创建临时文件。但是您可以在测试完成后清除它。

TemporaryFilesystem.getDefaultTmpFS().deleteTemporaryFiles()

在 MacOS 和 Ubuntu 上测试通过。


-1

1
这适用于Selenium RC。我正在使用Selenium Web Driver API。 - Ranhiru Jude Cooray

-1

在程序开始之前,您可以指定不同的临时文件位置,以便您的程序不会因为“内存空间不足”而停止。

if(!new File("c:/temp_data").isDirectory())  //to check dir exist

    FileUtils.forceMkdir(new File("c:/temp_data")); //create dir if not exists    
    TemporaryFilesystem.setTemporaryDirectory(new File("c:/temp_data")); //set new dir as temp file path for selenium    
    FirefoxProfile profile = new FirefoxProfile();

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