Драматург работает в головокружительном режиме, но терпит неудачу в безголовом

Я пытаюсь использовать этот пример, чтобы получить количество предложений NFT в opensea:

import { test, expect } from '@playwright/test';

test('test', async ({ page }) => {
    await page.goto('https://opensea.io/assets/ethereum/0x63217dbb73e7a02c1d30f486e899ee66d0aa5e0b/6341');
    await page.waitForLoadState('networkidle');

    let selector = page.locator("[id='Body offers-panel'] li");
    const offers = await selector.count();

    console.info('Num of offers:', offers);
});

А затем я запускаю «тесты драматурга npx», которые всегда печатают «Количество предложений: 0»

Но если я запускаю его в режиме --headed, он отлично работает и выводит «Количество предложений: 5».

Может ли кто-нибудь объяснить / помочь мне понять это?

Я пытался использовать:

let selector = page.locator("[id='Body offers-panel'] li").waitFor();

Пытался дождаться выполнения всех запросов

await page.waitForLoadState('networkidle');

Попытался дождаться селектора:

let selector = page.locator("[id='Body offers-panel'] li").first().waitFor();

Но ничего не сработало, у меня всегда 0 счетчиков, если только я не запускаю тест в режиме --headed, независимо от того, какой адрес NFT я пытаюсь использовать.

Я хотел бы решить это или понять, почему это происходит

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

itronic1990 17.02.2023 21:58
Принципы SOLID в JavaScript с примерами
Принципы SOLID в JavaScript с примерами
Принцип единой ответственности подразумевает то, что:
Типы привязки данных в Angular
Типы привязки данных в Angular
Привязка данных автоматически поддерживает страницу в актуальном состоянии на основе состояния вашего приложения. Вы используете привязку данных,...
3 паттерна TypeScript, которые я использую в своей повседневной работе
3 паттерна TypeScript, которые я использую в своей повседневной работе
В TypeScript 2.0 в язык был добавлен модификатор readonly.
Мифический Angular - Миф Angular: стили компонентов
Мифический Angular - Миф Angular: стили компонентов
Это очень короткая и интересная для меня тема. В Angular каждый компонент может иметь свои собственные прикрепленные стили. Стили могут находиться в...
Подсказка RxJS [filter, skipWhile]
Подсказка RxJS [filter, skipWhile]
Эта подсказка описывает разницу между операторами filter и skipWhile из библиотеки RxJS .
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
2
1
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Некоторые веб-сайты не будут загружать страницу, если обнаружат безголовый клиент. Это для предотвращения царапин и тому подобного. Я предполагаю, что это то, что здесь происходит

Смотрите: Ты без головы? Обнаружение Безголового

Ответ принят как подходящий

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

Поскольку вы ничего не видите, отлаживать безголовый немного сложнее, чем с головным. Использование console.info(await page.content()) и await page.screenshot({path: "test.png"}) — хорошие стратегии для выяснения того, почему элементы, которые вы ожидаете увидеть на странице, отсутствуют.

В этом случае добавление

const text = (await page.textContent("body"))
  .replace(/ +/g, " ")
  .replace(/(\n ?)+/g, "\n")
  .trim();
console.info(text);

После goto для получения полного текстового содержимого страницы дает:

Access denied
Error code 1020
You do not have access to <Your URL>.The site owner may have set restrictions that prevent you from accessing the site.
Error details
Provide the site owner this information.
I got an error when visiting <Your URL>.
Error code: 1020
Ray ID: **************
Country: US
Data center: *****
IP: *****************
Timestamp: 2023-02-17 22:39:13 UTC
Click to copy
Was this page helpful?
Yes
No
Thank you for your feedback!
Performance & security by Cloudflare

Это не идеальная гарантия, но добавление заголовка пользовательского агента — это простой вариант, которого, кажется, достаточно, чтобы избежать безголового обнаружения на этом конкретном сайте в данный момент времени:

import {expect, test} from "@playwright/test"; // ^1.30.0

const url = "<Your URL>";
const userAgent =
  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";

test.describe("with user agent", () => {
  test.use({userAgent});

  test("is able to retrieve offers", async ({page}) => {
    await page.goto(url);
    const selector = page.locator('[id = "Body offers-panel"] li');
    const offers = await selector.count();
    console.info("Num of offers:", offers); // => Num of offers: 11
  });
});

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