【问题标题】:No node found for selector in (Puppeteer Error)在(Puppeteer 错误)中找不到选择器的节点
【发布时间】:2021-05-13 21:33:29
【问题描述】:

这是我给出的代码:

const puppeteer = require('puppeteer');
(async () => {
    const baseUrl = 'example.com';
    const browser = await puppeteer.launch({ headless: true});
    const context = await browser.createIncognitoBrowserContext();
    const page = await context.newPage();

    function delay(time) {
        return new Promise(function (resolve) {
            setTimeout(resolve, time)
        });
    }

    await page.goto(baseUrl);

    await page.waitForSelector('[name="loginfmt"]');
    await page.type('[name="loginfmt"]', 'abc@amazon.com');
    await page.click('[type="submit"]');
    delay(1000);
    await page.authenticate({ username: `abc@amazon.com`, password: `abc@123` });

    await page.click((`[data-row-id="111-222-333-444"]`));
    await delay(1000);

    await page.pdf(
        {
            path: "Z1.pdf",
            printBackground: true,
            width: '1300px',
            height: '14200px'
        }
    )

    browser.close();
})()

当使用 document.querySelectorAll([data-row-id="111-222-333-444"]); 检查页面时它返回了一个NodeList 数组,其中包含我一直在寻找的详细信息。 但是,当通过 Puppeteer 尝试相同的操作时,它会以错误提示“错误:未找到选择器的节点:[data-row-id="111-222-333-444"]”

尝试使用: “常量按钮=等待页面。$(([data-row-id="111-222-333-444"]); button.click();"

很久以来我一直在尝试解决这个问题。如果我能解决这个问题,那将非常有帮助。

【问题讨论】:

  • 元素可以在 iframe 中吗?

标签: javascript css node.js automation puppeteer


【解决方案1】:

尝试使用此代码:

    const puppeteer = require('puppeteer');
(async () => {
    const baseUrl = 'example.com';
    const browser = await puppeteer.launch({ headless: true});
    const context = await browser.createIncognitoBrowserContext();
    const page = await context.newPage();
 

    await page.goto(baseUrl);

    await page.waitForSelector('[name="loginfmt"]');
    await page.type('[name="loginfmt"]', 'abc@amazon.com');
    await page.click('[type="submit"]');
    await page.waitForTimeout(1000) 
    await page.authenticate({ username: `abc@amazon.com`, password: `abc@123` });

    await page.waitForTimeout(5000) 

    await page.$(`[data-row-id="111-222-333-444"]`);

    await page.click((`[data-row-id="111-222-333-444"]`));
    await page.waitForTimeout(1000) 

    await page.pdf(
        {
            path: "Z1.pdf",
            printBackground: true,
            width: '1300px',
            height: '14200px'
        }
    )

    browser.close();
})()

【讨论】:

  • 尝试执行您提到的相同代码,但遇到以下错误。 (node:17748) UnhandledPromiseRejectionWarning: Error: Execution context was destroyed, most likely because of a navigation.(node:17748) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
  • 我可以看到的第一个错误是 baseUrl 没有使用您尝试执行请求的真实域。还有 url 用于导航页面的 URL。 URL 应包含方案,例如https://pptr.dev/…
  • 由于我使用的 URL 是敏感信息,因此我没有在此处发布相关信息。但是当我从头开始尝试时,我已将其替换为真实的域 URL。
  • 我建议你开始使用 headless: false 并且没有 createIncognitoBrowserContext 并且当你完成所有工作时更改它。它将帮助您轻松调试和查看错误。在使用 await 的地方也可以使用 try catch。对我来说,如果没有真实的 URL 来测试我的代码,很难提供更多答案。
  • 已在 headful 模式下对其进行了测试,但我只能到达该页面,无法点击该选择器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多