如何在每个测试之间完美隔离和清除环境?[英] How to perfectly isolate and clear environments between each test?

问题描述

我正在尝试使用Casperjs连接到SoundCloud.有趣的是,一旦您登录并重新运行登录功能,则先前的登录仍处于活动状态.在进行进一步之前,以下是代码:

casper.thenOpen('https://soundcloud.com/', function() {
  casper.click('.header__login');

  popup = /soundcloud\.com\/connect/;

  casper.waitForPopup(popup, function() {
    casper.withPopup(popup, function() {
      selectors = {
        '#username': username,
        '#password': password
      };

      casper.fillSelectors('form.log-in', selectors, false);

      casper.click('#authorize');
    });
  });
});

如果您至少运行了两次此代码,则应看到以下错误出现:

CasperError: Cannot dispatch mousedown event on nonexistent selector: .header__login

如果分析日志,您会发现第二次,您被重定向到 https://soundcloud.com/stream 意味着您已经登录了.

我做了一些研究以清除每个测试之间的环境,但似乎以下几行无法解决问题.

phantom.clearCookies()
casper.clear()
localStorage.clear()
sessionStorage.clear()

从技术上讲,我对了解这里发生的事情非常感兴趣.也许SoundCloud构建了一个系统来存储一些变量服务器端.在这种情况下,我必须在登录之前注销.但是我的问题是,如何在每个测试之间完美隔离和清除所有内容?有人知道如何使每个测试之间的环境未签名吗?

推荐答案

清除服务器端会话缓存,调用:phantom.clearCookies();为我带来了技巧.这清除了我在测试文件之间的会话. 示例在这里:

casper.test.begin("Test", {
  test: function(test) {
    casper.start(
      "http://example.com",
      function() {
        ... //Some testing here
      }
    );
    casper.run(function() {
      test.done();
    });
  }, 
  tearDown: function(test) {
    phantom.clearCookies();
  }
});

如果您仍在遇到问题,请检查执行测试的方式.

其他推荐答案

您在哪里致电Casper.clear()?

我认为您在打开页面之后必须立即调用它:

casper.start('http://www.google.fr/', function() {
    this.clear(); // javascript execution in this page has been stopped
    //rest of code
});

从文档中:清除当前页面执行环境上下文.对于避免以前加载的DOM内容仍然活跃的有用.

本文地址:https://www.itbaoku.cn/post/1739969.html