在Selenium中测试服务工作者和缓存

时间:2016-04-29 09:14:34

标签: selenium firefox selenium-webdriver service-worker selenium-firefoxdriver

我有一个使用Service Workers和Cache API的应用。 Service Worker中使用的缓存名称包含GIT版本(哈希),因此每次发布时都会使用新缓存并删除旧缓存。这是为了100%确保用户始终获得最新的来源(这种情况适用于预期的发布时间表)。

我正在使用每天运行几次的Selenium Java(WebDriver)测试(假设当GIT repo发生变化时),我想确保每个新的工作正常擦除工作者的缓存GIT修订版。

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

  • 保留一些模型档案目录
  • 当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);

问题是,调用currentProfile.layoutOnDisk();似乎不包含任何缓存相关信息,我不知道如何获取当前正在使用的临时配置文件的路径(在Linux中,通常类似于{{ 1}}

基本上我的问题是,如何在多个测试运行中保留和控制浏览器(Firefox)缓存?我知道通常需要在测试中使用新缓存启动浏览器,但我认为对于测试Service Workers的这种特殊情况,对它进行一些控制是非常有用的。

请注意我在CI服务器上运行测试,所以一些手动解决方案可能会非常困难(但是,至少它可以指向某个方向......)

更新:我可以使用

启动Firefox个人资料
/tmp/anonymous6209009552324183685webdriver-profile

然后知道“测试”模型配置文件的实际路径(模型,而不是getProfile调用创建的副本),我可以将所有文件替换为在测试结束时调用profile = new ProfilesIni().getProfile("test") 的文件,但是这似乎不是例如复制访问过的页面的历史记录。

更新2:这就是我启动浏览器的方式:

ProfilesIni().getProfile("test")

我可以看到它创建了两个配置文件临时文件夹:

  • 一个是通过电话caps = DesiredCapabilities.firefox(); FirefoxProfile sampleProfile = new ProfilesIni().getProfile("test"); caps.setCapability(FirefoxDriver.PROFILE, sampleProfile); browser = new FirefoxDriver(caps); 创建的,并且在测试期间不会“永远”更新
  • 第二个是从new ProfilesIni().getProfile("test")方法创建的,该方法调用FirefoxDriver.startClient然后调用NewProfileExtensionConnection.start

现在在测试期间,只有第二个配置文件正在更新,我认为这有点意义。问题是如何获得从功能创建的实际配置文件目录...

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

有关详细信息,请参阅here

因此对于firefox来说,只有使用" driver.Manage()才能保存所有cookie.Cookies.AllCookies;"在下次执行中使用这些。

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

   ProfilesIni profile = new ProfilesIni();

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

   WebDriver driver = new FirefoxDriver(myprofile);

我希望IE在启动前不通过清除帮助。这是link帮助你

您也可以尝试使用chrome profile

谢谢你, 穆拉利