用梦魇js获取ajax请求

时间:2017-03-14 13:28:46

标签: javascript ajax post nightmare

所以,我正在使用梦魇js,我喜欢模拟登录程序,为此我使用像这样的梦魇

function testiiing(){
    nightmare
          .goto('http://localhost:4200/login')
          .type('#name', 'test')
          .type('#pwd', 'test')
          .click('#log')
          .evaluate(function() {
            return //something
          })
          .then(function(result) {
            console.log(result);
          })
          .then(function() {
            console.log('done');
          })
          .catch(function(error){
            console.error('an error has occurred: ' + error);
          });
}

问题是我想将“// something”更改为可以返回“name = test& pwd = test”的东西(所以ajax发布请求),任何人都可以帮助我或告诉我它是否是可能吗?

2 个答案:

答案 0 :(得分:0)

没有使用梦魇js的经验但是因为你已经标记了jQuery,只需使用.serialize()

https://api.jquery.com/serialize/

  

.serialize()方法使用标准的URL编码表示法创建文本字符串。它可以作用于已选择单个表单控件的jQuery对象,例如<input><textarea><select>$( "input, textarea, select" ).serialize();

示例:

$( "form" ).on( "submit", function( event ) {
  event.preventDefault();
  console.log( $( this ).serialize() );
});

这应该完全符合您的要求。

对于您的具体示例,请查看.serializeArray()

答案 1 :(得分:0)

我知道这已经老了,但这对我来说也很棘手。这就是我正在使用它的工作原理:

test(){
        let selector = "#twd";
        return this.nightmare
        .goto("https://time.is/")
        .inject("js", "jquery.js")  //actually injects jquery, which doesn't exist on the site
        .evaluate((selector) =>{
            return new Promise((resolve, reject) =>{
                // resolve(document.querySelector(selector).innerHTML)
                $.ajax({
                    url: "https://jsonplaceholder.typicode.com/posts",
                    type: "POST",
                    data: {foo: "bar"},
                })
                .then(response =>{
                    resolve(response) //resolve the promise from browser and resume execution in node
                })
            })
        }, selector) //can only pass in one param
        .then(result =>{
            let x = result;
        })
    }

  //result = {id: some number}

通知选择器,它必须是一个参数,或者如果您想要更多键值,则它必须是对象。它并没有真正用在这个蹩脚的例子中,但它只是一个蹩脚的例子。

无论出于何种原因,evaluate回调中的js样式都可以处理es6样式代码。

此外,内部承诺链与外部承诺链完全不同。评估中的所有内容都在电子中运行而不是您的节点服务器。但是一旦你解决了,它就会在节点中重新启动。