是否可以在Express.js中运行TestCafe测试?

时间:2019-11-22 20:26:43

标签: javascript node.js express testing testcafe

我试图找出是否有可能在Express.js应用程序的上下文中运行TestCafe测试。我的想法是创建一个表单,接受输入(如UPC代码),然后单击表单上的提交,这将导致TestCafe测试以无头模式(在某个地方)生成并将该upc加载到此页面https://www.ebay.com/sh/research中。从那里,TestCafe将从页面中获取结果并将其粘贴到我的数据库中。

我将测试放置在一个名为tests.js的文件中,并像下面的route / 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>

不幸的是,我尝试执行此操作时会出现各种错误。

我尝试从'testcafe'中导入带有import {Selector}的选择器,但出现此错误:

import { Selector } from 'testcafe';
       ^

SyntaxError: Unexpected token {

因此,我将其更改为const { Selector } = require('testcafe');,以消除错误。

现在由于无法识别“灯具”而无法使用:

ReferenceError: fixture is not defined

有人可以让我知道这是否可行或如何正确执行?谢谢!

2 个答案:

答案 0 :(得分:3)

请勿将TestCafe夹具/测试定义与您的自定义代码混合使用。分开存放。

看看Programming Interface文章,该文章描述了如何从自定义Node.js代码运行TestCafe测试。

答案 1 :(得分:0)

对于将来可能有用的其他人,我已经通过以下方式解决了这个问题:

特指/ 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;

将上面的代码放入文件中后,只需向以下地址的服务器发送get请求即可完全成功触发测试:

http://express_server_ip:port/testcafe