代码日

Patricia Arquette
Patricia Arquette原创
2024-10-04 06:19:02321浏览

Day of DaysOfCode

嘿!距离上次登录已经有一段时间了。
最近,我一直在解决与在循环中丢失元素引用相关的问题,我终于找到了一个解决方案,我想与大家分享。

我想要实现的目标

  • 收集特定网页上的按钮元素。
  • 单击每个按钮可导航到另一个页面。
  • 在新页面上执行某些操作后,返回第一页。
  • 重复步骤 2 和 3,直到单击所有按钮。

这是初始代码的简化版本:

const someElements = await page.$$("xpath/ .//foo[@name='hoge']");

for (let i=0; i < someElements.length; i++) {
    await Promise.all([
        someElements[i].click(),
        page.waitForNavigation({ waitUntil: ["load", 'networkidle0'] }),
    /* There are particular processes and going back process */
    ]);
};

我遇到了什么错误

forst 循环迭代后,脚本无法找到按钮元素。我不断收到以下错误:
ProtocolError:协议错误 (DOM.describeNode):无法在

处找到具有指定 id 的上下文

我是怎么解决的

我通过在循环中重新声明按钮元素列表解决了这个问题。
这是修改后的代码:

const someElements1 = await page.$$("xpath/ .//foo[@name='hoge']");

for (let i=0; i < someElements.length; i++) {
    const someElements2 = await page.$$("xpath/ .//foo[@name='hoge']"); // added row
    await Promise.all([
        someElements2[i].click(),
        page.waitForNavigation({ waitUntil: ["load", 'networkidle0'] }),
    /* There are particular processes and going back process */
    ]);
};

我添加了重新声明行,因为我假设原始的 someElements 引用在离开初始页面时丢失了。经过此更改后,错误得到解决。但是,我不确定这种方法是否严格遵守最佳编码实践。

如果在页面之间导航时遇到循环中的 .click() 问题,请考虑在循环本身内重新声明该元素。这个简单的更改可能会为您节省大量故障排除时间!

以上是代码日的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn