在waitUntil之后,并非所有DOM内容都准备就绪:'domcontentloaded' [英] Not all DOM content is ready after waitUntil: 'domcontentloaded'

查看:201
本文介绍了在waitUntil之后,并非所有DOM内容都准备就绪:'domcontentloaded'的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

也许我在解释 domcontentloaded 错误,但是我希望那时所有元素都可以访问,并且查询它们应该没有问题.

Maybe I'm interpreting domcontentloaded wrong, but I expect all elements to be accessible at that time, and I shouldn't have a problem querying for them.

请考虑以下内容:

await page.goto(url, { waitUntil: 'domcontentloaded' });
const elements = await page.$$('#myId');

elements.length在这种情况下为0,但是如果我在查询之前等待选择器,则元素现在包含元素:

elements.length is 0 in this case, but if I wait for the selector before querying, elements now contains the element:

await page.goto(url, { waitUntil: 'domcontentloaded' });
await page.waitForSelector('#SignIn-emailInput'); // <-- this shouldn't be required
const elements = await page.$$('#myId');

不应该等待直到:'domcontentloaded'导致goto在准备好查询所有元素之前才解决?而是在这里等待'networkidle0'解决方案,还是有什么更好的方法来知道何时一切就绪?

Shouldn't waitUntil: 'domcontentloaded' cause goto not to resolve until all elements are ready to be queried for? Is instead waiting for 'networkidle0' the solution here, or is there a better way to know when everything is ready?

推荐答案

domcontentloaded在页面的原始HTML中的所有元素都已解析并插入到DOM中时触发.但是,仅此而已.如果将元素以其他方式添加到页面,则在domcontentloaded火灾之后很容易发生.

domcontentloaded fires when all the elements in the original HTML for the page have been parsed and inserted into the DOM. But, that's all it tells you. If the elements are added to the page some other way, that can easily happen after domcontentloaded fires.

页面还有许多其他添加内容的方法,例如Javascript直接插入元素或进行Ajax调用,然后在Ajax调用返回结果后插入元素.加载domcontent后,这些都可以完成.

Pages have many other ways of getting content added to them such as Javascript that inserts elements directly or makes Ajax calls and then inserts elements after the Ajax calls return results. Those can all complete after domcontentloaded.

当Javascript插入元素时,没有标准事件知道何时可以完成,因为它是特定于页面的代码,实际上可以执行任何操作.要弄清楚什么时候完成,通常需要对页面中的代码进行一些检查,以弄清楚如何才能在完成工作时检测到它.在最坏的情况下,您必须轮询内容,直到看到一些指示Java脚本已完成其工作的哨兵元素.在更好的情况下,您可以更直接地了解页面正在执行的其他操作,以了解何时完成操作.

When Javascript inserts elements, there are no standard events to know when it might be done because it's page-specific code that can literally do anything. To figure out when it's done generally requires some inspection of the code in the page to figure out how you might detect when it's done doing its thing. In the worst case, you have to poll the content until you see some sentinel elements that indicate the Javascript is done with its work. In better situations, you can more directly hook into something else that the page is doing to know when it's done.

这篇关于在waitUntil之后,并非所有DOM内容都准备就绪:'domcontentloaded'的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆