当前位置: 首页 > 知识库问答 >
问题:

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

裴钧
2023-03-14

我有一个使用服务人员和缓存API的应用程序。Service Worker中使用的缓存名称包含GIT修订版(哈希),因此每次发布时,都会使用新缓存,删除旧缓存。这是为了百分之百地确保用户总是能够获得最新的源代码(这种情况对于预期的发布计划来说很好)。

我使用的是每天运行几次的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);

问题是,尽管调用电流rofile.layoutOnDisk();似乎不包含任何缓存相关信息,我不知道如何获取当前正在使用的临时配置文件的路径(在Linux,通常是像/tmp/匿名6209009552324183685webdrive-profile

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

请注意,我正在CI server中运行测试,因此一些手动解决方案可能非常困难(但嘿,至少它可以为我指明一些方向…)

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

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

然后知道“测试”模型概要文件(model,而不是getProfile调用创建的副本)的实际路径,我可以用调用ProfilesIni()的文件替换它的所有文件。getProfile(“测试”)在测试结束时,但这似乎不会复制访问页面的历史记录。

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

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

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

  • 一个是通过调用new ProfilesIni()创建的。getProfile(“测试”)并且在测试过程中不会“永远”更新它
  • 第二个是从FirefoxDriver创建的。startClient方法,该方法调用NewProfileExtensionConnection。启动,然后调用FirefoxProfile。布局和磁盘

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

共有2个答案

闻人志
2023-03-14

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

有关更多信息,请参见此处

所以对于firefox来说,唯一的事情就是使用“driver.Manage().cookies.AllCookies;”保存所有cookie在下一次执行中使用这些。

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

   ProfilesIni profile = new ProfilesIni();

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

   WebDriver driver = new FirefoxDriver(myprofile);

我希望IE在开始前不要清理,这样会有所帮助。以下是链接帮助您

你也可以试试铬型材

谢谢你Murali

谢同化
2023-03-14

您可以重写FirefoxProfile。LayoutAndisk方法始终对配置文件使用相同的文件夹:

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);
        }
    }
}

用法:

java prettyprint-override">FirefoxProfileEx profile = new FirefoxProfileEx(new File("C:\\temp\\profile"));
WebDriver driver= new FirefoxDriver(profile);
 类似资料:
  • 我建立了一个进步的网络应用,https://www.tavest.com.我不明白为什么我的服务人员也被缓存在Chrome中?https://www.tavest.com/service-worker-tavest.js因此,当我更改服务人员时,chrome没有检测到更改,因此服务人员没有更新。 尽管我刷新了很多次页面,它仍然是一样的。然而,在Mozilla中,它工作得很好。这是我安装服务人员的代

  • 我试图安装一个简单的ServiceWorker,但旧的,Django Web应用程序。我开始使用Chrome团队的示例读取缓存示例 这很好,但并不理想,因为如果需要,我想更新缓存。根据阅读此处所有其他服务人员的答案,有两种推荐方法。 > 使用一些服务器端逻辑来知道您显示的内容何时更新,然后更新您的服务辅助角色以更改所述内容。例如,这就是sw-preache所做的。 只要在需要更新资源时更新serv

  • 我正在使用Service Worker创建一个渐进式Web应用程序,我正在使用Service Worker工具箱来缓存我的内容。Service Worker代码来缓存我的内容: 代码运行正常,因为我在控制台上没有看到任何错误。但是我如何检查是否从云前或上面配置的网址的图像正在缓存和从缓存本身渲染。

  • 我使用带有sw工具箱库的service worker。我的PWA缓存除API查询(图像、css、js、html)之外的所有内容。但是如果有一天某些文件会被更改呢。或者如果服务人员。js将被更改。应用程序应该如何知道文件中的更改? 我的服务人员。js: 我不知道在PWA中更新缓存的常用方法是什么。也许PWA应该在后台发送AJAX请求并检查UI版本?

  • 我们在reactjs应用程序中安装了离线插件,该应用程序使用service worker缓存构建文件,未检查新构建的任何更新,因此,具有旧构建的用户仍在使用service worker中的缓存数据访问旧站点。这些文件没有过期设置,所以我想知道是否有任何解决方案可以强制用户刷新页面或将更新推给用户? 我在新版本中进行了更新,没有缓存头,离线插件自动更新,但我仍然无法找到将此更新推送到旧用户文件的方法

  • 因此,我有一个带有服务工作者的HTML页面,服务工作者缓存索引。html和我的JS文件。 问题是当我更改JS时,更改不会直接显示在客户端浏览器上。当然,在chrome开发工具中,我可以禁用缓存。但是在Chrome Mobile,我该怎么做呢? 我试图访问站点设置并点击CLEAR%RESET按钮。但它仍然从缓存加载旧页面/加载。我试图使用其他浏览器或铬隐姓埋名,它加载新的页面。 然后,我尝试清除我的