0

我有一个使用服务工作者和缓存API的应用程序。 Service Worker中使用的缓存名称包含GIT修订版(散列),因此每个版本都使用新的缓存并删除旧的缓存。这是为了让100%的用户始终能够获得最新的资源(对于预期的发布时间表,这种情况很好)。在硒中测试服务工作者和缓存

我使用Selenium每天运行几次的Java(WebDriver)测试(比方说,当GIT repo发生变化时),我想确保工作人员的缓存正在被正确擦除新的GIT修订版。

默认情况下,Selenium正在为每个浏览器会话创建一个新的临时概要文件目录,这意味着在测试开始时总是没有缓存。我想,虽然使用缓存,我的想法是(让我们谈谈关于Firefox现在):

  • 保留一些模型简介目录
  • 当硒启动火狐,通过模型配置文件到新的临时配置文件,例如new FirefoxProfile(new File(PROFILE_MODEL))
  • 这将确保一些缓存中之前开始浏览器
  • 一旦测试完成,备份临时配置文件(因为它包含更新缓存)和替换(现在年纪大了)PROFILE_MODEL与最新的配置文件,以便下一次测试运行将使用此更新缓存再次

的“模型轮廓文件更新步骤”在试运行的结束是这样的伪代码

File modelDir = new File(PROFILE_MODEL); 
// copy current model for backup 
bckPath = Files.createTempDirectory("bckProfile"); 
Util.copy(modelDir, bckPath); 

// remove the now obsolete PROFILE_MODEL 
Util.deleteDirectory(modelDir); 

// copy current profile to the model dir 
File profileSnapshot = currentProfile.layoutOnDisk(); 
Util.copy(profileSnapshot.toPath(), modelPath); 

的问题是,虽然,在C所有currentProfile.layoutOnDisk();似乎并没有包含任何缓存相关的信息,我不知道如何获得当前正在使用的临时配置文件的路径(在Linux中,通常类似于/tmp/anonymous6209009552324183685webdriver-profile

所以基本上我的问题是,如何保护和控制浏览器(Firefox)缓存跨多个测试运行?我知道通常希望在测试中启动带有新缓存的浏览器,但我认为对于测试服务人员的这种特殊情况,对其进行一些控制是非常有用的。

请注意,我跑在CI服务器测试,所以一些手动解决方案可能是相当困难的(但是,嘿,至少它可以点我的一些方向?)

更新:我可以启动Firefox的配置文件与

profile = new ProfilesIni().getProfile("test") 

,然后知道实际的路径,以“测试”模式的个人资料(型号,而不是由getProfile调用创建副本),我可以从调用ProfilesIni().getProfile("test")在更换它与那些所有文件测试结束,但这似乎并没有例如复制访问过的页面的历史。

更新2:这是我如何启动浏览器:

caps = DesiredCapabilities.firefox(); 
FirefoxProfile sampleProfile = new ProfilesIni().getProfile("test"); 
caps.setCapability(FirefoxDriver.PROFILE, sampleProfile); 
browser = new FirefoxDriver(caps); 

,我可以看到它创建了2个人临时文件夹:

  • 一个由呼叫new ProfilesIni().getProfile("test")创建,它赢得在测试过程中不会得到更新
  • 第二个是从FirefoxDriver.startClient创建的方法,该方法调用NewProfileExtensionConnection.start然后调用FirefoxProfile.layoutOnDisk

现在在测试过程中,只有第二个配置文件正在更新,我猜是有道理的。问题是,如何获取从功能创建的实际轮廓目录,可...

回答

2

您可以覆盖FirefoxProfile.layoutOnDisk方法总是使用同一个文件夹的文件:

public class FirefoxProfileEx extends FirefoxProfile { 

    File profileDir; 

    public FirefoxProfileEx(File profileDir){ 
     super(profileDir); 
     this.profileDir = profileDir; 
    } 

    public File layoutOnDisk() { 
     try { 
      File userPrefs = new File(profileDir, "user.js"); 

      installExtensions(profileDir); 
      deleteLockFiles(profileDir); 
      deleteExtensionsCacheIfItExists(profileDir); 
      updateUserPrefs(userPrefs); 
      return profileDir; 
     } catch (IOException e) { 
      throw new UnableToCreateProfileException(e); 
     } 
    } 
} 

用法:

FirefoxProfileEx profile = new FirefoxProfileEx(new File("C:\\temp\\profile")); 
WebDriver driver= new FirefoxDriver(profile); 
+0

这是伟大的。我想知道用cookies做同样的事情。这是如何完成的? – conteh

0

已知的layoutOnDisk()将用于调用当前配置文件,我们将写入或保存到磁盘。我们需要尽可能早地使用这个保存的配置文件或目录,因为一旦执行完成,通过使用layoutOnDisk()保存的配置文件就没用了。他们不工作。

欲了解更多信息,请参阅here

所以对于Firefox的唯一的事情就是刚刚通过保存所有Cookie“driver.Manage()Cookies.AllCookies。”在下次执行中使用这些。

我希望它更喜欢使用命名配置文件,而不是从目录中获取配置文件。 Here创建配置文件的方式

ProfilesIni profile = new ProfilesIni(); 

    FirefoxProfile myprofile = profile.getProfile("myProfilewhichIsSaved"); 

    WebDriver driver = new FirefoxDriver(myprofile); 

我希望IE在开始之前不会帮助清除。这里link帮助你

您也可以通过镀铬尝试profile

谢谢你, 穆拉利

+0

我不确定我是否关注,但这不适合我。我试图使用更新中提到的命名配置文件,它创建了命名配置文件的“克隆”,它不使用现有的命名配置文件,这意味着任何页面访问将被记录在克隆的配置文件中,但不是原来的(在测试之后它保持完整)。这同样适用于layoutOnDisk(),它再次对命名配置文件进行克隆,但不是测试过程中使用的更新配置文件的副本。我会在原始问题中添加更多信息。谢谢 – ladar

+0

嗨,即使你使用命名配置文件,但我没有工作。因为一旦执行完成,所有的cookies/catch都会被删除。我的意思是说,而不是从目录中调用配置文件的好习惯来使用命名配置文件。我希望你明白了我的意思是说 –

+0

没错,但似乎使用通过功能设置的配置文件只创建一个新的配置文件,命名配置文件的克隆,并且原来的命名配置文件不再被“更新”试验。我需要改变我的设置,看看如果我根本不使用功能,它将如何运作。 – ladar