J'ai touché au dernier outil de test automatique "Playwright for Python"

"Playwright", qui était un outil de test automatique E2E pour JavaScript, ** Il a été publié en avant-première sous le nom de "Playwright for Python" pour Python **, donc je l'ai immédiatement touché.

Announcing Playwright for Python: Reliable end-to-end testing for the web

Qu'est-ce que le dramaturge

Playwright est une bibliothèque qui automatise Chromium, Firefox et Webkit avec une seule API. Cela vous permettra d'effectuer des tests inter-navigateurs rapides et fiables.

Avantages du dramaturge

Le Document officiel énonce les quatre points suivants. Ci-dessous ma traduction.

1. Prend en charge tous les navigateurs

2. Exécution de test rapide et fiable

3. Réalisez une automatisation puissante

4. Intégration avec le flux de travail

--Peut être installé sur une seule ligne.

Mains sur

À partir de là, j'écrirai en fait un cas de test. J'ai utilisé la page Réservation de chambre HOTEL PLANISPHERE (plan avec avantages spéciaux) pour la cible de test. .. Le cas de test était un test normal, "Accédez à la page à tester, définissez chaque paramètre, puis passez à la page de confirmation de réservation, et si le montant affiché est de 15 000 yens, passez".

Installation

Installer selon la description sur le GitHub officiel. Aussi, cette fois, nous utiliserons pytest pour le framework de test unitaire, donc cliquez sur Installer le plug-in pytest.

pip install playwright
python -m playwright install
pip install pytest-playwright

Cette fois, nous ne le ferons pas, mais si vous souhaitez effectuer un traitement asynchrone, veuillez faire pip install asyncio séparément.

Essayez d'abord d'écrire un test avec Selenium

Avant de toucher Playwright, j'ai écrit un cas de test que je souhaite réaliser cette fois avec Selenium Webdriver comme référence. Il y a beaucoup d'instructions d'importation, de traitement en attente pour le contenu dynamique et de gestion de Webdriver pour chaque navigateur, donc c'est assez difficile.

selenium.py


import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select, WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager


class TestPlanisphere:
    def test_reserve_otoku(self):
        driver = webdriver.Chrome(ChromeDriverManager().install())
        wait = WebDriverWait(driver, 10)

        driver.get("https://hotel.testplanisphere.dev/ja/reserve.html?plan-id=0")
        # NOTE: wait.until(EC.presence_of_all_elements_located) <-Ne marche pas
        time.sleep(1)  # HACK

        date = driver.find_element_by_id("date")  #Date de séjour
        date.clear()
        date.send_keys("2020/12/24")
        date.send_keys(Keys.TAB)

        term = driver.find_element_by_id("term")  #nombre de séjours
        term.clear()
        term.send_keys("2")

        head_count = driver.find_element_by_id("head-count")  #Nombre de personnes
        head_count.clear()
        head_count.send_keys("1")

        sightseeing = driver.find_element_by_id("sightseeing")  #Sélectionnez «Plan touristique de grande valeur»
        if not sightseeing.is_selected():
            sightseeing.click()

        driver.find_element_by_id("username").send_keys("Beribo")  #Nom

        Select(driver.find_element_by_id("contact")).select_by_value("tel")  #"Je souhaite être contacté par téléphone"

        driver.find_element_by_id("tel").send_keys("80120828828")  #numéro de téléphone

        driver.find_element_by_id("submit-button").click()  #Transition vers la page de confirmation de réservation
        wait.until(EC.presence_of_all_elements_located)

        driver.save_screenshot("selenium.png ")  #Prendre une capture d'écran

        assert "15,000" in driver.find_element_by_id("total-bill").text

        driver.quit()

Ecrire un test avec Playwright pour Python

Ensuite, j'ai écrit le même test avec Playwright pour Python. Les méthodes utilisées cette fois sont résumées dans les pages suivantes de la documentation officielle. Bien qu'il ne soit décrit qu'en JavaScript, il peut être utilisé presque entièrement en Python.

play.py


from playwright.sync_api import Page


class TestPlanisphere:
    def test_reserve_otoku(self, page: Page):
        page.goto("https://hotel.testplanisphere.dev/ja/reserve.html?plan-id=0")
        page.waitForLoadState("networkidle")

        page.fill("#date", "2020/12/24")  #Date de séjour
        page.press("#date", "Tab")

        page.fill("#term", "2")  #nombre de séjours

        page.fill("#head-count", "1")  #Nombre de personnes

        page.check("#sightseeing")  #Sélection du plan

        page.fill("#username", "Beribo")  #Nom

        page.selectOption("#contact", "tel")  #"Je souhaite être contacté par téléphone"
        page.fill("#tel", "80120828828")  #numéro de téléphone

        page.click("#submit-button")  #Transition vers la page de confirmation de réservation
        page.waitForLoadState("networkidle")

        page.screenshot(path="playwright.png ")  #Prendre une capture d'écran

        assert "15,000" in page.innerText("#total-bill")

        page.close()

Comparé au sélénium

Vous pouvez voir que la partie difficile de Selenium a été résolue avec brio rien qu'en regardant le script.

Exécutez des tests Playwright avec pytest

Il ne vous reste plus qu'à exécuter le play.py ci-dessus dans pytest. Headless / headful, le navigateur d'exécution peut être spécifié comme option au moment de l'exécution. Vous pouvez également enregistrer les options de démarrage dans le fichier pytest.ini. ](Https://github.com/microsoft/playwright-pytest#usage)

#Essai(Le chrome sans tête est la valeur par défaut)
pytest play.py

#Test de fonctionnement en mode entête
pytest --headful play.py

#Tester l'exécution en spécifiant un navigateur(chromium, firefox, webkit)
pytest --browser firefox play.py

#Test exécuté sur plusieurs navigateurs
pytest --browser chromium --browser webkit play.py

Impressions

Je pense qu'il y a deux directions pour l'évolution des outils automatisés, Je pense que l'un est d'évoluer en tant que plate-forme de test multifonctionnelle qui intègre des fonctions de reporting et des fonctions CI, et l'autre est d'évoluer en tant qu'outil programmable léger, à grande vitesse. Je sentais que le dramaturge serait une option puissante pour ce dernier.

Le soutien d'un géant appelé Microsoft (et l'origine est Puppeteer de Google ...) est très puissant en tant qu'OSS, et des améliorations futures peuvent être attendues, alors j'ai pensé qu'il serait bon de commencer à partir de maintenant la version préliminaire. pense.

Pour être honnête, j'ai personnellement estimé que c'était beaucoup plus facile et moins coûteux à apprendre que le sélénium, je donnerai donc la priorité au sélénium lorsqu'il pourra être utilisé!

Recommended Posts

J'ai touché au dernier outil de test automatique "Playwright for Python"
Création d'un outil de test AtCoder pour Python
J'ai essayé de créer un outil d'échafaudage pour le framework Web Python Bottle
J'ai touché à l'outil de préparation de données Paxata
[Python] J'ai essayé de remplacer le nom de la fonction par le nom de la fonction
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé la programmation python pour la première fois.
[Python] J'ai cherché le plus long Pokémon Shiritori
J'ai touché certaines des nouvelles fonctionnalités de Python 3.8 ①
[Recette du formateur] J'ai touché le flacon du framework Python.
Ce que je suis entré dans Python pour la première fois
J'ai essayé Python sur Mac pour la première fois.
J'ai essayé python pour la première fois avec heroku
Un mémo que j'ai touché au magasin de données avec python
J'étais accro au débogueur Python pdb pendant 2 minutes
Pour se préparer au test G 2020 # 2
J'ai essayé de toucher l'API Qiita
J'ai essayé de programmer le test du chi carré en Python et Java.
Modèle Python pour Codeforces-test manuel-
Je ne savais pas comment utiliser l'instruction [python] for
Je viens d'écrire le matériel original pour l'exemple de code python
Notes diverses sur l'utilisation de python pour les projets
J'ai réussi le test d'analyse de données Python, j'ai donc résumé les points
J'ai téléchargé la source python
Mémorandum de l'outil de gestion de paquets Python ez_setup
J'ai essayé d'utiliser Kwant, un module python pour le calcul du transport quantique
Python> J'ai créé un code de test pour mon propre fichier externe
[Python] Notification LINE des dernières informations à l'aide de la recherche automatique Twitter
Préparez un environnement de test de charge distribué avec l'outil de test de charge Python Locust
J'ai touché PyAuto pendant un moment
Installez RDKit, un outil informatique de chimie pour Python
AtCoder: Python: Papa, l'exemple de test.
J'ai aimé le tweet avec python. ..
Voir python pour la première fois
J'ai écrit la file d'attente en Python
À quoi sert le trait de soulignement Python (_)?
J'ai écrit la pile en Python
Commande pour le répertoire courant Python
Découvrez la partie I «Monnaie multinationale» du livre «Test Driven Development» avec Python
[Python] J'ai examiné la méthode de conversion exe pour distribuer des outils d'efficacité commerciale.
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
Présentation du framework BOT Minette pour Python
Outil de visualisation Python pour le travail d'analyse de données
J'ai essayé tensorflow pour la première fois
Ecrire le test dans la docstring python
Tableau de comparaison des outils d'environnement Python pour Rubyist
J'ai essayé l'outil de visualisation OSS, sur-ensemble
Lancez le bot Discord Python pendant 24 heures.
Je ne connaissais pas les bases de Python
MongoDB avec Python pour la première fois
[Python] J'ai personnellement résumé la grammaire de base.
J'ai écrit le code pour l'échantillonnage Gibbs
Pandas du débutant, par le débutant, pour le débutant [Python]
Python: j'ai essayé le problème du voyageur de commerce
Le modèle de projet Python auquel je pense.
Un outil pour saisir facilement du code Python
J'ai cherché un nombre premier avec python
[Python débutant] J'ai rassemblé les articles que j'ai écrits