我有一个使用Service Workers和Cache 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);
问题是,调用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
现在在测试期间,只有第二个配置文件正在更新,我认为这有点意义。问题是如何获得从功能创建的实际配置文件目录...
答案 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
谢谢你, 穆拉利