[JAVA] Savoir-faire Selenide

Aperçu

Selenide est un test basé sur Junit Ceux qui peuvent utiliser le navigateur et vérifier si la transition d'écran et les données attendues sont affichées

Réglage initial

environnement Langue: JDK 1.8

Description de Maven

Ajout de la description suivante à pom.xml

    <dependencies>
 <! - Omis->
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

4.9: Dernière version de Selenide au 12/03/2018

Pour Spring Boot

Si SpringBoot est installé, la version de la bibliothèque (Selenium) référencée par Selenide est ancienne. Les réglages suivants sont également nécessaires pour utiliser le séléniure.

<détails>

Paramètres supplémentaires </ summary>

    <dependencies>
 <! - Omis->
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-api</artifactId>
          <version>3.8.1</version>
      </dependency>
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-chrome-driver</artifactId>
          <version>3.8.1</version>
      </dependency>
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-firefox-driver</artifactId>
          <version>3.8.1</version>
      </dependency>
      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-remote-driver</artifactId>
          <version>3.8.1</version>
      </dependency>

      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-support</artifactId>
          <version>3.8.1</version>
      </dependency>
    </dependencies>

S'il est supposé fonctionner avec FireFox et Chrome, cela ne fonctionnait qu'avec les paramètres ci-dessus Si vous obtenez d'autres erreurs comme NoClassDefFound ou NoSuchMethod Vérifiez dépendances selenium-api et comparez-le avec la version activée localement.

Préparation du conducteur

Préparation du pilote Chrome

Si le navigateur à démarrer est autre que FireFox, un fichier de pilote (un fichier d'exécution qui reçoit le contenu décrit dans Selenide et exploite le navigateur / acquiert des informations) est requis. Obtenez le fichier qui convient à votre environnement sur Site de téléchargement et placez-le dans un emplacement qui peut être spécifié par Junit.

<détails> <résumé> Solitaire 1 </ résumé> J'ai lu l'article qu'il est inutile après selenide 4.8, mais quand je l'ai exécuté, le téléchargement ne s'est pas produit J'ai préparé le pilote.

Solitaire 2 Si vous déployez le pilote localement, vous devez vérifier si vous disposez de l'autorisation d'exécution pour le fichier cible. Sinon, vous devez définir l'autorisation d'exécution séparément. Soyez prudent lors de la mise en œuvre dans un environnement autre que Windows tel que Docker

Du démarrage du pilote à l'arrêt

Paramètres initiaux du pilote

Suivez les étapes ci-dessous pour configurer le pilote Défini dans la méthode @ Before

Pour Chrome

    @Before
    public void before() {
        Configuration.browser = WebDriverRunner.CHROME;
 //Chromeドライバのパスを設定(ここでは設定ファイルから取得)
        System.setProperty("webdriver.chrome.driver", getClass().getResource(properties.getChromeDriver()).getPath());

        ChromeOptions chromeOptions = new ChromeOptions();
 //HeadLessモード指定
        if (properties.isHeadless()) {
            chromeOptions.addArguments("--headless");
        }
        Map<String, Object> chromePrefs = new HashMap<>();
 //PopUp表示を抑制
        chromePrefs.put("profile.default_content_settings.popups", 0);
 //ダウンロードフォルダ指定(テストメソッドごとに格納パスを切り替える等任意で設定)
        chromePrefs.put("download.default_directory", "/User/Temp/result/DownloadFile");
 //ダウンロード先指定ダイアログ表示抑制
        chromePrefs.put("download.prompt_for_download", false);
        chromeOptions.setExperimentalOption("prefs", chromePrefs);
        driver = new ChromeDriver(chromeOptions);

 //WebDriverRunnerにDriverを指定
        WebDriverRunner.setWebDriver(driver);
        
        Configuration.fastSetValue = true;
 //スクリーンショットの設定ディレクトリ設定
        Configuration.reportsFolder = "/User/Temp/result/ScreenShot"; 
    }  

Chaque spécification est décrite ci-dessous.

Spécification du mode sans tête

Si vous spécifiez ce qui suit, vous pouvez démarrer Chrome en mode sans tête et le vérifier avec un navigateur. En faisant cette spécification, la vérification automatique peut être effectuée même dans un environnement sans interface utilisateur.

            chromeOptions.addArguments("--headless");

Spécification du chemin de téléchargement du fichier

Les deux lignes suivantes spécifient le répertoire lors du téléchargement du fichier Supprime l'affichage de la boîte de dialogue lors du téléchargement.

 //ダウンロードフォルダ指定(テストメソッドごとに格納パスを切り替える等任意で設定)
        chromePrefs.put("download.default_directory", "/User/Temp/result/DownloadFile");
 //ダウンロード先指定ダイアログ表示抑制
        chromePrefs.put("download.prompt_for_download", false);

Cela sera reflété dans la partie suivante de l'écran des paramètres de Chrome Chrome設定.JPG

Destination de sauvegarde de la capture d'écran

Spécifiez la destination d'enregistrement de la capture d'écran ci-dessous (Voir les captures d'écran plus tard)

 //スクリーンショットの設定ディレクトリ設定
        Configuration.reportsFolder = "/User/Temp/result/ScreenShot";

Spécification d'entrée de caractères

En spécifiant ce qui suit, lors de la saisie de caractères dans la balise d'entrée, Spécifiez les caractères spécifiés à la fois (Si vous ne spécifiez pas ce qui suit, chaque caractère sera saisi à l'écran.)

        Configuration.fastSetValue = true;

Pilote terminé

Il est exécuté dans la méthode @ After. Quittez le pilote avec la méthode suivante

    @After
    public void after() {
        driver.close();
    }

tester

Exécuté dans la méthode de @ Test (similaire à Junit normal) Tout d'abord, comme un flux brutal

  1. Démarrez l'URL spécifiée avec Selenide # open (String, Class)
  2. Récupérez l'élément de page lancé et vérifiez si l'élément attendu est affiché
  3. Cliquez sur le bouton etc. pour vérifier si la transition est comme prévu ou si elle se comporte comme prévu Vous pouvez vérifier plusieurs écrans en répétant "2-3".

Écran de démarrage en spécifiant l'URL

Ouvrez la page spécifiée comme suit

ItemsPageObject itemsPage = Selenide.open("http://localhost:8080/items", ItemsPageObject.class);

À propos de PageObject

La classe (Object) qui est le deuxième argument et la valeur de retour est appelée «PageObject». Obtenir et utiliser les éléments Selenide dans cet objet PageObject Il est recommandé de juger du résultat de l'acquisition et d'utiliser l'écran via PageObject dans la méthode de test.

    @Test
    public void testItemList() throws Exception {
        ItemspageObject itemsPage = Selenide.open("/items", ItemspageObject.class);
        List<String> ret = itemsPage.getItemNames();
        assertEquals("ItemCount", 2, ret.size());
    }

Dans l'exemple ci-dessus, récupérez l'élément HTML dans ʻItemspageObject # getItemNames () ` La confirmation du contenu acquis est effectuée dans la méthode d'essai

Obtenir l'élément

Récupérez l'élément en décrivant la méthode get dans l'objet Page (classe)

Méthode d'acquisition élémentaire de base

Vous pouvez obtenir l'élément cible en utilisant Selenide # $ (String) Après cela, je décrirai une page aussi simple à titre d'exemple

<table>
 <tr>
   <th>Header1</th>
 </tr>
 <tr>
   <td>Data1</td>
 </tr>
 <tr>
   <td>Data1</td>
 </tr>
</table>

Vous pouvez obtenir l'intégralité de la balise <table> `en la récupérant comme suit

public SelenideElement getTable(){
   return Selenide.$("table");
}

Si vous souhaitez obtenir plus d'éléments enfants, vous pouvez les obtenir comme suit

public ElementsCollection getTableRows(){
 //Tableの要素を取得
   SelenideElement table = Selenide.$("table");
 //子要素の一覧を取得
   return table.$$("tr");
}

Vous pouvez rechercher un élément avec la chaîne de caractères spécifiée par SelenideElement Selenide # $ (String) et obtenir le premier élément obtenu.

ʻElementsCollection Selenide # $$ (String) Recherche un élément avec la chaîne de caractères spécifiée, et peut être obtenu à partir de la liste d'éléments qui a été obtenue en premier. Puisque ʻElementsCollection est une classe héritée de ʻAbstarctList `, il est possible de vérifier le nombre d'éléments acquis et de vérifier le contenu de List (détails omis).

Méthode d'acquisition d'élément (définie dans le champ PageObject)

Vous pouvez injecter des éléments en décrivant comment obtenir le champ PageObject dans @ FindBy comme indiqué ci-dessous.

public class ItemspageObject extends SelenideBasePageObject {

    @FindBy(how = How.TAG_NAME, using = "table")
    private SelenideElement table;


    @FindBy(how = How.TAG_NAME, using = "tr")
    private ElementsCollection rows;

Dans le cas ci-dessus, lors de la création d'une instance de ʻItemspageObject, récupérez l'élément de la page de démarrage avec la balise name = "table" et définissez la valeur. Si vous voulez obtenir les éléments enfants de la table ci-dessus, vous pouvez spécifier votre propre classe au lieu de SelenideElement`.

public class ItemspageObject extends SelenideBasePageObject {

    @FindBy(how = How.TAG_NAME, using = "table")
    private OriginalTable table;

ʻOriginalTable est créé en héritant de ʻElementsContainer comme suit

public class OriginalTable extends ElementsContainer {
    @FindBy(how = How.TAG_NAME,using = "tr")
    private List<TableRow> tableRows;

Si vous souhaitez injecter plusieurs éléments et que vous souhaitez spécifier votre propre classe, déclarez-la comme List <T> T doit être une classe qui hérite de ʻElementsContainer`

public class TableRow extends ElementsContainer {
    /**
     * TableHeader
     */
    @FindBy(how = How.TAG_NAME, using = "th")
    private ElementsCollection headers;

Manipuler des éléments

Je vais vous expliquer le fonctionnement de l'élément acquis

Obtenez de la valeur

Pour obtenir la valeur incluse dans la balise de l'élément spécifié Utilisez String SelenideElement # getText ()

   <th>Header1</th>

Si vous l'exécutez pour Elemet correspondant à la balise "th" ci-dessus, vous pouvez obtenir la chaîne de caractères "Header1".

Obtenir la valeur d'attribut

Utilisez String SelenideElement # getAttribute (String) pour obtenir la valeur d'attribut de l'élément spécifié.

<a href="/users">Data2</a>

Si vous voulez obtenir l'attribut "href" ci-dessus, obtenez-le comme suit.

SelenideElement aTag;
 //中略
String hrefStr = aTag.getAttribute("href");

point important Dans le cas de l'attribut href, la valeur à récupérer est la suivante http: // loalhost: 8080 / users (renvoie le chemin absolu interprété au lieu du chemin relatif)

Définir une valeur pour un élément

Paramètre de chaîne de caractères

Spécifiez une chaîne de caractères pour les éléments d'entrée de chaîne de caractères suivants

<a>Input:<input type="text" name="NAME"></a>

Implémenté à l'aide de SelenideElemnt # setValue (String)

 //InputTagに文字列を設定
inputTag.setValue("aaaaa");
 //設定した文字列は"SelenideElemnt#getValue()"で取得できる
assertEquals("InputTagValue", "aaaaa", inputTag.getValue());

Spécification du fichier

Spécifiez le chemin d'accès au fichier pour les éléments de sélection de fichier suivants

<a>FileUp:<input type="file" name="FILE"></a>
 //InputTagにファイルパスを設定
fileUpTag.uploadFile(new File("/User/Text.txt"));

Le fichier n'est pas réellement téléchargé lorsque le processus ci-dessus est exécuté, seul le chemin du fichier est défini dans l'élément. (Le téléchargement est effectué uniquement après le traitement de la soumission)

Paramètre de valeur pour les éléments masqués

Si vous souhaitez définir une valeur pour un élément avec type = 'hidden', vous obtiendrez une erreur en utilisantSelenideElemnt # setValue (String). Par conséquent, définissez la valeur via JavaScript.

<input type='hidden' name='hiddenItem' value='HiddenValue' />

Pour définir une valeur pour l'élément 'article caché' dans l'exemple ci-dessus, vous pouvez définir la valeur en écrivant comme suit.

 Valeur de chaîne = "valeur de réglage"
((JavascriptExecutor) webDriver).executeScript("document.getElementsByName('hiddenItem').item(0).value = '" + value + "';");

Les WebDrivers pour IE / FireFox / Chrome héritent tous deux de RemoteWebDriver et Puisque RemoteWebDriver implémente JavascriptExecutor, il peut être géré par un navigateur général.

Téléchargement de fichier

Processus de téléchargement fourni par Selenide

Utilisez File SelenideElemnt # download () pour obtenir le fichier référencé par l'attribut href. Il n'est pas possible de gérer un traitement qui inclut un traitement intermédiaire tel qu'une opération avec JavaScript

Processus de téléchargement qui semble nécessaire

Après avoir cliqué sur un bouton ou un lien, vérifiez le dossier de téléchargement (spécifié dans les paramètres dans [Destination du lien](#Specify file download path)) et acquérez le fichier nouvellement créé en tant que fichier de téléchargement.

Les notes suivantes

  1. Conservez le nombre de fichiers dans le dossier spécifié avant de cliquer (voir [Lien](#Listener Settings))
  2. Lorsque le processus de téléchargement est exécuté, le contenu du dossier changera dans l'ordre suivant, il est donc nécessaire de détecter enfin la fin du téléchargement du fichier et d'examiner le fichier.
  3. Aucune augmentation de fichier (téléchargement non démarré)
  4. L'extension du fichier créé est «.tmp» (état de téléchargement par Chrome-1)
  5. L'extension du fichier créé est .crdownload (Téléchargement par Chrome-2)
  6. Le nom du fichier créé devient un nom normal (téléchargement terminé)

Vous pouvez l'obtenir en effectuant les jugements 1-4 ci-dessus avec les sources suivantes

    /**
 * Obtenez le dernier fichier de téléchargement
     *
 * @return Dernier fichier téléchargé
     */
    public File getLatestDownloadFile() {
        final File downloadDir = new File(getFileDownloadPath());
        
 //ダウンロード完了まで10秒待機
        WebDriverWait waitForUpload = new WebDriverWait(driver, 10);

        waitForUpload.until(new ExpectedCondition<Boolean>() {
 //ここの判定処理は、デフォルトで500ミリ秒ごとに実施
            public Boolean apply(WebDriver _driver) {
 //ファイル名からダウンロード中か否かを判定
                return isDownloadFinish(getLatestFile(downloadDir));
            }
        });

 //最新ファイルを取得
        File retFile = getLatestFile(downloadDir);
 //最新ファイルが取得できたら対象のファイルを返却
        if (isDownloadFinish(retFile)) {
            return retFile;
        }
 //出来なかったらNull返却
        return null;
    }

    /**
 * Déterminez si le téléchargement est en cours
     *
 * Fichier cible @param target
 * @return Si le téléchargement est terminé
     */
    private static boolean isDownloadFinish(File target) {
        return target != null && !target.getName().endsWith(".crdownload") && !target.getName().endsWith(".tmp");
    }

    /**
 * Obtenez le dernier fichier
     *
 * @param targetDir Répertoire de téléchargement
 * @return Dernier fichier téléchargé
     */
    private File getLatestFile(File targetDir) {
        File[] downLoaededFiles = targetDir.listFiles();
        
 //クリック前に保持したファイル数と変わっていなかったらNullを返却
         if (downLoaededFiles == null || downLoaededFiles.length == resultFileCount) {
            return null;
        }

 //ファイルの更新時間で比較し、最新のファイルを返却
        Arrays.sort(downLoaededFiles, new Comparator<File>() {
            @Override
            public int compare(File file1, File file2) {
                return file1.lastModified() <= file2.lastModified() ? 1 : -1;
            }
        });

        return downLoaededFiles[0];
    }

Paramètres d'écoute

En spécifiant un écouteur (classe d'implémentation WebDriverEventListener) pour WebDriverRunner comme indiqué ci-dessous, le traitement peut être exécuté au moment où vous cliquez.

       WebDriverRunner.addListener(new WebDriverListenerImpl());

La classe d'implémentation de WebDriverEventListener est implémentée comme ceci (maintenez le nombre de fichiers dans le dossier spécifié avant de cliquer)

/**
 * Classe d'implémentation de WebDriverEventListener
 */
public class WebDriverListenerImpl implements WebDriverEventListener {

 //その他のメソッド群は省略

    @Override
    public void beforeClickOn(WebElement webElement, WebDriver webDriver) {
 //クリック前に実績フォルダ配下のファイル数を取得する
        baseClass.setResultFileCount(new File(" "/User/Temp/result/DownloadFile"").listFiles().length);
    }
}