Кукловод waitForSelector работает не так, как ожидалось

#node.js #puppeteer

Вопрос:

У меня есть этот простой фрагмент кода:

 const BUSINESS = 'lalala';
await page.waitForSelector('#searchboxinput').then(
    page.evaluate( (BUSINESS) => {
        document.querySelector('#searchboxinput').value = BUSINESS
    }, BUSINESS)
 ),
 

Если я установлю ожидание селектора -> затем, я ожидал бы, что >затем будет выполнено, когда селектор существует, но я получаю значение свойства «Невозможно установить значение «null».

Так что я понимаю этот документ.querySelector(‘#searchboxinput’) == не определено, хотя я полагаю, что это невозможно, поскольку оно выполняется, когда обещание waitForSelector выполнено…

это ошибка или я что-то упускаю?

Ответ №1:

Не уверен, правильно ли я понимаю, поскольку ваш фрагмент синтаксически неполон и не поддается повторению. Но что, если вы используете возвращаемое значение page.waitForSelector() ? Кажется, это работает:

 import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({ headless: false, defaultViewport: null });

try {
  const [page] = await browser.pages();

  await page.goto('https://example.org/');

  const BUSINESS = 'lalala';
  await page.waitForSelector('a').then((element) => {
    page.evaluate((element, BUSINESS) => {
      element.textContent = BUSINESS;
    }, element, BUSINESS);
  });
} catch (err) { console.error(err); }
 

Комментарии:

1. да, это определенно так, но я не могу понять, почему я не могу найти элемент DOM в контексте браузера после ожидания того же селектора, если вы не используете возвращаемое значение из waitForSelector. Я имею в виду, разве элемент DOM не должен существовать в любом случае в это время?

2. @JoelBonetR Можете ли вы предоставить воспроизводимый код?

3. @JoelBonetR В соответствии с документацией вы можете определить в параметрах, хотите ли вы, чтобы селектор присутствовал в DOM или нет, или присутствовал только визуально.