Я пытаюсь получить уведомление о конфиденциальности этой страницы — «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")
})();
Вы можете добавить проверку с помощью 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);
Просто адаптируйте локатор и время ожидания к вашим потребностям и продолжайте рабочий процесс после того, как ожидание будет успешным.
Лучший способ, вероятно, дождаться элемента, который содержит или является частью контента, в основном что-то, что указывает на то, что контент, который вы ожидаете, загружен. Поскольку вы просто используете библиотеку драматургов (не тест), вы не можете использовать expect
, чтобы асинхронно ожидать, что она будет видна в течение определенного периода времени, но вы все равно не пытаетесь утверждать это, просто подождите, прежде чем двигаться дальше. Поэтому я бы рекомендовал использовать метод waitFor, например:
await page.getByText(‘Privacy Notice’).waitFor()
Или с любым локатором, который лучше всего подходит. Обратите внимание, что по умолчанию waitFor ожидает, пока он не станет видимым, поэтому вы можете не передавать никаких аргументов, хотя вы всегда можете указать явно, если хотите.
Спасибо .. есть идеи, почему я могу получить эту ошибку - page.getByText не является функцией.
@Sunil Одной из возможностей, которая сразу приходит на ум, является несоответствие версии драматурга, поскольку эта функция была добавлена в версии 1.27, которая является одной из последних. Какую версию вы используете?
Спасибо. Я заметил, что был в 1.25 - теперь поменял на 1.27. Но даже после смены версии я не могу получить содержимое. Вы смогли извлечь содержимое с вашего конца?
Имеет смысл! Хм, нет, я на самом деле не пытался получить его сам. Тем не менее, я быстро взглянул на компьютер на страницу dom и заметил, что похоже, что вы имеете дело с iframe, который добавляет дополнительную часть. Если бы у меня были точные локаторы, я бы добавил их в свой ответ, но в основном, чтобы найти элемент внутри iframe, вы можете использовать frameLocator, чтобы найти iframe, а затем элемент внутри.
Я также не уверен, будет ли page.content захватывать содержимое iframe (еще не пробовал/не имел дело с ним), но вместо этого вам, возможно, придется использовать page.frame().content().
Спасибо Басти. Я не использую тестовую библиотеку как таковую, но она помогает в тестировании.