Ошибка драматурга (цель закрыта) после навигации

Я пробую что-то очень простое:

  • Перейдите на google.com
  • Заполните поле поиска словом "сыр".
  • Нажмите Enter в поле поиска
  • Вывести текст заголовка первого результата

Так просто, но я не могу заставить его работать. Это код:

const playwright = require('playwright');

(async () => {
  for (const browserType of ['chromium', 'firefox', 'webkit']) {
    const browser = await playwright[browserType].launch();
    try {
      const context = await browser.newContext();
      const page = await context.newPage();
      await page.goto('https://google.com');
      await page.fill('input[name=q]', 'cheese');
      await page.press('input[name=q]', 'Enter');
      await page.waitForNavigation();

      page.waitForSelector('div#rso h3')
          .then(firstResult => console.log(`${browserType}: ${firstResult.textContent()}`))
          .catch(error => console.error(`Waiting for result: ${error}`));
    } catch(error) {
      console.error(`Trying to run test on ${browserType}: ${error}`);
    } finally {
      await browser.close();
    }
  }
})();

Сначала я попытался получить первый результат с page.$(), но это не сработало. Немного изучив проблему, я обнаружил, что page.waitForNavigation(), который, как я думал, будет решением, но это не так.

Пользуюсь последней версией драматурга: 1.0.2.


person Daniel Hernández Alcojor    schedule 21.05.2020    source источник


Ответы (2)


Мне кажется, что единственная проблема заключалась в вашей первоначальной композиции обещания, я только что изменил обещание на async / await и использовал _ 1_, чтобы получить textContent, он работает отлично, ошибок target closed больше нет.

try {
      const context = await browser.newContext();
      const page = await context.newPage();
      await page.goto('https://google.com');
      await page.fill('input[name=q]', 'cheese');
      await page.press('input[name=q]', 'Enter');
      await page.waitForNavigation();

      // page.waitForSelector('div#rso h3').then(firstResult => console.log(`${browserType}: ${firstResult.textContent()}`)).catch(error => console.error(`Waiting for result: ${error}`));

      await page.waitForSelector('div#rso h3');
      const firstResult = await page.$eval('div#rso h3', firstRes => firstRes.textContent);
      console.log(`${browserType}: ${firstResult}`)
    } catch(error) {
      console.error(`Trying to run test on ${browserType}: ${error}`);
    } finally {
      await browser.close();
    }
  }

Выход:

chrome: Cheese – Wikipedia
firefox: Cheese – Wikipedia
webkit: Cheese – Wikipedia

Примечание. Chrome и webkit работают, firefox не работает waitForNavigation для меня. Если бы я заменил его на await page.waitForTimeout(5000);, firefox тоже сработал. Это может быть проблема с поддержкой Firefox драматургом для обещания навигации.

person theDavidBarton    schedule 30.08.2020

Если вы дождетесь page.press('input[name=q]', 'Enter');, waitForNavigation будет уже слишком поздно работать.

Вы можете убрать await на звонке для прессы. Вам может потребоваться дождаться навигации, а не нажатия.

const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://google.com');
await page.fill('input[name=q]', 'cheese');
page.press('input[name=q]', 'Enter');
await page.waitForNavigation();

var firstResult = await page.waitForSelector('div#rso h3');
console.log(`${browserType}: ${await firstResult.textContent()}`);

Также обратите внимание, что вам нужно await для textContent().

person hardkoded    schedule 21.05.2020
comment
Ждать или не ждать page.pres () Думаю неактуально. Я попробовал ваше предложение не ждать этого, но все равно получаю ту же ошибку. Проблема не в этом. Проблема в том, что он каким-то образом теряет контекст после этой навигации. - person Daniel Hernández Alcojor; 22.05.2020
comment
У меня такая же проблема. Он использует контекст страницы перед переходом. Вы когда-нибудь находили для этого решение? - person Justin Young; 23.09.2020