javascript - Puppeteer - 为什么元素不反映 DOM 变化?
问题描述
我有一个在元素范围内等待选择器的函数。我传入的 ElementHandle 似乎没有随着 DOM 更新而更新 - 每次我的 waitForFunction 调用失败时,我都会记录此元素的 outerHTML,并且不存在更改。
async function waitForSubElSelector(page, el, subElSelector) {
// offset/rects checks for visible check (from https://stackoverflow.com/a/33456469)
await page.waitForFunction((selector, scopeEl) => {
const subEl = scopeEl.querySelector(selector)
let found = !!(subEl && (subEl.offsetWidth || subEl.offsetHeight || subEl.getClientRects().length));
if (!found) {
console.log(`waitForSubElSelector failed EL: ${scopeEl.outerHTML} SELECTOR: "${selector}", ${!subEl ? 'not found' : subEl.offsetWidth + ', ' + subEl.offsetHeight + ', ' + subEl.getClientRects().length}`)
}
return found;
}, {}, subElSelector, el
).catch(e => {
console.log(`waitForSubElSelector failed w/ selector '${subElSelector}'`)
throw e;
})
return await el.$(subElSelector);
}
我还在浏览器控制台中验证了这一点 - 我能够找到元素,然后从那里找到选择器。
一个用例是等待下一步按钮可用,例如:
await waitForSubElSelector(this.browserPage, pageEl, '#nextButton:not([disabled])')
我怎样才能得到这个工作?
我有一个想法——也许我的 web 框架替换了 DOM 的一部分,所以我拥有的 ElementHandle 不是当前的;Puppeteer 中有一些“in-DOM”检查吗?
解决方案
推荐阅读
- wpf - 在继承自 ItemsPanel 的用户控件中结合 Viewbox、Canvas、ItemsPanelTemplate 和 ItemsPresenter
- caching - 在此示例中,数据缓存如何路由对象?
- gatsby - 如何为我的 Gatsby 网站创建第二个博客模板
- python-3.x - GCP存储无法上传带有不可见ascii字符的字符串
- vim - 当我进入/离开命令行时更新 Vim 中的标题字符串
- sql-server - 是否可以将 SQL Server 2016 数据库保存到较低版本?
- sql-injection - 编写用于阻止 SQL 注入攻击的数据库防火墙
- macos - 如何批量重命名损坏的文件扩展名?
- c# - 使用单独的 AppDomain 的单元测试代码
- performance - 查找算法的运行时间