是否可以 运行 在 Express.js 内进行 TestCafe 测试?
Is it possible to run a TestCafe test within Express.js?
我正在尝试弄清楚是否可以从 Express.js 应用程序的上下文中 运行 TestCafe 测试。我的想法是创建一个表单,接受输入(如 UPC 代码),然后单击表单上的提交将导致 TestCafe 测试以无头模式(某处)产生并将该 upc 加载到此页面 https://www.ebay.com/sh/research .从那里,TestCafe 将从页面获取结果并将它们保存在我的数据库中。
我把测试放在一个名为 tests.js 的文件中,并像这样 routes/tests.js
// routes/test.js
const eBayScrapingHub = (upc) => {
test('Scraper 1', async t => {
await t
.wait(3000)
.typeText(Selector('input[name="productId"]'), upc)
.click(Selector('div#mainContent button[type="submit"].search-button.btn.btn--medium.btn--primary'))
.wait(5000)
console.log('finished!')
});
}
module.exports = eBayScrapingHub;
路由文件本身,命名为ebay.js
// routes/ebay.js
const { eBayScrapingHub } = require('./tests');
const { Selector } = require('testcafe');
// Process Ebay Form
router.post('/', ensureAuthenticated, (req, res)=>{
var query = req.body.input;
console.log('This is your query: ', query);
fixture `Ebay Seller Hub Scraper`
.page `https://www.ebay.com/sh/research`;
eBayScrapingHub(query);
}
});
表格
// views/ebay/add.handlebars
<div class="card card-body">
<h3>Add UPC</h3>
<p>Input a UPC Code to search eBay</p>
<form action="/ebay" method="post">
<div class="form-group">
<label for="input">Input</label>
<input type="text" class="form-control" name="input" required>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
不幸的是,当我尝试这样做时出现了各种错误。
我尝试使用 import { Selector } from 'testcafe' 导入选择器并收到此错误:
import { Selector } from 'testcafe';
^
SyntaxError: Unexpected token {
所以我将其更改为 const { Selector } = require('testcafe');
以使错误消失。
由于无法识别,现在无法使用"fixture":
ReferenceError: fixture is not defined
任何人都可以告诉我这是否可行或如何正确执行此操作?谢谢!
不要将 TestCafe fixture/test 定义与您的自定义代码混合。分开存放。
查看 Programming Interface 文章,该文章描述了如何从您的自定义 Node.js 代码 运行 TestCafe 测试。
对于将来可能对其他人有用的人,我已经通过以下方式解决了这个问题:
在 express 中,/routes 文件:
// /routes/testcafe.js
const express = require('express');
const router = express.Router();
const createTestCafe = require('testcafe');
var testcafe = null;
router.get('/testcafe', (req, res) => {
createTestCafe('localhost', 1337, 1338)
.then(tc => {
testcafe = tc;
const runner = testcafe.createRunner();
console.log('About to start tests/myTest.js!');
return runner
.src(['/root/user/express_server/routes/tests/myTest.js'])
.browsers(['firefox:headless'])
.run()
})
.then(failedCount => {
console.log('Tests failed: ' + failedCount);
testcafe.close()
});
});
module.exports = router;
将上面的代码放入文件后,只需向我的服务器发送一个获取请求就可以成功启动测试,地址如下:
http://express_server_ip:port/testcafe
我正在尝试弄清楚是否可以从 Express.js 应用程序的上下文中 运行 TestCafe 测试。我的想法是创建一个表单,接受输入(如 UPC 代码),然后单击表单上的提交将导致 TestCafe 测试以无头模式(某处)产生并将该 upc 加载到此页面 https://www.ebay.com/sh/research .从那里,TestCafe 将从页面获取结果并将它们保存在我的数据库中。
我把测试放在一个名为 tests.js 的文件中,并像这样 routes/tests.js
// routes/test.js
const eBayScrapingHub = (upc) => {
test('Scraper 1', async t => {
await t
.wait(3000)
.typeText(Selector('input[name="productId"]'), upc)
.click(Selector('div#mainContent button[type="submit"].search-button.btn.btn--medium.btn--primary'))
.wait(5000)
console.log('finished!')
});
}
module.exports = eBayScrapingHub;
路由文件本身,命名为ebay.js
// routes/ebay.js
const { eBayScrapingHub } = require('./tests');
const { Selector } = require('testcafe');
// Process Ebay Form
router.post('/', ensureAuthenticated, (req, res)=>{
var query = req.body.input;
console.log('This is your query: ', query);
fixture `Ebay Seller Hub Scraper`
.page `https://www.ebay.com/sh/research`;
eBayScrapingHub(query);
}
});
表格
// views/ebay/add.handlebars
<div class="card card-body">
<h3>Add UPC</h3>
<p>Input a UPC Code to search eBay</p>
<form action="/ebay" method="post">
<div class="form-group">
<label for="input">Input</label>
<input type="text" class="form-control" name="input" required>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
不幸的是,当我尝试这样做时出现了各种错误。
我尝试使用 import { Selector } from 'testcafe' 导入选择器并收到此错误:
import { Selector } from 'testcafe';
^
SyntaxError: Unexpected token {
所以我将其更改为 const { Selector } = require('testcafe');
以使错误消失。
由于无法识别,现在无法使用"fixture":
ReferenceError: fixture is not defined
任何人都可以告诉我这是否可行或如何正确执行此操作?谢谢!
不要将 TestCafe fixture/test 定义与您的自定义代码混合。分开存放。
查看 Programming Interface 文章,该文章描述了如何从您的自定义 Node.js 代码 运行 TestCafe 测试。
对于将来可能对其他人有用的人,我已经通过以下方式解决了这个问题:
在 express 中,/routes 文件:
// /routes/testcafe.js
const express = require('express');
const router = express.Router();
const createTestCafe = require('testcafe');
var testcafe = null;
router.get('/testcafe', (req, res) => {
createTestCafe('localhost', 1337, 1338)
.then(tc => {
testcafe = tc;
const runner = testcafe.createRunner();
console.log('About to start tests/myTest.js!');
return runner
.src(['/root/user/express_server/routes/tests/myTest.js'])
.browsers(['firefox:headless'])
.run()
})
.then(failedCount => {
console.log('Tests failed: ' + failedCount);
testcafe.close()
});
});
module.exports = router;
将上面的代码放入文件后,只需向我的服务器发送一个获取请求就可以成功启动测试,地址如下:
http://express_server_ip:port/testcafe