Нажмите кнопку, если она присутствует, иначе нажмите другую кнопку в кукловоде - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь настроить оператор if/else в кукловоде, чтобы щелкнуть по кнопке, если она есть, или нажать другую кнопку.Я делаю что-то вроде этого:

if (document.querySelector('#buttonToClick') !== null) {
    await page.waitForSelector('#buttonToClick');
    await page.click('#buttonToClick');
  } 

else { 
// first click #otherButton and then click #buttonToClick
    await page.waitForSelector('#otherButton');
    await page.click('#otherButton');

    await page.waitForSelector('#buttonToClick');
    await page.click('#buttonToClick');
  }

По какой-то причине я продолжаю падать в блок else, даже когда я иду к своей консоли Chrome и делаю document.querySelector('#buttonToClick') !==null на нужной странице, и он показываетas true

ОБНОВЛЕНИЕ : мне кажется, что работает следующий код, но я не уверен, почему

await page.waitFor(3000);

  if ((await page.$('#buttonToClick')) !== null) {
    await page.click('#buttonToClick');
  } else {
    await page.waitForSelector('#otherButton');
    await page.click('#otherButton');

    await page.waitForSelector('#buttonToClick');
    await page.click('#buttonToClick');
  }`

Я подумал, что может быть что-тоделать со способом загрузки DOM, поэтому я попытался:

await page.waitForNavigation({waitUntil: 'domcontentloaded'})
// await page.waitFor(3000)

  if ((await page.$('#buttonToClick')) !== null) {
    await page.click('#buttonToClick');
  } else {
    await page.waitForSelector('#otherButton');
    await page.click('#otherButton');

    await page.waitForSelector('#buttonToClick');
    await page.click('#buttonToClick');
  }

Но это не сработало ... это работает только с await page.waitFor(30000) до оператора if ... есть идеи, почему

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Похоже, что вы действительно хотите, это ...

const btn = await Promise.race([
      page.waitForSelector('#buttonToClick'),
      page.waitForSelector('#otherButton')
]);

await btn.click()

то есть ждать одну или другую кнопку.В зависимости от того, что найдено первым, щелкните по нему.Это будет работать даже на странице SPA или на основе ajax, где кнопки не появляются сразу после загрузки.

0 голосов
/ 25 мая 2018

Я не думаю, что document.querySelector обычно существует внутри программы node.js.Кукловод дает page.$, что является близким аналогом.Он возвращает Обещание.

Обновление : с новой информацией в вопросе звучит так, как будто часть дерева DOM, содержащая #buttonToClick, создается после события DOMContentLoaded.У меня были хорошие результаты при использовании page.waitForNavigation({ waitUntil: 'networkidle0' }), хотя «networkidle2» или какой-либо другой вариант может быть лучше, если у вас есть длительные сетевые подключения.Смотрите различные варианты здесь: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagewaitfornavigationoptions

Я подозреваю, что это должно работать:

await page.waitForNavigation({ waitUntil: 'networkidle0' });
if (await page.$('#buttonToClick') !== null) {
    await page.click('#buttonToClick');
  } else {
    await page.waitForSelector('#otherButton');
    await page.click('#otherButton');
  }
...