首页 > 解决方案 > Puppeteer 找不到元素

问题描述

我一直试图让 puppeteer 获得任务计划者帐户上的登录按钮,但它返回错误“PS C:\Users\leticia.queiroz\Visual Studio> node Teste2.js (node:14920) UnhandledPromiseRejectionWarning: E​​rror:找不到选择器的节点”

我提交的代码是:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://tasks.office.com/')
  await page.click('#plannerSignInButton')
  await page.waitForSelector('input[id="i0116"]', {
    visible: true,
  });
  await page.click('input[id="i0116"]')
  await page.type('input[id="i0116"]','user@example.login.com')
  await browser.close();
})()

我从开发人员见解中获得的 html 代码是:

<input type="email" name="loginfmt" id="i0116" maxlength="113" class="form-control ltr_override input ext-input text-box ext-text-box" aria-required="true" data-bind="
                    attr: { lang: svr.fApplyAsciiRegexOnInput ? null : 'en' },
                    externalCss: {
                        'input': true,
                        'text-box': true,
                        'has-error': usernameTextbox.error },
                    ariaLabel: tenantBranding.unsafe_userIdLabel || str['CT_PWD_STR_Username_AriaLabel'],
                    ariaDescribedBy: 'loginHeader' + (pageDescription &amp;&amp; !svr.fHideLoginDesc ? ' loginDescription usernameError' : ' usernameError'),
                    textInput: usernameTextbox.value,
                    hasFocusEx: usernameTextbox.focused,
                    placeholder: $placeholderText" aria-label="Insira o seu email, telefone ou Skype." aria-describedby="loginHeader usernameError" placeholder="Email, telefone ou Skype">

标签: node.jspuppeteer

解决方案


您的代码移动得太快,并试图在按钮#plannerSignInButton在 DOM 中可用之前单击它。预先添加和awaita 的返回值:waitForSelector

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://tasks.office.com/')
  await page.waitForSelector('#plannerSignInButton');
  await page.click('#plannerSignInButton')
  await page.waitForSelector('input[id="i0116"]', {
    visible: true,
  });
  await page.click('input[id="i0116"]')
  await page.type('input[id="i0116"]','user@example.login.com')
  await browser.close();
})()

推荐阅读