【问题标题】:puppeteer doesn't open a url without protocolpuppeteer 不会打开没有协议的 url
【发布时间】:2018-08-30 06:23:57
【问题描述】:
const puppeteer = require('puppeteer');

const browser = await puppeteer.launch();
const page = await browser.newPage();

这个有效

await page.goto('https://example.com');

这不起作用(没有协议,即 http/https)

await page.goto("www.example.com');

报错

协议错误(Page.navigate):无法导航到无效的 URL

为什么不像我们在谷歌浏览器中打开时那样附加协议?

【问题讨论】:

    标签: chromium puppeteer headless


    【解决方案1】:

    Google Chrome Omnibox(地址栏)内置了处理多种复杂性的功能,例如:附加协议、自动完成等。

    Puppeteer 提供了一个 API 来通过 DevTools Protocol 控制 Chrome 或 Chromium,因此目前大部分功能都超出了 Puppeteer 的范围。

    page.goto() 函数的 Puppeteer 文档明确指出:

    网址应包含方案,例如https://.

    这是因为 page.goto() 使用了 Chrome DevTools 协议中的 Page.navigate

    Chromium source code 表明通过Page.navigate 的导航已明确检查是否有效,如果 URL 无效,则会返回错误“无法导航到无效 URL。”

    您可以轻松地在 Node.js 中创建一个将协议附加到 URL 的函数,这可能是您的问题的解决方法。

    【讨论】:

    • 谢谢@grant,我错过了关于方案的page.goto() doc 行。此外,我最终使用 NodeJS 核心包 url (nodejs.org/api/url.html) 来解决这个问题。随意在你的最后一段中提到这个包。
    • 我在这里发布了这个相关问题:stackoverflow.com/questions/70837950/…。有什么方法可以使用这个 page.navigate 来捕捉发生这种情况的位置吗?
    【解决方案2】:

    当我将 url 作为数组发送时遇到了同样的错误

    const urls = [["https://www.example1.com"], ["https://www.example2.com]]
    

    解构它为我解决了它

    urls = [].concat(...urls)
    for(let url of urls) {
        await page.goto(url)
     }
    

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      相关资源
      最近更新 更多