testcafe 运行 基于浏览器的不同测试
testcafe running different tests based on browser
我想知道是否有办法以某种方式传递参数,让您的夹具甚至所有测试都知道它们在哪个浏览器中 运行。
在我的特定情况下,我会使用该参数简单地将相应的值分配给测试中的变量。
例如,
switch(browser) {
case 'chrome':
chrome = 'chrome.com';
break;
case 'firefox':
link = 'firefox.com';
break;
case 'safari':
link = 'safari.com';
break;
default:
break;
}
目前,我可以通过添加全局节点变量来实现类似的功能,它看起来像这样:
"chrome": "BROWSER=1 node runner.js"
然而,这让我为每个浏览器(safari-runner、chrome-runner 等)创建了一个单独的运行器,我想把所有东西都放在一个地方。
所以在一天结束时,我需要完成这项工作:
const createTestCafe = require('testcafe');
let testcafe = null;
createTestCafe('localhost', 1337, 1338)
.then(tc => {
testcafe = tc;
const runner = testcafe.createRunner();
return runner
.src('test.js')
.browsers(['all browsers'])
.run({
passBrowserId: true // I guess it would look something like this
});
})
.then(failedCount => {
console.log('Tests failed: ' + failedCount);
testcafe.close();
})
.catch(error => {
console.log(error);
testcafe.close();
});
有几种获取浏览器信息的方法:
使用 ClientFunction 从浏览器获取 navigator.userAgent。您可以选择使用模块来解析用户代理字符串,例如:ua-parser-js.
import { ClientFunction } from 'testcafe';
import uaParser from 'ua-parser-js';
fixture `get ua`
.page `https://testcafe.devexpress.com/`;
const getUA = ClientFunction(() => navigator.userAgent);
test('get ua', async t => {
const ua = await getUA();
console.log(uaParser(ua).browser.name);
});
使用RequestLogger获取浏览器信息。例如:
import { RequestLogger } from 'testcafe';
const logger = RequestLogger('https://testcafe.devexpress.com/');
fixture `test`
.page('https://testcafe.devexpress.com')
.requestHooks(logger);
test('test 1', async t => {
await t.expect(logger.contains(record => record.response.statusCode === 200)).ok();
const logRecord = logger.requests[0];
console.log(logRecord.userAgent);
});
TestCafe 团队正在研究t.browserInfo功能,该功能将在未来解决。
为了更新这个问题,testcafe 现在已经实现了 t.browser,这将允许您检查 browser.name
或 browser.alias
以确定您使用的是哪个浏览器 运行中
import { t } from 'testcafe';
const browserIncludes = b => t.browser.name.includes(b);
const isBrowserStack = () => t.browser.alias.includes('browserstack');
fixture `test`
.page('https://testcafe.devexpress.com')
test('is Chrome?', async () => {
console.log(t.browser.name);
await t.expect(browserIncludes('Chrome').ok();
await t.expect(isBrowserStack()).notOk();
});
我想知道是否有办法以某种方式传递参数,让您的夹具甚至所有测试都知道它们在哪个浏览器中 运行。
在我的特定情况下,我会使用该参数简单地将相应的值分配给测试中的变量。
例如,
switch(browser) {
case 'chrome':
chrome = 'chrome.com';
break;
case 'firefox':
link = 'firefox.com';
break;
case 'safari':
link = 'safari.com';
break;
default:
break;
}
目前,我可以通过添加全局节点变量来实现类似的功能,它看起来像这样:
"chrome": "BROWSER=1 node runner.js"
然而,这让我为每个浏览器(safari-runner、chrome-runner 等)创建了一个单独的运行器,我想把所有东西都放在一个地方。
所以在一天结束时,我需要完成这项工作:
const createTestCafe = require('testcafe');
let testcafe = null;
createTestCafe('localhost', 1337, 1338)
.then(tc => {
testcafe = tc;
const runner = testcafe.createRunner();
return runner
.src('test.js')
.browsers(['all browsers'])
.run({
passBrowserId: true // I guess it would look something like this
});
})
.then(failedCount => {
console.log('Tests failed: ' + failedCount);
testcafe.close();
})
.catch(error => {
console.log(error);
testcafe.close();
});
有几种获取浏览器信息的方法:
使用 ClientFunction 从浏览器获取 navigator.userAgent。您可以选择使用模块来解析用户代理字符串,例如:ua-parser-js.
import { ClientFunction } from 'testcafe'; import uaParser from 'ua-parser-js'; fixture `get ua` .page `https://testcafe.devexpress.com/`; const getUA = ClientFunction(() => navigator.userAgent); test('get ua', async t => { const ua = await getUA(); console.log(uaParser(ua).browser.name); });
使用RequestLogger获取浏览器信息。例如:
import { RequestLogger } from 'testcafe'; const logger = RequestLogger('https://testcafe.devexpress.com/'); fixture `test` .page('https://testcafe.devexpress.com') .requestHooks(logger); test('test 1', async t => { await t.expect(logger.contains(record => record.response.statusCode === 200)).ok(); const logRecord = logger.requests[0]; console.log(logRecord.userAgent); });
TestCafe 团队正在研究t.browserInfo功能,该功能将在未来解决。
为了更新这个问题,testcafe 现在已经实现了 t.browser,这将允许您检查 browser.name
或 browser.alias
以确定您使用的是哪个浏览器 运行中
import { t } from 'testcafe';
const browserIncludes = b => t.browser.name.includes(b);
const isBrowserStack = () => t.browser.alias.includes('browserstack');
fixture `test`
.page('https://testcafe.devexpress.com')
test('is Chrome?', async () => {
console.log(t.browser.name);
await t.expect(browserIncludes('Chrome').ok();
await t.expect(isBrowserStack()).notOk();
});