Манипулировать / устанавливать стиль shadowRoot с помощью Puppeteer - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь сделать скриншоты AMP Stories без звука и кнопок общего доступа.

После того, как я узнал, что есть что-то, называемое shadow DOM, я задаюсь вопросом, как настроить отображение: там нет:

addStyleTag({content: '.i-amphtml-story-system-layer-buttons { display : none!important }'})

Я думаю, что сделал это для доступа к теневой DOM следующим образом.

const shadowRootInnerHTML = await page.evaluate(() => {
    return document.querySelector("body > amp-story > div").shadowRoot.innerHTML
});

Это то, что я сейчас использую,

const browser = await puppeteer.launch({
  slowMo: 250,
  args: [
    '--disable-infobars',
  ]
});
const page = await browser.newPage()

await page.emulate({
  name: 'iPhone1080x1920',
  userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
  viewport: {
    width: 360,
    height: 640,
    deviceScaleFactor: 3,
    isLandscape: false
  }
});

await page.goto(urlToTest, {
  waitUntil: 'networkidle2',
  timeout: 0
});

const textContent = await page.evaluate(() => {
  return document.querySelector("body > amp-story > div").shadowRoot.innerHTML
});

1 Ответ

2 голосов
/ 27 мая 2019

Страницы Amp содержат несколько элементов div внутри истории amp.

Мы можем выполнить этот ванильный JavaScript, который скроет верхний слайд и кнопку общего доступа на страницах усилителя.

Я добавил два способа в этот код, вы можете применить любой из них.

// there are multiple div elements inside amp-story
const elements = [...document.querySelectorAll("body > amp-story > div")];

elements.map(rootElement => {
  // find the shadowRoot inside if it exists
  const shadowRoot = rootElement.shadowRoot;

  if (shadowRoot) {
    /**
     * WAY 1: Find the element and apply css to it directly
     */
    // this holds the top share button and pagination slides
    const element = shadowRoot.querySelector(
      ".i-amphtml-story-system-layer"
    );

    // forcefully hide the element
    if (element) element.style.setProperty("display", "none", "important");

    /**
     * WAY 2: Append your own style to the <style> tag inside the amp shadowRoot
     */
    shadowRoot.querySelector('style').innerHTML += `.i-amphtml-story-system-layer { display : none!important }`
  }
});

В основном,

  • Найдите div
  • Получить shadowRoot
  • Либо найдите элемент и примените его напрямую, либо добавьте стиль к тегу.

Результат на странице примера усилителя:

amp page without top bar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...