Fonctionnement de Chrome sans tĂȘte

Il est dĂ©jĂ  clair d'aprĂšs le nom qu'un navigateur sans tĂȘte est quelque chose sans tĂȘte. Dans le cadre d'un frontend, c'est un outil indispensable pour un dĂ©veloppeur, avec lequel vous pouvez tester le code, vĂ©rifier la qualitĂ© et la conformitĂ© avec la mise en page. Vitaliy Slobodin de Frontend Conf a dĂ©cidĂ© qu'il Ă©tait nĂ©cessaire de mieux connaĂźtre le dispositif de cet outil.

Sous les composants et fonctionnalitĂ©s de Headless Chrome, des scĂ©narios intĂ©ressants pour l'utilisation de Headless Chrome. La deuxiĂšme partie sur Puppeteer est une bibliothĂšque Node.js pratique pour gĂ©rer le mode sans tĂȘte dans Google Chrome et Chromium.


À propos de l'orateur: Vitaliy Slobodin - un ancien dĂ©veloppeur de PhantomJS - celui qui l'a fermĂ© et enterrĂ©. Parfois, cela aide Konstantin Tokarev ( annulen ) dans la version "ressuscitĂ©e" de QtWebKit - le trĂšs QtWebKit, oĂč il existe un support pour ES6, Flexbox et de nombreuses autres normes modernes.

Vitaliy aime explorer les navigateurs, creuser dans WebKit, Chrome et ainsi de suite pendant son temps libre, et plus encore. Nous parlerons aujourd'hui des navigateurs, Ă  savoir des navigateurs sans tĂȘte et de toute leur famille fantĂŽme.

Qu'est-ce qu'un navigateur sans tĂȘte?


DĂ©jĂ  d'aprĂšs le nom, il est clair que c'est quelque chose sans tĂȘte. Dans un contexte de navigateur, cela signifie ce qui suit.

  1. Il n'a pas un véritable rendu du contenu , c'est-à-dire qu'il dessine tout en mémoire.
  2. Pour cette raison, il consomme moins de mémoire , car il n'est pas nécessaire de dessiner des images ou des fichiers PNG gigaoctets que les gens essaient de mettre dans le backend à l'aide d'une bombe.
  3. Cela fonctionne plus rapidement car il n'a pas besoin de rendre quoi que ce soit sur le vrai écran.
  4. Dispose d'une interface de programmation pour la gestion . Vous demandez - il n'a pas d'interface, de boutons, de fenĂȘtres? Comment le gĂ©rer? Par consĂ©quent, bien sĂ»r, il dispose d'une interface de gestion.
  5. Une propriété importante est la possibilité d'installer sur un serveur Linux nu . Ceci est nécessaire pour que si vous avez un Ubuntu ou Red Hat fraßchement installé, vous pouvez simplement déposer le binaire ou y mettre le paquet, et le navigateur fonctionnera hors de la boßte. Aucun chamanisme ou magie vaudou n'est nécessaire.

Il s'agit d'un navigateur Web-Kit typique. Vous ne pouvez pas saisir les composants - ce n'est qu'une image visuelle.



Nous ne sommes intĂ©ressĂ©s que par le composant supĂ©rieur de l'interface utilisateur du navigateur. Il s'agit de la mĂȘme interface utilisateur - fenĂȘtres, menus, notifications contextuelles et tout le reste.



Voici Ă  quoi ressemble le navigateur sans tĂȘte. Remarquez la diffĂ©rence? Nous supprimons complĂštement l'interface utilisateur. Il n'est plus. Seul le navigateur reste .

Aujourd'hui, nous allons parler de Chrome sans tĂȘte (). Quelle est la diffĂ©rence entre eux? En fait, Chrome est une version de marque de Chromium, qui a des codecs propriĂ©taires, le mĂȘme H.264, l'intĂ©gration avec les services Google et tout le reste. Chrome n'est qu'une implĂ©mentation open source.



Date de naissance de Chrome sans tĂȘte: 2016. Si vous le rencontrez, vous pouvez me poser une question dĂ©licate: "Comment cela, je me souviens des nouvelles de 2017?" Le fait est qu'une Ă©quipe d'ingĂ©nieurs de Google a contactĂ© les dĂ©veloppeurs de PhantomJS en 2016, alors qu'ils commençaient Ă  peine Ă  implĂ©menter le mode sans tĂȘte dans Chrome. Nous avons Ă©crit des docks Google complets, comment nous allons implĂ©menter l'interface et ainsi de suite. Ensuite, Google a voulu rendre une interface entiĂšrement compatible avec PhantomJS. Ce n'est qu'Ă  ce moment-lĂ  que l'Ă©quipe d'ingĂ©nieurs a dĂ©cidĂ© de ne pas faire une telle compatibilitĂ©.

Nous parlerons de l'interface de gestion (API), qui est le protocole Chrome DevTools, plus tard et verrons ce que vous pouvez en faire.

Cet article sera construit sur le principe de la pyramide des marionnettistes (du marionnettiste anglais). Un bon nom est choisi - le marionnettiste est celui qui contrĂŽle tout le monde!



À la base de la pyramide se trouve Chrome sans tĂȘte - Chrome sans tĂȘte - qu'est-ce que c'est?

Chrome sans tĂȘte




Au centre - Navigateur sans tĂȘte - le mĂȘme Chrome ou Chrome (gĂ©nĂ©ralement Chrome). Il a ce qu'on appelle des moteurs de rendu (RENDERER) - des processus qui dessinent le contenu de la page (votre fenĂȘtre). De plus, chaque onglet a besoin de son propre moteur de rendu, donc si vous ouvrez plusieurs onglets, Chrome lancera autant de processus de rendu.

En plus de tout cela, c'est votre application. Si nous prenons Chromium ou Chrome sans tĂȘte, alors Chrome sera au-dessus, ou une application dans laquelle vous pourrez l'intĂ©grer. L'analogue le plus proche peut ĂȘtre appelĂ© Steam. Tout le monde sait qu'essentiellement, Steam n'est qu'un navigateur vers le site Web de Steam. Bien sĂ»r, il n'est pas sans tĂȘte, mais similaire Ă  ce schĂ©ma.

Il existe 2 façons d'intĂ©grer Chrome sans tĂȘte dans votre application (ou de l'utiliser):

  1. Standard lorsque vous prenez Puppeteer et utilisez Headless Chrome.
  2. Lorsque vous prenez le composant de bibliothĂšque sans tĂȘte , c'est-Ă -dire une bibliothĂšque qui implĂ©mente le mode sans tĂȘte, et l'intĂšgre dans votre application, par exemple, en C ++.

Vous vous demandez peut-ĂȘtre pourquoi C ++ est sur le front-end? La rĂ©ponse est l'API DevTools C ++. Vous pouvez implĂ©menter et utiliser les fonctionnalitĂ©s de Chrome sans tĂȘte de diffĂ©rentes maniĂšres. Si vous utilisez Puppeteer, la communication avec un navigateur sans tĂȘte se fera via des sockets Web. Si vous intĂ©grez la bibliothĂšque Headless dans une application de bureau, vous utiliserez l'interface native, qui est Ă©crite en C ++.

Mais en plus de tout cela, vous avez encore des choses supplémentaires, notamment:

  • Mise en rĂ©seau personnalisĂ©e - mise en Ɠuvre personnalisĂ©e de l'interaction avec le rĂ©seau. Supposons que vous travaillez dans une banque ou dans une agence gouvernementale composĂ©e de trois lettres et commence par "F" et utilise un protocole d'authentification ou d'autorisation trĂšs dĂ©licat qui n'est pas pris en charge par les navigateurs. Par consĂ©quent, vous devrez peut-ĂȘtre un gestionnaire personnalisĂ© pour votre rĂ©seau. Vous pouvez simplement prendre votre bibliothĂšque dĂ©jĂ  implĂ©mentĂ©e et l'utiliser dans Chrome.
  • Modules Mojo . L'analogue le plus proche de Mojo sont les liants natifs dans Node.js Ă  vos bibliothĂšques natives Ă©crites en C ++. Mojo fait de mĂȘme - vous prenez votre bibliothĂšque native, Ă©crivez une interface Mojo pour elle, puis vous pouvez appeler les mĂ©thodes de votre bibliothĂšque native dans votre navigateur.

Composants de chrome




Encore une fois, j'entends une question délicate: «Pourquoi ai-je besoin de ce terrible systÚme? J'écris sous (insérer le nom de votre framework préféré). »

Je pense qu'un développeur devrait savoir comment fonctionne son outil. Si vous écrivez sous React, vous devez savoir comment React fonctionne. Si vous écrivez sous Angular, vous devez savoir ce que Angular a sous le capot.

Parce que dans le cas de quelque chose, par exemple, une erreur fatale ou un bug trĂšs grave en production, vous devez faire face aux tripes, et vous pouvez simplement vous y perdre - oĂč, quoi et comment. Si vous, par exemple, Ă©crivez des tests ou utilisez Headless Chrome, vous pouvez Ă©galement rencontrer certains de ses comportements et bogues Ă©tranges. Par consĂ©quent, je vais vous dire briĂšvement ce que Chromium a des composants. Lorsque vous voyez une grande trace de pile, vous saurez dĂ©jĂ  de quelle façon creuser et comment y remĂ©dier.

Niveau le plus bas de la couche Platform . Ses composants:

  • Ozone , le gestionnaire de fenĂȘtres abstrait dans Chrome, est ce avec quoi interagit le gestionnaire de fenĂȘtres du systĂšme d'exploitation. Sous Linux, c'est soit un serveur X, soit Wayland. Sous Windows, il s'agit d'un gestionnaire de fenĂȘtres Windows.
  • Le planificateur est le mĂȘme planificateur sans lequel nous ne sommes nulle part, car nous savons tous que Chrome est une application multi-processus, et nous devons en quelque sorte rĂ©soudre tous les threads, processus et tout le reste.
  • Net - le navigateur doit toujours avoir un composant pour travailler avec le rĂ©seau, par exemple, analyser HTTP, crĂ©er des en-tĂȘtes, Ă©diter, etc.

La couche de contenu est le plus grand composant de Chrome. Il comprend:

  • Blink est un moteur Web basĂ© sur WebCore de WebKit. Il peut prendre HTML comme une chaĂźne, analyser, exĂ©cuter JavaScript - et c'est tout. Il ne sait plus rien faire: ni travailler avec le rĂ©seau, ni dessiner - tout cela se passe au dessus de Blink.
    Blink comprend: une version hautement modifiée de WebCore - un moteur Web pour travailler avec HTML et CSS; V8 (moteur JavaScript); ainsi qu'une API pour toutes les extensions que nous utilisons dans Chrome, comme un bloqueur de publicités. Il inclut également le protocole DevTools.
  • L'API de contenu est une interface avec laquelle vous pouvez trĂšs facilement utiliser toutes les fonctionnalitĂ©s du moteur Web. Puisqu'il y a tellement de choses Ă  l'intĂ©rieur de Blink (probablement plus d'un million d'interfaces), pour ne pas se perdre dans toutes ces mĂ©thodes et fonctions, vous avez besoin d'une API de contenu. Vous entrez HTML, le moteur le traitera automatiquement, analysera le DOM, construira CSS OM, exĂ©cutera JavaScript, exĂ©cutera des minuteries, des gestionnaires et tout le reste.

Niveau de couche sans tĂȘte - niveau de navigateur sans tĂȘte:

  • BibliothĂšque sans tĂȘte .
  • Interface API Embedder pour intĂ©grer la bibliothĂšque Headless dans l'application.
  • L'API client est une interface utilisĂ©e par Puppeteer.

Couche d'application Couche d'application :

  • Votre application (application d' intĂ©gration );
  • Gadgets, par exemple, shell sans tĂȘte .

Levons maintenant des profondeurs un peu plus haut, activons - maintenant le frontend ira.



Protocole Chrome DevTools


Nous sommes tous tombĂ©s sur le protocole Chrome DevTools, car nous utilisons le panneau de dĂ©veloppement dans Chrome ou le dĂ©bogueur distant - les mĂȘmes outils de dĂ©veloppement. Si vous exĂ©cutez les outils de dĂ©veloppement Ă  distance, la communication avec le navigateur se produit Ă  l'aide du protocole DevTools. Lorsque vous installez le dĂ©bogueur, consultez la couverture du code, utilisez la gĂ©olocalisation ou autre chose - tout cela est contrĂŽlĂ© Ă  l'aide de DevTools.



En fait, le protocole DevTools lui-mĂȘme possĂšde un grand nombre de mĂ©thodes. Votre outil dĂ©veloppeur n'a pas accĂšs, probablement Ă  80% d'entre eux. Vraiment, vous pouvez tout faire lĂ -bas!

Voyons ce qu'est ce protocole. En fait, c'est trĂšs simple. Il comprend 2 volets:

  1. DevTools target - l'onglet que vous inspectez;
  2. Client DevTools - disons que c'est un panel de développeurs qui est lancé à distance.



Ils communiquent Ă  l'aide de JSON simple:

  • Il existe un identifiant pour la commande, le nom de la mĂ©thode Ă  exĂ©cuter et certains paramĂštres.
  • Nous envoyons une demande et obtenons une rĂ©ponse qui semble Ă©galement trĂšs simple: un identifiant qui est nĂ©cessaire car toutes les commandes qui sont exĂ©cutĂ©es en utilisant le protocole sont asynchrones. Pour que nous puissions toujours comparer quelle rĂ©ponse Ă  quelle Ă©quipe nous avons reçue, nous avons besoin d'un identifiant.
  • Il y a un rĂ©sultat. Dans notre cas, il s'agit d'un objet rĂ©sultat avec les attributs suivants: type: "nombre", valeur: 2, description: "2" , aucune exception n'a Ă©tĂ© levĂ©e: wasThrown: false.

Mais entre autres, votre onglet peut vous renvoyer des événements. Supposons qu'un événement sur une page s'est produit ou qu'il y ait eu une exception sur une page, vous recevrez une notification via ce protocole.





Marionnettiste


Vous pouvez installer Puppeteer en utilisant votre gestionnaire de paquets préféré - que ce soit fil, npm ou tout autre.

Son utilisation est également facile - il suffit de le demander dans votre script Node.js, et vous pouvez déjà l'utiliser.



En utilisant le lien https://try-puppeteer.appspot.com, vous pouvez Ă©crire un script directement sur le site, l'exĂ©cuter et obtenir le rĂ©sultat directement dans le navigateur. Tout cela sera mis en Ɠuvre Ă  l'aide de Chrome sans tĂȘte.

Considérez le script le plus simple sous Node.js:

const puppeteer = require('puppeteer'); (async() => { const browser = await puppeteer.launch() ; const page = await browser.newPage(); await page.goto('http://devconf.ru/') ; await page.emulateMedia('screen') ; await page.pdf({ path: './devconf.pdf, printBackground: true }); await browser.close() ; })(); 

Ici, nous ouvrons simplement la page et l'imprimons en PDF. Voyons le fonctionnement de ce script en temps réel:


Tout sera cool, mais ce qui est Ă  l'intĂ©rieur n'est pas clair. Bien sĂ»r, nous avons un navigateur sans tĂȘte, mais nous ne voyons rien. Par consĂ©quent, Puppeteer a un drapeau spĂ©cial appelĂ© headless: false:

 const browser = await puppeteer.launch({ headless: false }); 

Il est nĂ©cessaire de lancer le navigateur sans tĂȘte en mode tĂȘte, lorsque vous pouvez voir une fenĂȘtre et voir ce qui arrive Ă  votre page en temps rĂ©el, c'est-Ă -dire comment votre script interagit avec votre page.



Cela ressemblera au mĂȘme script lorsque nous ajouterons ce drapeau. Une fenĂȘtre de navigateur apparaĂźt Ă  gauche - plus clairement.


Avantages de Puppeteer:

+ Il s'agit de la bibliothĂšque Node.js pour Chrome sans tĂȘte.
+ Prise en charge des versions héritées de Node.js> = 6.
+ Installation facile.
+ API de haut niveau pour gérer l'ensemble de cette machine géante.

Chrome sans tĂȘte s'installe facilement et sans intervention du systĂšme. Lors de la premiĂšre installation, Puppeteer tĂ©lĂ©charge la version de Chromium et l'installe directement dans le dossier node_modules spĂ©cifiquement pour votre architecture et votre systĂšme d'exploitation. Vous n'avez pas besoin de tĂ©lĂ©charger quoi que ce soit supplĂ©mentaire, il le fait automatiquement. Vous pouvez Ă©galement utiliser votre version prĂ©fĂ©rĂ©e de Chrome, qui est installĂ©e sur votre systĂšme. Vous pouvez Ă©galement le faire - Puppeteer vous fournit une telle API.

Malheureusement, il y a aussi des inconvénients, si nous prenons seulement l'installation de base.

Marionnettiste :

- Pas de fonctions de haut niveau : synchronisation des signets et des mots de passe; support de profil; accélération matérielle, etc.
- Le rendu logiciel est le moins significatif. Tous les calculs et le rendu ont lieu sur votre CPU. Mais ici, les ingĂ©nieurs de Google vont bientĂŽt nous surprendre - les travaux sur la mise en Ɠuvre de l'accĂ©lĂ©ration matĂ©rielle sont dĂ©jĂ  en cours. DĂ©jĂ  maintenant, vous pouvez essayer de l'utiliser si vous ĂȘtes courageux et courageux.
- Jusqu'Ă  rĂ©cemment, il n'y avait pas de support pour les extensions - maintenant c'est le cas! Si vous ĂȘtes un dĂ©veloppeur rusĂ©, vous pouvez prendre votre AdBlock prĂ©fĂ©rĂ©, spĂ©cifier comment Puppeteer l'utilisera et toutes les annonces seront bloquĂ©es.
- Pas de support audio / vidéo . Parce que, eh bien, pourquoi l'audio et la vidéo sans navigateur.

Que peut Marionnettiste:

  • SĂ©ances d'isolement.
  • Minuteries virtuelles.
  • Interception des requĂȘtes rĂ©seau.

Et quelques trucs sympas que je montrerai un peu plus loin.

Isolement de session


Qu'est-ce que c'est, avec quoi est-il mangé, et ne nous étoufferons-nous pas? - Ne t'étouffe pas!

L'isolement de session est un «référentiel» distinct pour chaque onglet . Lorsque vous démarrez Puppeteer, vous pouvez créer une nouvelle page et chaque nouvelle page peut avoir son propre référentiel, notamment:

  • cuisiniers
  • stockage local;
  • cache.

Toutes les pages vivront indépendamment les unes des autres. Cela est nécessaire, par exemple, pour maintenir l'atomicité des tests.

L'isolation de session économise des ressources et du temps lors du démarrage de sessions parallÚles . Supposons que vous testez un site en cours de création en mode développement, c'est-à-dire que le bundle n'est pas réduit et pÚse 20 Mo. Si vous voulez simplement le mettre en cache, vous pouvez dire à Puppeteer d'utiliser un cache commun à toutes les pages qui sont créées, et cet ensemble sera mis en cache.

Vous pouvez sérialiser des sessions pour une utilisation ultérieure . Vous écrivez un test qui vérifie une certaine action sur votre site. Mais vous avez un problÚme - le site nécessite une autorisation. Vous n'ajouterez pas constamment avant dans chaque test d'autorisation sur le site. Puppeteer vous permet de vous connecter une fois au site, puis de réutiliser cette session à l'avenir.

Minuteries virtuelles


Vous utilisez peut-ĂȘtre dĂ©jĂ  des minuteries virtuelles. Si vous avez dĂ©placĂ© le curseur dans un outil de dĂ©veloppement qui accĂ©lĂšre ou ralentit l'animation (et s'est lavĂ© les mains aprĂšs cela bien sĂ»r!), À ce moment-lĂ , vous avez utilisĂ© des minuteries virtuelles dans le navigateur.

Le navigateur peut utiliser des minuteries virtuelles au lieu de vraies pour «faire dĂ©filer» le temps vers l'avant pour accĂ©lĂ©rer le chargement de la page ou terminer l'animation. Supposons que vous ayez le mĂȘme test, vous allez sur la page principale, et lĂ  l'animation pendant 30 secondes. Il n'est avantageux pour personne de faire attendre le test pendant tout ce temps. Par consĂ©quent, vous pouvez simplement accĂ©lĂ©rer l'animation afin qu'elle se termine instantanĂ©ment au chargement de la page et que votre test se poursuive.

Vous pouvez arrĂȘter l'heure pendant l'exĂ©cution de la demande rĂ©seau . Par exemple, vous testez la rĂ©action de votre application au moment oĂč une demande envoyĂ©e au back-end met trĂšs longtemps Ă  s'exĂ©cuter ou retourne avec une erreur. Vous pouvez arrĂȘter le temps - Puppeteer le permet.

Sur la diapositive ci-dessous, il y a une autre option: arrĂȘter et continuer le rendu. En mode expĂ©rimental, il Ă©tait possible de dire au navigateur de ne pas restituer, et plus tard, si nĂ©cessaire, de demander une capture d'Ă©cran. Ensuite, Chrome sans tĂȘte rendrait tout rapidement, donnerait une capture d'Ă©cran et arrĂȘterait de dessiner quoi que ce soit. Malheureusement, les dĂ©veloppeurs ont dĂ©jĂ  rĂ©ussi Ă  changer le principe de fonctionnement de cette API et il n'y a plus une telle fonction.

Une vue schématique des minuteurs virtuels ci-dessous.



La ligne supérieure a deux minuteries réguliÚres: la premiÚre démarre dans la premiÚre unité de temps et s'exécute dans une unité de temps, la seconde démarre dans la troisiÚme unité de temps et s'exécute en trois unités de temps.

Accélérer les chronomÚtres - ils démarrent les uns aprÚs les autres. Lorsque nous les mettons en pause, nous avons une période de temps aprÚs laquelle tous les chronomÚtres démarrent.

Considérez ceci comme un exemple. Ci-dessous est un morceau de code coupé qui charge essentiellement la page d'animation de codepen.io et attend:

 (async() => { const browser = await puppeteer.launch(); const page = await browser.newPage(); const url = 'https ://codepen.o/ajerez/full/EaEEOW/'; // # 1 await page.goto(url, { waitUnitl: 'load' }); // # 2 })(); 


Cette démonstration de l'implémentation lors de la présentation n'est qu'une animation.

Maintenant, en utilisant le protocole Chrome DevTools, nous allons envoyer une méthode appelée Animation.setPlaybackRate, lui passer un playbackRate avec une valeur de 12 comme paramÚtres:

 const url = 'https://codepen.o/ajerez/full/EaEEOW/'; // # 1 await page._client.send('Animation.setPlaybackRate', { playbackRate: 12 }); // # 3 await page.goto(url, { waitUntil: 'load' }); // # 2 

Nous chargeons le mĂȘme lien et l'animashka a commencĂ© Ă  fonctionner beaucoup plus rapidement. Cela est dĂ» au fait que nous avons utilisĂ© une minuterie virtuelle et accĂ©lĂ©rĂ© la lecture de l'animation de 12 fois.

Faisons une expérience maintenant - passez playbackRate: 0 - et voyons ce qui se passe. Et voici: il n'y a pas d'animation du tout, ça ne joue pas. Les valeurs nulles et négatives mettent simplement complÚtement l'animation en pause.

Travailler avec les requĂȘtes rĂ©seau


Vous pouvez intercepter les demandes réseau en définissant l'indicateur suivant:

 await page.setRequestlnterception(true); 

Dans ce mode, un événement supplémentaire apparaßt qui se déclenche lorsqu'une demande réseau est envoyée ou reçue.

Vous pouvez modifier la demande Ă  la volĂ©e . Cela signifie que vous pouvez modifier complĂštement tout son contenu (corps) et ses en-tĂȘtes, inspecter, voire annuler la demande.

Cela est nécessaire pour traiter l'autorisation ou l'authentification , y compris l'authentification de base via HTTP.

Vous pouvez également faire une couverture de code (JS / CSS) . Avec Puppeteer, vous pouvez automatiser tout cela. Nous connaissons tous des utilitaires qui peuvent charger une page, montrer quelles classes y sont utilisées, etc. Mais en sommes-nous satisfaits? Je pense que non.

Le navigateur sait mieux quels sélecteurs et classes sont utilisés - c'est un navigateur! Il sait toujours quel JavaScript a exécuté, lequel, quel CSS est utilisé, lequel ne l'est pas.

Le protocole Chrome DevTools vient Ă  la rescousse:

 await Promise.all ( [ page.coverage.startJSCoverage(), page.coverage.startCSSCoverage() ]); await page.goto('https://example.com'); const [jsCoverage, cssCoverage] = await Promise,all([ page.coverage.stopJSCoverage(), page.coverage.stopCSSCoverage() ]): 

Dans les deux premiĂšres lignes, nous lançons une fonctionnalitĂ© relativement nouvelle qui vous permet de dĂ©couvrir la couverture du code. ExĂ©cutez JS et CSS, allez sur une page, puis dites - arrĂȘtez - et nous pouvons voir les rĂ©sultats. Et ce ne sont pas des rĂ©sultats imaginaires, mais ceux que le navigateur voit Ă  cause du moteur.

Entre autres choses, il existe déjà un plugin qui, pour Puppeteer, exporte tout à Istanbul.

Au sommet de la pyramide Puppeteer se trouve un script que vous avez écrit sur Node.js - c'est comme le parrain pour tous les points bas.



Mais ... "tout n'est pas calme dans le royaume danois ..." - comme l'a écrit William Shakespeare.

Quel est le problĂšme avec les navigateurs sans tĂȘte?


Les navigateurs sans tĂȘte ont des problĂšmes, mĂȘme si toutes leurs fonctionnalitĂ©s intĂ©ressantes peuvent faire beaucoup.

Différence de rendu de page sur différentes plateformes


J'adore vraiment cet article et j'en parle constamment. Regardons cette image.



Voici une page réguliÚre avec du texte brut: à droite - rendu dans Chrome sur Linux, à gauche - sous Windows. Ceux qui testent avec des captures d'écran savent qu'une valeur est toujours définie, appelée la «marge d'erreur», qui détermine quand la capture d'écran est considérée comme identique ou non.

En fait, le problĂšme est que, quelle que soit la façon dont vous essayez de dĂ©finir ce seuil, l'erreur ira toujours au-delĂ  de cette ligne et vous recevrez toujours de faux rĂ©sultats positifs. Cela est dĂ» au fait que toutes les pages, et mĂȘme les polices Web, sont rendues diffĂ©remment sur les trois plates-formes - sous Windows selon un algorithme, sous MacOS diffĂ©remment, sous Linux en gĂ©nĂ©ral un zoo. Vous ne pouvez pas simplement prendre et tester des captures d'Ă©cran .

Vous direz: "J'ai juste besoin d'une machine de rĂ©fĂ©rence oĂč je vais exĂ©cuter tous ces tests et comparer des captures d'Ă©cran." Mais en fait, cela est extrĂȘmement gĂȘnant, car vous devez attendre CI et vous voulez vĂ©rifier ici localement sur votre machine si vous avez cassĂ© quelque chose. Si vous avez des captures d'Ă©cran de rĂ©fĂ©rence prises sur une machine Linux et que vous avez un Mac, il y aura de faux rĂ©sultats.

Par conséquent, je dis que ne testez pas du tout avec des captures d'écran - oubliez-le.

Soit dit en passant, si vous voulez toujours tester avec des captures d'écran, il y a un merveilleux article de Roman Dvornov, « Tests unitaires avec des captures d'écran: briser la barriÚre acoustique ». C'est de la fiction policiÚre.

Serrures


De nombreux grands fournisseurs de contenu n'aiment pas que vous supprimiez ou rĂ©cupĂ©riez leur contenu de maniĂšre illĂ©gale. Imaginez que je suis un fournisseur de contenu majeur et que je souhaite jouer le mĂȘme jeu avec vous. Il existe deux demandes GET dans deux navigateurs diffĂ©rents.


Pouvez-vous deviner oĂč Chrome se trouve ici? L'option "les deux" n'est pas acceptĂ©e - Chrome n'en est qu'une. TrĂšs probablement, vous ne serez pas en mesure de rĂ©pondre Ă  cette question, et moi, en tant que fournisseur de contenu majeur, je peux: Ă  droite - PhantomJS, et Ă  gauche - Chrome.


Je peux atteindre le point oĂč je vais dĂ©tecter vos navigateurs (ce qui est exactement Chrome ou FireFox) en faisant correspondre l'ordre des en-tĂȘtes HTTP dans vos demandes. Si l'hĂŽte passe en premier - je le sais clairement - c'est Chrome. Alors je ne peux pas comparer. Oui, bien sĂ»r, il existe des algorithmes plus complexes - nous vĂ©rifions non seulement l'ordre, mais aussi les valeurs, etc. etc. Mais il est important que je puisse lancer vos titres, vĂ©rifier qui vous ĂȘtes, puis vous bloquer ou ne pas vous bloquer.

Impossible d'implémenter certaines fonctionnalités (Flash)


Avez-vous déjà étudié en profondeur, directement hardcore, Flash dans les navigateurs? D'une certaine maniÚre, j'ai regardé à l'intérieur - puis je n'ai pas dormi pendant six mois.

Nous nous souvenons tous de la façon dont nous regardions YouTube quand il y avait encore Flash: la vidĂ©o tourne, tout va bien. Mais au moment oĂč un objet incorporĂ© est créé sur une page telle que Flash, il demande toujours une vraie fenĂȘtre Ă  votre OS. Autrement dit, en plus de la fenĂȘtre de votre navigateur, il y avait une autre fenĂȘtre de votre systĂšme d'exploitation Ă  l'intĂ©rieur de la fenĂȘtre Flash YouTube. Flash ne peut fonctionner que si vous lui donnez une vraie fenĂȘtre - pas seulement une vraie fenĂȘtre, mais une fenĂȘtre visible sur votre Ă©cran. Par consĂ©quent, certaines fonctions ne peuvent pas ĂȘtre implĂ©mentĂ©es dans les navigateurs sans tĂȘte, y compris Flash.

Automatisation complĂšte et bots


Comme je l'ai dit plus tÎt, les grands fournisseurs de contenu ont trÚs peur lorsque vous écrivez des araignées ou des saisies qui volent simplement des informations fournies moyennant des frais.

Diverses astuces sont utilisĂ©es. Il existe des articles sur la façon de dĂ©tecter toujours les navigateurs sans tĂȘte. Je peux dire que vous ne pourrez pas dĂ©tecter les navigateurs sans tĂȘte . Toutes les mĂ©thodes qui y sont dĂ©crites sont contournĂ©es. Par exemple, il existe des mĂ©thodes de dĂ©tection utilisant Canvas. Je me souviens qu'il y avait mĂȘme un script qui regardait la souris se dĂ©placer sur l'Ă©cran et remplir le canevas. Nous sommes des gens et nous dĂ©plaçons la souris assez lentement, et Headless Chrome est beaucoup plus rapide. Le script a compris que Canvas se remplit trop rapidement - ce qui signifie qu'il s'agit probablement de Chrome sans tĂȘte. Nous avons Ă©galement contournĂ© cela, simplement ralentir le navigateur n'est pas un problĂšme.

Il n'y a pas d'API standard (unique)


Si vous avez regardĂ© des implĂ©mentations sans tĂȘte dans d'autres navigateurs - que ce soit Safari ou FireFox - tout est implĂ©mentĂ© Ă  l'aide de l'API Webdriver. Chrome a le protocole Chrome DevTools. Dans Edge, rien n'est clair du tout - ce qui est lĂ , ce qui ne l'est pas.

WebGL?


Les gens demandent Ă©galement WebGL en mode sans tĂȘte. Ce lien vous permet d'accĂ©der Ă  l'outil de suivi des bogues de Google Chrome. LĂ , les dĂ©veloppeurs votent activement pour l'implĂ©mentation du mode sans tĂȘte pour WebGL, et dĂ©jĂ  il peut dessiner quelque chose. Ils sont maintenant simplement limitĂ©s par le rendu matĂ©riel. DĂšs que l'implĂ©mentation du rendu matĂ©riel est terminĂ©e, WebGL sera automatiquement disponible, c'est-Ă -dire que quelque chose peut ĂȘtre fait en arriĂšre-plan.

Mais tout n'est pas si mal!

Nous avons un deuxiĂšme acteur sur le marchĂ© - le 11 mai 2018, Microsoft a annoncĂ© dans son navigateur Edge avoir dĂ©cidĂ© d'implĂ©menter presque le mĂȘme protocole que celui utilisĂ© dans Google Chrome. Ils ont spĂ©cialement créé un consortium oĂč ils discutent d'un protocole qu'ils veulent mettre Ă  un standard de l'industrie afin que vous puissiez prendre votre script et l'exĂ©cuter sous Edge, Chrome et FireFox.

Mais il y a un «mais» - Microsoft Edge n'a malheureusement pas de mode sans tĂȘte. Ils ont un bulletin de vote oĂč les gens Ă©crivent: "Donnez-nous un mode sans tĂȘte!" - mais ils sont silencieux. J'ai probablement vu quelque chose en secret.

TODO (conclusion)


J'ai tout dit pour que vous puissiez venir voir votre manager ou, si vous ĂȘtes manager, le dĂ©veloppeur, et dire: «C'est tout! Nous ne voulons plus de sĂ©lĂ©nium - donnez-nous Marionnettiste! Nous allons y tester. " Si cela se produit, je serai heureux.

Mais si vous pouvez apprendre, comme moi, les navigateurs utilisant Puppeteer, publier activement des bugs ou envoyer une pull request, alors je serai encore plus heureux. Cet outil dans OpenSource se trouve sur GitHub, est écrit dans Node.js - vous pouvez simplement emprunter et y contribuer.

Le cas de Puppeteer est unique en ce sens que deux Ă©quipes travaillent sur Google: l'une s'occupe spĂ©cifiquement de Puppeteer, l'autre du mode sans tĂȘte. Si un utilisateur trouve un bogue et Ă©crit Ă  ce sujet sur GitHub, alors si ce bogue n'est pas dans Puppeteer, mais dans Headless Chrome, le bogue passe Ă  la commande Headless Chrome. S'ils le corrigent, Puppeteer est mis Ă  jour trĂšs rapidement. Il en rĂ©sulte un Ă©cosystĂšme unique lorsque la communautĂ© contribue Ă  amĂ©liorer le navigateur.

Par conséquent, je vous exhorte à contribuer à l'amélioration de l'outil, qui est utilisé non seulement par vous, mais aussi par d'autres développeurs et testeurs.

Coordonnées:

  • github.com/vitallium
  • vk.com/vitallium
  • twitter.com/vitalliumm

Frontend Conf Moscow - une conférence spécialisée des développeurs front-end se tiendra les 4 et 5 octobre à Moscou , dans Infospace. Une liste des rapports acceptés a déjà été publiée sur le site Web de la conférence.

Dans notre newsletter, nous faisons réguliÚrement des revues thématiques des discours, parlons des transcriptions qui ont été publiées et des événements futurs - inscrivez-vous pour recevoir les nouvelles en premier.

Et ceci est un lien vers notre chaßne Youtube sur le front end, il contient tous les discours liés au développement de la partie client des projets.

Source: https://habr.com/ru/post/fr421137/


All Articles