所以,我正在使用梦魇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发布请求),任何人都可以帮助我或告诉我它是否是可能吗?
答案 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样式代码。
此外,内部承诺链与外部承诺链完全不同。评估中的所有内容都在电子中运行而不是您的节点服务器。但是一旦你解决了,它就会在节点中重新启动。