internjs测试失败怎么截图?
How do I take a screenshot when a test in internjs fails?
我在弄清楚如何仅在 InternJs 中的测试失败时截取屏幕截图时遇到问题。我的 registerSuite 中有这个简单的测试;
'verify google homepage': function () {
var url = 'https://www.google.com/';
return this.remote
.get(url)
.getCurrentUrl()
.then(function (data) {
assert.strictEqual(data, url, 'Incorrect URL');
})
.findByName('q')
.click()
}
我可以使用以下代码简单地创建屏幕截图;
.takeScreenshot
.then(function (data) {
fs.writeFileSync('/path/to/some/file', data, 'base64');
)}
如果上述测试断言失败或无法找到定位器,我只想截屏。
我研究了 afterEach
方法,但我不知道如何获取最后一个测试的状态以应用条件。
所以我的问题是,有没有人将他们的 internjs 测试设置为仅在失败时截取屏幕截图,它是如何完成的?
目前无法通过 beforeEach
或 afterEach
方法与当前正在执行的测试进行交互;此功能将在下一版本的 Intern 中提供。
Selenium 服务器,默认情况下,提供每个 Selenium 命令失败的屏幕截图,这是 error.detail.screen
属性 上的一个 Buffer 对象。如果 Selenium 命令失败,只需使用这个 属性 已经有屏幕截图等着你。
对于断言失败,你可以创建一个简单的promise helper来帮你截图:
function screenshotOnError(callback) {
return function () {
try {
return callback.apply(this, arguments);
}
catch (error) {
return this.remote.takeScreenshot().then(function (buffer) {
fs.writeFileSync('/path/to/some/file', buffer);
throw error;
});
}
};
}
// ...
'verify google homepage': function () {
return this.remote.get(url).getCurrentUrl().then(screenshotOnError(function (actualUrl) {
assert.strictEqual(actualUrl, url);
}));
}
如果像这样手动包装所有回调太不方便,您还可以创建并使用自定义界面来注册您的测试,以类似的方式自动为您包装测试函数。我将把它留作 reader.
的练习
您可以在链的末尾使用 catch 方法,并按照 C Snover 的建议使用 error.detail.screen。
'verify google homepage': function () {
return this.remote
.get(require.toUrl('./fixture.html'))
.findById('operation')
.click()
.type('hello, world')
.end()
.findById('submit')
.click()
.end()
.catch(function(error){
fs.writeFileSync('/tmp/screenshot.png', error.detail.screen);
})
}
我今天一直在玩这个,并且已经设法将它用于整个套件,而不是需要将代码添加到似乎完全没有必要的每个测试中。
var counter = -1,
suite = {
beforeEach: function () {
counter++;
},
afterEach: function () {
var currentTest = this.tests[counter];
if (!currentTest.error) {
return;
}
this.remote
.takeScreenshot().then(function (buffer) {
if (!fs.existsSync(path)) {
fs.mkdirSync(path);
}
fs.writeFileSync('/tmp/' + currentTest.name + '.png', buffer);
});
}
};
你需要做的烦人的事情是对每个测试套件都这样做而不是 "globally" 但比对每个测试都这样做要好得多。
根据 this issue,从 Intern 3.0 开始,您可以做一个自定义报告程序,在测试失败时截取屏幕截图。所以你可以用一种简单的方式集中它,只需在你的 config.js
中引用自定义报告器。在我的例子中,我可以在 config.js
中添加一个记者数组,并带有我的自定义数组的路径:
reporters: [
{ id: 'tests/support/ScreenShot' }
],
比我让自定义记者覆盖 testFail
:
'use strict';
define([
'intern/dojo/node!fs',
], function(fs) {
function ScreenShot(config) {
config = config || {};
}
ScreenShot.prototype.testFail = function(test) {
test.remote.takeScreenshot().then(function(buffer) {
try {
fs.writeFileSync('./screenshots/' + test.parent.name.replace(/ /g, '') + '-' +
test.name.replace(/ /g, '') + '.png', buffer);
} catch (err) {
console.log('Failed to take a screenshot: ' + err);
}
});
};
return ScreenShot;
});
注意引用自定义报告者和截图位置的相对路径。它们似乎都考虑了您 运行 intern-runner
的位置,而不是源文件所在的位置。
有关自定义记者的更多信息,请访问 this page.
基于 Hugo Oshiro 的回答,
// tests/support/CleanScreenshots.js
define([
'intern/dojo/node!path',
'intern/dojo/node!del',
], function(path, del) {
return new Promise((resolve, reject) => {
let directory = 'tests/screenshots';
del(path.join(directory, '**/*'))
.then(resolve)
.catch(reject);
});
});
然后在您的实习生配置中:
/* global define */
define([
'tests/support/CleanScreenshots'
], function (CleanScreenshots) {
return {
...
setup: function () {
return CleanScreenshots();
},
...
};
});
我在弄清楚如何仅在 InternJs 中的测试失败时截取屏幕截图时遇到问题。我的 registerSuite 中有这个简单的测试;
'verify google homepage': function () {
var url = 'https://www.google.com/';
return this.remote
.get(url)
.getCurrentUrl()
.then(function (data) {
assert.strictEqual(data, url, 'Incorrect URL');
})
.findByName('q')
.click()
}
我可以使用以下代码简单地创建屏幕截图;
.takeScreenshot
.then(function (data) {
fs.writeFileSync('/path/to/some/file', data, 'base64');
)}
如果上述测试断言失败或无法找到定位器,我只想截屏。
我研究了 afterEach
方法,但我不知道如何获取最后一个测试的状态以应用条件。
所以我的问题是,有没有人将他们的 internjs 测试设置为仅在失败时截取屏幕截图,它是如何完成的?
目前无法通过
beforeEach
或afterEach
方法与当前正在执行的测试进行交互;此功能将在下一版本的 Intern 中提供。Selenium 服务器,默认情况下,提供每个 Selenium 命令失败的屏幕截图,这是
error.detail.screen
属性 上的一个 Buffer 对象。如果 Selenium 命令失败,只需使用这个 属性 已经有屏幕截图等着你。对于断言失败,你可以创建一个简单的promise helper来帮你截图:
function screenshotOnError(callback) {
return function () {
try {
return callback.apply(this, arguments);
}
catch (error) {
return this.remote.takeScreenshot().then(function (buffer) {
fs.writeFileSync('/path/to/some/file', buffer);
throw error;
});
}
};
}
// ...
'verify google homepage': function () {
return this.remote.get(url).getCurrentUrl().then(screenshotOnError(function (actualUrl) {
assert.strictEqual(actualUrl, url);
}));
}
如果像这样手动包装所有回调太不方便,您还可以创建并使用自定义界面来注册您的测试,以类似的方式自动为您包装测试函数。我将把它留作 reader.
的练习您可以在链的末尾使用 catch 方法,并按照 C Snover 的建议使用 error.detail.screen。
'verify google homepage': function () {
return this.remote
.get(require.toUrl('./fixture.html'))
.findById('operation')
.click()
.type('hello, world')
.end()
.findById('submit')
.click()
.end()
.catch(function(error){
fs.writeFileSync('/tmp/screenshot.png', error.detail.screen);
})
}
我今天一直在玩这个,并且已经设法将它用于整个套件,而不是需要将代码添加到似乎完全没有必要的每个测试中。
var counter = -1,
suite = {
beforeEach: function () {
counter++;
},
afterEach: function () {
var currentTest = this.tests[counter];
if (!currentTest.error) {
return;
}
this.remote
.takeScreenshot().then(function (buffer) {
if (!fs.existsSync(path)) {
fs.mkdirSync(path);
}
fs.writeFileSync('/tmp/' + currentTest.name + '.png', buffer);
});
}
};
你需要做的烦人的事情是对每个测试套件都这样做而不是 "globally" 但比对每个测试都这样做要好得多。
根据 this issue,从 Intern 3.0 开始,您可以做一个自定义报告程序,在测试失败时截取屏幕截图。所以你可以用一种简单的方式集中它,只需在你的 config.js
中引用自定义报告器。在我的例子中,我可以在 config.js
中添加一个记者数组,并带有我的自定义数组的路径:
reporters: [
{ id: 'tests/support/ScreenShot' }
],
比我让自定义记者覆盖 testFail
:
'use strict';
define([
'intern/dojo/node!fs',
], function(fs) {
function ScreenShot(config) {
config = config || {};
}
ScreenShot.prototype.testFail = function(test) {
test.remote.takeScreenshot().then(function(buffer) {
try {
fs.writeFileSync('./screenshots/' + test.parent.name.replace(/ /g, '') + '-' +
test.name.replace(/ /g, '') + '.png', buffer);
} catch (err) {
console.log('Failed to take a screenshot: ' + err);
}
});
};
return ScreenShot;
});
注意引用自定义报告者和截图位置的相对路径。它们似乎都考虑了您 运行 intern-runner
的位置,而不是源文件所在的位置。
有关自定义记者的更多信息,请访问 this page.
基于 Hugo Oshiro 的回答,
// tests/support/CleanScreenshots.js
define([
'intern/dojo/node!path',
'intern/dojo/node!del',
], function(path, del) {
return new Promise((resolve, reject) => {
let directory = 'tests/screenshots';
del(path.join(directory, '**/*'))
.then(resolve)
.catch(reject);
});
});
然后在您的实习生配置中:
/* global define */
define([
'tests/support/CleanScreenshots'
], function (CleanScreenshots) {
return {
...
setup: function () {
return CleanScreenshots();
},
...
};
});