【问题标题】:Problem with NightmareJS promise in a promise承诺中的 NightmareJS 承诺问题
【发布时间】:2023-03-26 03:00:02
【问题描述】:

我尝试使用 Nightmare 访问页面上的连续不同链接,但第二个承诺似乎被拒绝(即使它不应该被拒绝,并且使用“.evaluate”而不是“.exists”)。

这是我的功能:

async function getDatas(index) {
  count = 0
    await nightmare
    .goto('https://xxx/login')
    .wait('#username')
    .insert('#username', login)
    .insert('#password', password)
    .click('#main-container div div div div div form button')
    .wait('.card-title')
    .run(() => {console.log("Waiting for main-container")})
    .wait('#main-container')
    .run(() => {console.log("Waiting 3s")})
    .wait(3500)
    .evaluate(function () {
      return Array.from(document.querySelectorAll('td a')).map(element => element.href);
    })
    .then(async (innerTexts) => {
      console.log("on charge liste projets");

      await innerTexts.forEach(async function(obj){
        console.log("On est dans le projet", obj)
        await nightmare
          .goto(obj)
          .wait(1100)
          .exists('.highlight')
          // .evaluate(function() {
            // return Array.from(document.querySelectorAll('a')).map(element => element.href);
          // })
          .then((re) => {
            console.error(re)
            console.log("It exists for", obj)
          })


          /* ********* Here is the triggered catch, but it shouldn't be ***** */
          .catch(re => {
            console.error("It doesn't exist for", re)
          })
      })
    })
    .then(() => {
      nightmare.end()
    })
    .catch(error => {
      nightmare.end()
    })
}
(完整代码:https://pastebin.com/wZxRvizk

我在那儿呆了一整天,我真的不明白为什么承诺会被拒绝。

输出是:

on charge liste projets
On est dans le projet https://sup-sub.cri.epita.fr/projects/20/
On est dans le projet https://sup-sub.cri.epita.fr/projects/21/
It doesn't exist for { Error: navigation error
    at unserializeError (C:\temp\SupSub\linkedin-email-extractor\node_modules\nightmare\lib\ipc.js:162:13)
    at EventEmitter.<anonymous> (C:\temp\SupSub\linkedin-email-extractor\node_modules\nightmare\lib\ipc.js:89:13)
    at Object.onceWrapper (events.js:277:13)
    at EventEmitter.emit (events.js:189:13)
    at ChildProcess.<anonymous> (C:\temp\SupSub\linkedin-email-extractor\node_modules\nightmare\lib\ipc.js:49:10)
    at ChildProcess.emit (events.js:189:13)
    at emit (internal/child_process.js:820:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)
  code: -3,
  details: 'ERR_ABORTED',
  url: 'https://xxx/projects/20/' }

【问题讨论】:

  • 在您的拒绝处理程序中,您是否尝试检查内部承诺试图观察的 DOM 子树?它是否确实具有您期望它具有的元素? (显然你不能从 .then 处理程序中执行它,因为它没有被执行。)
  • 触发了哪个catch()?你能发布输出吗?

标签: javascript node.js nightmare


【解决方案1】:

正如 Bergi 在评论中所说,不要使用 forEach。使用 for..of 循环遍历 url 列表。

for(let obj of innerTexts){
  await nightmare.goto(obj).wait(1100) // rest of your code
}

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多