Javascript 木偶演员页面。goTo()永远不会结束

Javascript 木偶演员页面。goTo()永远不会结束,javascript,node.js,automation,puppeteer,e2e-testing,Javascript,Node.js,Automation,Puppeteer,E2e Testing,这是发生这种情况的另一个例子^ 我一直不明白为什么,但即使是最简单的木偶演员剧本也无法通过goTo() 我有以下代码: const browser = await puppeteer.launch({ executablePath: '/usr/bin/google-chrome-unstable', args: ["--proxy-server='direct://'", '--proxy-bypass-list=*', '--no-sandbox', '--dis

这是发生这种情况的另一个例子^

我一直不明白为什么,但即使是最简单的木偶演员剧本也无法通过goTo()

我有以下代码:

    const browser = await puppeteer.launch({ executablePath: '/usr/bin/google-chrome-unstable', args: ["--proxy-server='direct://'", '--proxy-bypass-list=*', '--no-sandbox', '--disable-setuid-sandbox'] });
    const page = await browser.newPage();
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36');
    await page.setDefaultNavigationTimeout(0);

    log('before nav');
    await page.goto('http://www.google.com');

    log('waiting nav');
    await page.waitForNavigation({
        waitUntil: 'networkidle0'
    });

    log('complete');

    await browser.close();
输出为:

$:# node lib/tests/nav.test.js
    before nav
    waiting nav

它从不记录“完成”。我尝试过不用代理绕过和代理服务器,也不用打开和关闭沙箱。我尝试了
networkidle2
。它不完整。我还尝试了各种不同的网站。我在Puppeter 4.x上,使用节点12.x和npm 6.x

我调查了人们建议的承诺方法:

await Promise.All([ page.goto('http://www.google.com'), page.waitForNavigation() ]);
这有时是有效的。但这是非常零星的

木偶演员真的是这辆马车吗?是否有任何已知的方法来保证在执行操作之前加载页面。我需要导航,填写表格,点击按钮等,所以所有的元素都需要在那里

我还尝试了
waitForSelector()
版本,但也没有加载


我觉得木偶演员已经彻底崩溃了。有什么想法吗?

你没有按你应该的方式使用木偶演员,这就是为什么它让人感觉不舒服,但主要是因为你不知道剧本里发生了什么

让我们看看

wait page.goto('http://www.google.com');
这实际上意味着:

wait page.goto('http://www.google.com“,{waitUntil:'加载'});
因此,您将转到一个页面并等待直到加载事件触发。这意味着当你到达这条线后,就没有其他导航可以等待了。因此,这一行:

wait page.waitForNavigation();
将永远等待。这就是你所说的“它挂着”

因此,由于方法
page.goTo()
已经提供了指定导航成功时间的方法(目前为:load、domcontentloaded、networkidle0、networkidle2),您实际上不需要将任何其他方法与
page.goTo()
结合使用

另一种情况是,当您单击一个按钮并期望发生一些事情时,例如导航或选择器将出现在页面中。由于方法
page.click()
不提供与
page.goTo()
相同的选项,因此通常需要组合使用另一种方法,如下所示:

等待承诺([
page.waitForNavigation(),
页面。单击(选择器)
]);
或等待导航和某些选择器:

等待承诺([
page.waitForNavigation({waitUntil:'networkidle0'}),
第页waitForSelector(选择器),
fbButton.单击()
]);

若你们坚持这些模式,我想你们不会觉得木偶演员是有车的。它只是一个低级工具,因此您需要编写比WebDrivero等其他框架更多的代码。

删除
waitForNavigation
。您已经成功导航到该页面,现在您的脚本正在阻塞,等待第二次导航,而这一次从未发生过。如果您不确定,请尝试打印
page.content()
,然后查看
page之后的外观。转到您正在记录的
“等待导航”
waitForNavigation
应该在单击、重新加载、提交或任何导致导航本身的事件之前调用。永远不要做相反的事情,否则它会挂起,就像你说的。嗨!好的,我保证。所有()都是我需要的。你说得对,比赛条件很可能开始了。我以为我用
Promise.all([page.goto(),page.waitForNavigation()])减轻了他们的痛苦正如我很久以前看到的,这被标记为StackOverflow的解决方案。但是现在我知道,
goto()
有自己的等待,那么上面的承诺.all()也永远无法解决。我说的对吗?相关的,但有些不同,我发现一些网页在Puppeter(chrome不稳定)中加载非常慢。我设置事件来记录每一个请求和响应,在一个网站上,请求记录,然后有35个零,然后响应开始。这与chrome或网站有关吗?如果我在桌面浏览器中运行该网站,它会立即响应。关于第一个问题,我认为将Promise.all()与page.goto()和page.waitForNavigation()结合使用会很好,因为您没有先等待page.goto(),因此page.waitForNavigation()可以很好地解决。关于第二个问题,如果没有一个具体的例子,这是很难做到的,我不知道那里会有什么问题。