Извлеките содержимое страницы, где есть задержка фактического содержимого, с помощью Playwright

Я пытаюсь получить уведомление о конфиденциальности этой страницы — «https://www.imaginegolf.com/privacy». Однако, если вы посмотрите на страницу, загрузка уведомления о конфиденциальности занимает некоторое время. Есть ли способ заставить драматурга подождать и взять содержимое страницы? Я пробовал такие варианты, как load, networkidle, commit и domcontentloaded.

Пример исходного кода

import {chromium}  from 'playwright'; // Web scraper Library
import * as fs from 'fs';

(async function () {
    const chromeBrowser = await chromium.launch({ headless: true }); // Chromium launch and options
    const context = await chromeBrowser.newContext({ ignoreHTTPSErrors: true ,
        userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
      });
    const page = await context.newPage();
    await page.goto("https://www.imaginegolf.com/privacy", { waitUntil: 'networkidle', timeout: 60000 });
    let content = await page.content();
    fs.writeFileSync('test.html', content);
    console.info("done")
})();
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете добавить проверку с помощью expect и указать время ожидания, чтобы убедиться, что примечание о конфиденциальности видно. Так что, может быть, что-то вроде этого:

  await page.goto("https://www.imaginegolf.com/privacy");
  await expect(page.locator('text = "PRIVACY NOTICE").toBeVisible({ timeout:5000 });
  let content = await page.content();
  fs.writeFileSync('test.html', content);

Просто адаптируйте локатор и время ожидания к вашим потребностям и продолжайте рабочий процесс после того, как ожидание будет успешным.

Спасибо Басти. Я не использую тестовую библиотеку как таковую, но она помогает в тестировании.

Sunil 14.02.2023 07:25
Ответ принят как подходящий

Лучший способ, вероятно, дождаться элемента, который содержит или является частью контента, в основном что-то, что указывает на то, что контент, который вы ожидаете, загружен. Поскольку вы просто используете библиотеку драматургов (не тест), вы не можете использовать expect, чтобы асинхронно ожидать, что она будет видна в течение определенного периода времени, но вы все равно не пытаетесь утверждать это, просто подождите, прежде чем двигаться дальше. Поэтому я бы рекомендовал использовать метод waitFor, например:

await page.getByText(‘Privacy Notice’).waitFor()

Или с любым локатором, который лучше всего подходит. Обратите внимание, что по умолчанию waitFor ожидает, пока он не станет видимым, поэтому вы можете не передавать никаких аргументов, хотя вы всегда можете указать явно, если хотите.

Спасибо .. есть идеи, почему я могу получить эту ошибку - page.getByText не является функцией.

Sunil 13.02.2023 06:07

@Sunil Одной из возможностей, которая сразу приходит на ум, является несоответствие версии драматурга, поскольку эта функция была добавлена ​​​​в версии 1.27, которая является одной из последних. Какую версию вы используете?

David R 13.02.2023 07:14

Спасибо. Я заметил, что был в 1.25 - теперь поменял на 1.27. Но даже после смены версии я не могу получить содержимое. Вы смогли извлечь содержимое с вашего конца?

Sunil 14.02.2023 07:24

Имеет смысл! Хм, нет, я на самом деле не пытался получить его сам. Тем не менее, я быстро взглянул на компьютер на страницу dom и заметил, что похоже, что вы имеете дело с iframe, который добавляет дополнительную часть. Если бы у меня были точные локаторы, я бы добавил их в свой ответ, но в основном, чтобы найти элемент внутри iframe, вы можете использовать frameLocator, чтобы найти iframe, а затем элемент внутри.

David R 14.02.2023 09:15

Я также не уверен, будет ли page.content захватывать содержимое iframe (еще не пробовал/не имел дело с ним), но вместо этого вам, возможно, придется использовать page.frame().content().

David R 14.02.2023 09:17

Другие вопросы по теме