1
votes

Problème en cliquant sur chaque élément et en effectuant une action

J'ai une table Web qui comporte plusieurs lignes. Je veux créer une boucle telle qu'elle traverse toutes les lignes de ce tableau et cliquer sur les éléments de la colonne 1 de la première ligne, puis vérifier à l'intérieur qu'un bouton Modifier existe ou non. Revenez ensuite et cliquez sur l'élément suivant et cochez le bouton Modifier. Puis revenez et répétez jusqu'à ce que toutes les lignes soient traversées.

Mais dans le code actuel implémenté par moi, il ne fait que traverser la première ligne puis sortir. Quelqu'un pourrait-il m'aider avec la même chose.

    viewDiscussionScope(driver, scope);
    WebElement paginationLabel = WaitUtils.waitForElement(driver, By.cssSelector(".v-csslayout-cvr-c-pagination__header"));
    if(paginationLabel.isDisplayed())
    {
        WebElement table = WaitUtils.waitForElement(driver, By.cssSelector("table.eds-o-table.cvr-c-table--list tbody"));
        List<WebElement> rows = table.findElements(By.cssSelector("tr.eds-o-table__row"));
        for(WebElement row: rows)
            {
                List<WebElement> tableCols = row.findElements(By.cssSelector("td.eds-o-table__cell:nth-of-type(1)"));
                for(WebElement col : tableCols)
                {
                    col.findElement(By.cssSelector(".v-label-eds-c-text--bold")).click();
                    WebElement messageField = WaitUtils.waitForElement(driver, By.cssSelector(".eds-o-media__body-eds-o-media__body--top .v-label-eds-u-flexitext.v-label-undef-w:nth-of-type(1)"));
                    String messageText = messageField.getText();
                    boolean editLabel = (driver.findElement(By.cssSelector(".eds-c-button-set-eds-c-button-set--align-right .v-button-eds-s-is-first")).getText()).equals("Edit");
                    if(!(editLabel))
                    {
                        LOG.info(messageText+" is not editable by the logged in user");                         
                    }
                    else
                    {
                        LOG.info(messageText+" is editable by the logged in user");                         
                    }
                    break;
                }
                break;
            }           
    }
}


1 commentaires

Cela ressemble à un problème X-Y . Au lieu de demander de l'aide pour résoudre le problème, modifiez votre question et posez des questions sur le problème réel. Qu'essayez-vous de faire?


4 Réponses :


0
votes

Supprimez l'instruction break de votre boucle parent for !

for(WebElement row: rows)
{
            List<WebElement> tableCols = row.findElements(By.cssSelector("td.eds-o-table__cell:nth-of-type(1)"));
            for(WebElement col : tableCols)
            {
               // your code
            }

          // REMOVE => break;
        }           
}


2 commentaires

Essayez d'imprimer à l'intérieur de la boucle parente pour vérifier si toutes vos lignes sont traversées?


ou vérifiez la taille de tableCols.size () après avoir trouvé à partir de la ligne. Je pense que vos findElements de la ligne ne vous donnent aucune colonne pour cette ligne. Vos sélecteurs ne sont pas corrects.



0
votes

Vous avez 2 break qui doivent être supprimés et vous n'avez pas besoin de parcourir le td si vous voulez cliquer seulement d'abord sur td code>

if (paginationLabel.isDisplayed())
{
    WebElement table = WaitUtils.waitForElement(driver, By.cssSelector("table.eds-o-table.cvr-c-table--list tbody"));
    List<WebElement> rows = table.findElements(By.cssSelector("tr.eds-o-table__row"));
    for (WebElement row :  rows)
    {
        // get first td
        WebElement tableCol = row.findElement(By.cssSelector("td.eds-o-table__cell:nth-of-type(1)"));
        tableCol.findElement(By.cssSelector(".v-label-eds-c-text--bold")).click();
        WebElement messageField = WaitUtils.waitForElement(driver, By.cssSelector(".eds-o-media__body-eds-o-media__body--top .v-label-eds-u-flexitext.v-label-undef-w:nth-of-type(1)"));
        String messageText = messageField.getText();
        boolean editLabel = (driver.findElement(By.cssSelector(".eds-c-button-set-eds-c-button-set--align-right .v-button-eds-s-is-first")).getText()).equals("Edit");
        if (!(editLabel))
        {
            LOG.info(messageText + " is not editable by the logged in user");
        }
        else
        {
            LOG.info(messageText + " is editable by the logged in user");
        }
    }
}


0 commentaires

0
votes

Vous devez d'abord trouver où se trouve le bouton d'édition dans la table, vous pouvez trouver son xpath, fait de tous les boutons d'édition ayant le même xpath si oui, votre problème sera résolu dans il vous suffit de trouver par la méthode findElements () et de stocker dans List et pour obtenir la valeur des boutons d'édition ou pour vérifier si est disponible ou non, vous pouvez appeler la méthode .get () qui obtiendra tous les boutons respectés du même xpath et en spécifiant l'index comme .get (0) ,. get (1 ) ou passez-le en boucle, vous obtenez sa valeur par la méthode .getText () et vérifiez ou effectuez des actions sur cela


0 commentaires

0
votes

Si vous pouviez fournir le DOM de la table sur laquelle vous essayez de travailler, je peux mieux vous aider.

Si j'ai bien compris votre problème voici la solution, aussi, je vous conseille fortement d'utiliser des méthodes pour les petites tâches, ce qui vous aidera sur le long terme. De plus, les sélecteurs ont besoin d'un meilleur enveloppement, ainsi que l'attente explicite a besoin d'un wrapper avec ses propres méthodes.

essayez ceci:

 if (paginationLabel.isDisplayed())
{
    WebElement table = WaitUtils.waitForElement(driver, By.cssSelector("table.eds-o-table.cvr-c-table--list tbody"));
    List<WebElement> rows = table.findElements(By.cssSelector("tr.eds-o-table__row"));
    for (int i=1; i<=rows.size; i++)
    {

        // get first td

       clickColumn(int i);
       getMessageText(int i);
        boolean editLabel = (driver.findElement(By.cssSelector(".eds-c-button-set-eds-c-button-set--align-right .v-button-eds-s-is-first")).getText()).equals("Edit");
        if (!(editLabel))
        {
            LOG.info(messageText + " is not editable by the logged in user");
        }
        else
        {
            LOG.info(messageText + " is editable by the logged in user");
        }
    }
}

private clickColumn(int position) {
 WebElement tableCol = row.findElement(By.cssSelector("td.eds-o-table__cell:nth-of-type(" + position + ")"));
            tableCol.findElement(By.cssSelector(".v-label-eds-c-text--bold")).click();
}

private getMessageText(int position) {
WebElement messageField = WaitUtils.waitForElement(driver, By.cssSelector(".eds-o-media__body-eds-o-media__body--top .v-label-eds-u-flexitext.v-label-undef-w:nth-of-type(" + position + ")"));
            String messageText = messageField.getText();
}


0 commentaires