1
votes

Sélection de la valeur déroulante sans ID à l'aide de Selenium

Ci-dessous le code HTML pour la liste déroulante:

Select dropDown = new Select(driver.findElement(By.xpath("//*[@id=\"PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType\"]")));
dropDown.selectByVisibleText("Expedited");

J'ai essayé de sélectionner les valeurs de la liste déroulante avec:

Select dropDown = new Select(driver.findElement(By.xpath("//*[@id=\"PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType\"]")));
dropDown.selectByValue("8");

Erreur ci-dessous:

Exception dans le thread "main" org.openqa.selenium.NoSuchElementException: Impossible de localiser l'option avec la valeur: 8

<select name="PWCMasterPage$PWCWebPartManager$gwpTemplateFr1$TemplateFr1$drpProductType" id="PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType" tabindex="2" class="PWCDropDownList" profiledatamember="" profileid="TEMPLATE" onblur="this.Holder = GetControlHolder(this);" onchange="this.Holder = GetControlHolder(this);" onfocus="this.Holder = GetControlHolder(this);" data-val-subtype-type="none" controlscollectionname="TemplateFr1_drpProductType" data-configid="TemplateFr1_drpProductType" holdername="TemplateFr1Holder">
<option value=""></option>
<option value="7">Expedited</option>
<option value="8">Premier</option>
<option value="9">Value</option>
</select>

Ce qui a entraîné l'erreur ci-dessous:

Exception dans le thread "main" org.openqa.selenium.NoSuchElementException: Impossible de localiser l'élément avec du texte: accéléré

J'ai essayé en alternance avec selectByVisibleText et selectByIndex, ce qui a entraîné des erreurs similaires.


7 commentaires

Pouvez-vous vérifier si une iframe est présente sur la page?


@Sameer Comment puis-je vérifier cela?


Inspectez cet élément et dans la source de la page html, vérifiez au-dessus de cet élément si une balise html iframe est présente n'importe où au-dessus.


@Sree Veuillez lire pourquoi une capture d'écran HTML ou code ou erreur est un mauvais idée . Envisagez de mettre à jour la question avec du texte formaté basé sur du code HTML pertinent, des essais de code et une trace de pile d'erreurs. Sameer Arora


@SameerArora J'ai vérifié qu'il n'y a pas d'iframe présente.


Je viens de publier une réponse, mais elle est basée sur des informations que vous n'avez pas divulguées - pouvez-vous s'il vous plaît partager les versions que vous utilisez? (navigateur, pilote et sélénium) - si cela aide, le code a l'air bien!


J'utilise le navigateur Chrome.


3 Réponses :


0
votes

essayez la solution ci-dessous avec WebDriverWait pour éviter les problèmes de synchronisation:

    WebDriverWait wait = new WebDriverWait(driver,30);
    WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("PWCDropDownList")));
    Select drpCountry = new Select(element);
    drpCountry.selectByValue("8");


5 commentaires

J'ai déjà fait cela, cela n'a pas fonctionné. Une erreur similaire a été signalée: exception dans le thread "main" org.openqa.selenium.NoSuchElementException: impossible de localiser l'option avec la valeur: 8


pouvez-vous s'il vous plaît partager votre URL? et vérifiez également si votre élément n'est pas présent dans iframe si c'est le cas, vous devez passer à iframe avant de gérer votre élément ddrop down


C'est une URL interne


La méthode visibilitéOfElementLocated (By) dans le type ExpectedConditions n'est pas applicable pour les arguments (Select)


Laissez-nous continuer cette discussion dans le chat .



2
votes

Utilisez-vous safari?

Si tel est le cas, il existe des problèmes connus avec Webdriver et safari. Le long et court est d'utiliser le pilote fourni par Apple.

Voici le problème du sélénium: https://github.com/SeleniumHQ/selenium/issues / 3145

Si vous regardez: https://webkit.org/blog/6900/webdriver-support -en-safari-10 /

Ils disent:

"Le pilote de Safari peut être lancé via / usr / bin / safaridriver exécutable, et la plupart des bibliothèques clientes fournies par Selenium lancez automatiquement le pilote de cette façon sans plus configuration. "


7 commentaires

J'utilise chrome


tant pis alors :-) vous n'avez pas dit quel navigateur donc c'était une supposition. Pouvez-vous partager vos versions s'il vous plaît?


Chrome Version 83.0.4103.116, Selenium Standalone Server: selenium-server-standalone-3.141.59.jar chromedriver_win32


que diriez-vous de la version chromedriver? -et, utilisez-vous l'alpha du sélénium4? ou utilisez-vous du sélénium 3?


Y a-t-il une commande avec laquelle je peux le savoir, si je regarde le fichier téléchargé, je ne suis pas sûr


Cela signifie-t-il que vous n'utilisez pas maven ou gradle comme gestionnaire de dépendances? - de toute façon, lorsque vous avez téléchargé les bibliothèques, vous auriez téléchargé une version correspondant à votre chrome ....


continuons cette discussion dans le chat .



2
votes

Le problème n'est pas le code java que vous avez fourni ou la source HTML.

J'ai créé une page Web simple avec votre html:

 public void approach3_Javascript()
    {
        var dropdown = driver.findElement(dropdownIdentifier);
        ((JavascriptExecutor) driver).executeScript("arguments[0].value='8'", dropdown);
    }

J'ai créé un simple classe de test - et cela fonctionne très bien! Coller le lot pour que vous puissiez voir que je ne fais rien d'autre que d'ouvrir la page, d'utiliser votre code et de sélectionner l'élément.

public void approach2_Clicks()
    {
        driver.findElement(dropdownIdentifier ).click(); // to activate
        driver.findElement(dropdownIdentifier ).findElement(By.xpath("//*[@value='8']")).click();
    }

À mon avis, le problème n'est pas le sélénium, le problème n'est pas le xpath, tant que vous faites ce que @ SeleniumUser002 dit dans sa réponse, le problème n'est pas l'accessibilité des objets.

Pensez à:

  • Que fait votre site de spécial?
  • Fait-il quelque chose basé sur un script qui crée / remplit cette liste déroulante au moment de l'exécution?
  • Lorsque vous avez capturé le code HTML, l'avez-vous capturé manuellement à partir de chrome ou de chromedriver lors de l'exécution? (essayez ce dernier si vous ne l'avez pas déjà fait - L'exécution manuelle est ce qu'un utilisateur voit, mais chromedriver est ce que voit le sélénium. Veillez à ne pas cliquer sur autre chose que l'objet lors de l'inspection afin de ne pas fausser les résultats)
  • Effectuez-vous d'autres étapes du script susceptibles d'influencer cette liste déroulante?

La première chose que je dirais pour vraiment résoudre ce problème est d'utiliser un point d'arrêt avant votre ligne brisée et de suivre lentement les actions qui mènent au problème. Vérifiez si la page se comporte différemment lors de l'exécution. Marcher lentement supprime également les problèmes de synchronisation et une fois que le code fonctionne une fois, s'il redevient floconneux, vous pouvez écarter le code et vous concentrer sur une meilleure stratégie d'attente.

Si cela ne fonctionne pas et que vous vous voyez TOUJOURS toutes les options présentes mais ne pouvez pas sélectionner, faites un vidage de ce que le sélénium peut voir:

private By dropdownIdentifier = By.xpath("//*[@id=\"PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType\"]");
    

Cela pourrait vous aider à comprendre ce qui se passe pour résoudre le problème. Sans ces informations de débogage, personne ne peut vous dire quel est le problème - mais je peux suggérer des solutions!

Essayez ces ...

Configurez ceci:

@Test
public void debug_WhatAreMyOptions()
    {
        Select dropDown = new Select(driver.findElement(dropdownIdentifier));
        System.out.println("dropdown has "+ dropDown.getOptions().size()+" options");

        System.out.println("the options are....");
        for (var dropdownOptions : dropDown.getOptions()) {
            System.out.println(dropdownOptions.getText());
        }

    }

Ensuite, essayez les clics à l'ancienne sans objet de sélection:

public class StackTest {

    private String baseUrl = "C:\\Git\\stackTest.html";
    private WebDriver driver;

    @Before
    public void CreateWebDriver()
    {
        System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.get(baseUrl);
    }

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

    @Test
    public void approach1_ExistingCode()
    {
        Select dropDown = new Select(driver.findElement(By.xpath("//*[@id=\"PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType\"]")));
        dropDown.selectByValue("8");
    }
}

Ou essayez notre vieil ami javascript:

<html><body>
<select name="PWCMasterPage$PWCWebPartManager$gwpTemplateFr1$TemplateFr1$drpProductType" id="PWCMasterPage_PWCWebPartManager_gwpTemplateFr1_TemplateFr1_drpProductType" tabindex="2" class="PWCDropDownList" profiledatamember="" profileid="TEMPLATE" onblur="this.Holder = GetControlHolder(this);" onchange="this.Holder = GetControlHolder(this);" onfocus="this.Holder = GetControlHolder(this);" data-val-subtype-type="none" controlscollectionname="TemplateFr1_drpProductType" data-configid="TemplateFr1_drpProductType" holdername="TemplateFr1Holder">
    <option value=""></option>
    <option value="7">Expedited</option>
    <option value="8">Premier</option>
    <option value="9">Value</option>
</select>
</body></html>


8 commentaires

oui vous aviez raison, la liste déroulante est liée au moment de l'exécution seulement après avoir cliqué sur la liste déroulante


Mon instinct a rarement tort! :-) - Donc, l'une des options ci-dessus est de cliquer d'abord sur l'objet. Cliquez dessus, puis ajoutez probablement une attente jusqu'à ce qu'il soit rempli. mais si cette réponse fonctionne pour vous, marquez-la comme correcte afin que d'autres personnes puissent apprendre alors le travail est terminé


vous parlez de approach2_Clicks (), est-ce correct?


Salut Sree - essayez-les tous. Vous avez maintenant à la racine du problème (la liste ne se remplit pas avant un clic), même votre code d'origine peut fonctionner. Vous devez effectuer cette action pour remplir la liste avant de sélectionner. vous pourriez d'abord approcher2 fonctionnera, mais vous devrez peut-être également y mettre une attente en fonction de la façon dont les données sont chargées et du temps que cela prend ... la meilleure chose à faire est de l'essayer et de voir.


driver.findElement (liste déroulante) .click (); // pour activer Erreur: La méthode findElement (By) dans le type WebDriver n'est pas applicable pour les arguments (Select)


@Sree - cela fonctionne pour moi dans la source html que vous avez fournie .. Avez-vous défini private By dropdownIdentifier = By.xpath ("// * [@ id = \" PWCMasterPage_PWCWebPartManager_gwpTempl‌ ateFr1_TemplateFr1_d‌ rpProductType \ "]"); dans la même classe?


continuons cette discussion dans le chat .


Je le vois maintenant - j'ai renommé la variable après avoir ajouté des bits ici - c'est driver.findElement (dropdownIdentifier) ​​... etc ... faire correspondre cet identifiant que j'ai posté juste avant - j'ai mis à jour le message d'origine