Version pratique de l'automatisation des tests des applications Flutter avec Appium (Python)

introduction

Construction d'environnement pour automatiser le test des applications Flutter avec Appium --Qiita Ce sera une continuation de. Je vais en fait écrire le code de test et l'exécuter. Cette fois, j'utiliserai "Python", qui semble relativement facile à préparer, tout en étudiant.

Conditions préalables

Construction d'environnement pour automatiser le test des applications Flutter avec Appium --Qiita Et la construction de l'environnement d'Appium est terminée

Installer la commande pip

Python devrait être fourni en standard avec Mac, vous n'avez donc pas besoin de l'installer à nouveau. Vous devriez déjà pouvoir utiliser la commande pip, mais si vous ne l'avez pas fait, https://bootstrap.pypa.io/get-pip.py Veuillez télécharger et exécuter la commande suivante à la destination du téléchargement. (Si cela ne fonctionne pas, essayez de l'exécuter avec `` sudo '' devant lui)

python get-pip.py

Installation d'Appium-Python-Client

Exécutez la commande suivante pour installer Appium-Python-Client. (Si cela ne fonctionne pas, essayez de l'exécuter avec `` sudo '' devant lui)

pip install Appium-Python-Client

Exemple d'application à utiliser cette fois

Nous avons préparé un exemple d'application très simple ci-dessous. (Il s'agit d'une application de comptage qui est écrite par défaut lorsque vous créez un nouveau projet Flutter dans Android Studio)

Screenshot_20191125-231835.jpg

Enregistrer le code de test dans Appium Desktop

Démarrez Appium Desktop et allez au point où vous démarrez la session avec "Démarrer la session". (Reportez-vous à Construction de l'environnement pour la procédure)

Lorsque vous démarrez la session, l'écran suivant apparaît. L'écran de l'application s'affiche sur le côté gauche. Si l'affichage ne correspond pas à l'écran de votre appareil, cliquez sur le bouton d'actualisation pour actualiser l'écran. Tout d'abord, cliquez sur le bouton d'enregistrement pour démarrer l'enregistrement.

1.png

Ensuite, l'écran changera et le bouton pause s'affichera à la place du bouton d'enregistrement. Pour arrêter l'enregistrement, cliquez sur le bouton pause.

2.png

Cliquez ensuite sur le bouton plus de l'écran Appium au lieu du terminal. Les informations sur le bouton plus seront affichées sur le côté droit.

3.png

Cliquez sur Appuyer pour voir le code de test en haut. Vous pouvez sélectionner la langue du code de test et sélectionner "Python".

4.png

Vous pouvez également sélectionner JS (wd), JS (Webdriver.io), Ruby, Java et Robot Framework.

7.png

Cela vous permet d'enregistrer le code de test lorsque vous appuyez sur le bouton. Le code de test enregistré est le suivant.

el1 = self.driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.view.View/android.view.View/android.view.View/android.widget.Button")
el1.click()

Ensuite, je voudrais tester que le texte étiqueté «1» est correctement étiqueté comme «1». Vous pouvez obtenir l'élément à partir du "Sélecteur" de "Elément sélectionné" en cliquant sur l'élément.

5.png

Mais je ne savais pas comment l'enregistrer dans Appium Desktop.

Appium-Python-Client · PyPI Selon le site, vous pouvez utiliser la fonction get_attribute pour obtenir la valeur définie dans le texte.

el = driver.find_element_by_class_name('android.widget.EditText')
driver.set_value(el, 'Testing')

text = el.get_attribute('text')
assertEqual('Testing', text)

el.set_value('More testing')
text = el.get_attribute('text')
assertEqual('More testing', text)

Le code de test est décrit comme suit.

el2 = self.driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.view.View/android.view.View/android.view.View/android.view.View[3]")
text = el2.get_attribute('text')
self.assertEqual('1', text)

Autoriser l'exécution du code de test enregistré

Le simple fait de l'enregistrer n'est pas encore prêt pour l'exécution, alors jetez-y les bases. Le code complet est ci-dessous.

flutter_app_for_appium_test.py


import os
import unittest
from appium import webdriver
from time import sleep

class FlutterAppTests(unittest.TestCase):
    "Class to run tests against the Chess Free app"
    def setUp(self):
        "Setup for the test"
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '9'
        desired_caps['deviceName'] = '988a97354e4e4c5054'
        desired_caps['app'] = os.path.abspath(os.path.join(os.path.dirname(__file__), '/Users/Hitoshi/AndroidStudioProjects/flutter_app_for_appium/build/app/outputs/apk/release/app-release.apk'))
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

    def tearDown(self):
        "Tear down the test"
        self.driver.quit()

    def test_single_player_mode(self):
        "Test the Flutter app launches correctly"
        sleep(1)
        # -----Collez le code enregistré dans Appium Desktop à partir d'ici
        el1 = self.driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.view.View/android.view.View/android.view.View/android.widget.Button")
        el1.click()
        el2 = self.driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.view.View/android.view.View/android.view.View/android.view.View[3]")
        text = el2.get_attribute('text')
        self.assertEqual('1', text)
        # -----Collez le code enregistré dans Appium Desktop jusqu'à présent

if __name__ == '__main__':
    suite = unittest.TestLoader().loadTestsFromTestCase(FlutterAppTests)
    unittest.TextTestRunner(verbosity=2).run(suite)

Ici, je vais l'expliquer brièvement. Tout d'abord, dans la fonction de configuration, décrivez les informations sur l'appareil et l'APK. C'est OK si vous entrez les mêmes informations que "Capacités souhaitées" d'Appium Desktop.

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '9'
desired_caps['deviceName'] = '988a97354e4e4c5054'
desired_caps['app'] = os.path.abspath(os.path.join(os.path.dirname(__file__), '/Users/Hitoshi/AndroidStudioProjects/flutter_app_for_appium/build/app/outputs/apk/release/app-release.apk'))

Ensuite, dans la fonction test_single_player_mode, collez le code de test que vous venez d'enregistrer dans Appium Desktop. Bien sûr, vous pouvez l'implémenter vous-même. Voici le code de test réel.

el1 = self.driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.view.View/android.view.View/android.view.View/android.widget.Button")
el1.click()
el2 = self.driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.view.View/android.view.View/android.view.View/android.view.View[3]")
text = el2.get_attribute('text')
self.assertEqual('1', text)

Enfin, utilisez la fonction tearDown pour terminer le pilote.

self.driver.quit()

Exécuter le code de test

Exécutez le code de test avec la commande.

python flutter_app_for_appium_test.py

Vous devriez voir quelque chose comme ceci: L'application doit également démarrer du côté du terminal et le bouton doit être enfoncé pour compter.

test_single_player_mode (__main__.FlutterAppTests)
Test the Flutter app launches correctly ... ok

----------------------------------------------------------------------
Ran 1 test in 25.573s

OK

référence

Recommended Posts

Version pratique de l'automatisation des tests des applications Flutter avec Appium (Python)
Vérifier l'existence du fichier avec python
Préparer l'environnement d'exécution de Python3 avec Docker
Mathématiques Todai 2016 résolues avec Python
Calculez le nombre total de combinaisons avec python
Vérifiez la date du devoir de drapeau avec Python
Automatiser des tâches simples avec Python Table des matières
Convertir le code de caractère du fichier avec Python3
[Python] Déterminez le type d'iris avec SVM
Essayez la touche d'un test basé sur les données avec Selenium Python Bindings et py.test
Extraire le tableau des fichiers image avec OneDrive et Python
Apprenez Nim avec Python (dès le début de l'année).
Détruire l'expression intermédiaire de la méthode sweep avec Python
Visualisez la gamme d'insertions internes et externes avec python
Calculer le coefficient de régression d'une analyse de régression simple avec python
L'édition définitive du grattage python! (Site cible: grande caméra)
Obtenez l'état de fonctionnement de JR West avec Python
Essayez de gratter les données COVID-19 Tokyo avec Python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
L'histoire de la mise en œuvre du sujet Facebook Messenger Bot avec python
Unifier l'environnement de l'équipe de développement Python en commençant par Poetry
Visualisez les résultats des arbres de décision réalisés avec Python scikit-learn
Calculez des millions de chiffres dans la racine carrée de 2 avec python
J'ai écrit la grammaire de base de Python dans Jupyter Lab
Exécutez l'intelligence de votre propre bibliothèque python avec VScode.
Présentation du potentiel du nuage de points de Plotly avec des exemples pratiques
J'ai évalué la stratégie de négociation du système boursier avec Python.
Touchons l'API de Netatmo Weather Station avec Python. #Python #Netatmo
L'histoire du rubyiste aux prises avec Python :: Dict data with pycall
[Homologie] Comptez le nombre de trous dans les données avec Python
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Estimer la posture du marqueur AR avec Python + OpenCV + drone
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Récupérez la source de la page à charger indéfiniment avec python.
Vers la retraite de Python2
Automatisez les tests python avec CircleCI
Appelez l'API avec python3.
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
[Python] Organiser la structure de base de l'application Flask (Viser la dé-copie)
Le 14 mars est le jour du rapport de circonférence. L'histoire du calcul du ratio de circonférence avec python
L'extraction de couleur avec Python + OpenCV a résolu le mystère du fond vert
[python, ruby] sélénium-Obtenez le contenu d'une page Web avec le pilote Web
Je veux sortir le début du mois prochain avec Python
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
L'histoire de la création d'un pilote standard pour db avec python.
Visualisez la fréquence des occurrences de mots dans les phrases avec Word Cloud. [Python]
Résumons le degré de couplage entre les modules avec du code Python
L'idée d'alimenter le fichier de configuration avec un fichier python au lieu de yaml
Astuces: [Python] Calculez la valeur moyenne de la zone spécifiée avec bedgraph
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python