gpt4 book ai didi

Javascript 无法将 Vars/Fn 传递给 .evaluate() 作用域 (NightmareJS)

转载 作者:行者123 更新时间:2023-11-29 15:18:23 26 4
gpt4 key购买 nike

我正在尝试将一个变量传递给 .evaluate,以便我可以在网页范围内使用它们,但我无法让它工作。

await nightmare.evaluate(function() {
let links = document.querySelectorAll('div.fsl a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href');
});
})

.evaluate(function(result) {
for(var i = 0; i < result.length; i++) {
var matchResult = result[i].match(/.com\/(.*?)\?fref/);
if (matchResult) {
console.log(matchResult[1]);
}
}
});

为此,我得到无法读取未定义的属性“匹配”。然后我尝试了:

const evaluated = await nightmare.evaluate(function() {
let links = document.querySelectorAll('div.fsl a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href');
});
});

await nightmare.evaluate(function(evaluated) {
for(var i = 0; i < evaluated.length; i++) {
var matchResult = evaluated[i].match(/.com\/(.*?)\?fref/);
if (matchResult) {
console.log(matchResult[1]);
}
}
});

同样的结果。然后我尝试了:

const evaluated = await nightmare.evaluate(function() {
let links = document.querySelectorAll('div.fsl a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href');
});
});

for(var i = 0; i < evaluated.length; i++){
var matchResult = evaluated[i].match(/.com\/(.*?)\?fref/);
if(matchResult) {
console.log(matchResult[1]);
await nightmare.evaluate(function(matchResult) {
return document.body.innerHTML += '<a href="https://www.example.com/'+matchResult[0]+'">'+matchResult[0]+'</a>';
});
await nightmare.click('a[href="https://www.example.com/'+matchResult[0]+'"]');
await nightmare.wait(5000);
}
}
await nightmare.end();

为此,将执行循环的第一次迭代并将 matchResult[1] 记录到控制台。然后我得到 Error: Evaluation timed out after 30000msec。您是在调用 done() 还是在解决您的 promise ?

我也试过这样的:

await nightmare.evaluate(function() {
let links = document.querySelectorAll('div.fsl a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href');
});
}).then(function(users){

}).end();

哪个确实将返回传递给 .then() 但我如何将数组传递给下一个求值?现在这是我能想到但行不通的最后一件事:

await nightmare.evaluate(function() {
let links = document.querySelectorAll('div.fsl a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href');
});
}).evaluate((users) => {
console.log(users);
}).end();

我找到了解决方案 here但它为我返回了 undefined。我还找到了this它在 PhantomJS 中讨论了类似的事情,但还没有提出一个可行的代码。

最佳答案

我找到了答案。似乎我的一半尝试可能都奏效了,只是我没有意识到。在 .evaluate() 的范围内,我们在浏览器范围内(按预期),但我没有考虑到我无法从该范围登录到控制台。具体来说,我无法登录到我的控制台。如果我从该范围运行 console.log,它会记录到浏览器控制台。以下代码有效:

    var foo = "stuff";
var bar = "stuff for the remote page";

var result = await nightmare.evaluate(function(bar2) {
// this function executes in the remote context
// it has access to the DOM, remote libraries, and args you pass in
console.log("bla "+bar2); // this will not output
// but not to outer-scope vars
return typeof foo + " " + bar2;
}, bar);
console.log(result); // this logs bar2!

我认为这可以解决问题。调试文档范围内发生的事情可能有点棘手,但肯定有可能。

关于Javascript 无法将 Vars/Fn 传递给 .evaluate() 作用域 (NightmareJS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46498126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com