web-dev-qa-db-fra.com

Comment sélectionner une option dans un menu déroulant dynamique avec Selenium?

J'essaie de cliquer sur la valeur de liste déroulante pour sélectionner la ville dans le champ Make my trip http://www.makemytrip.com/ . Mais obtenir l'exception de référence d'élément Stale. Les identifiants sont modifiés au chargement de la page. Essayé ci-dessous code:

driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).clear();
driver.findElement(By.xpath(".//*[@id='ui-id-1']"));
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).click();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeSelected(driver.findElement(By.xpath(".//*[@class='ui-menu-item'][2]"))));
3
user2377826

Pour cliquer sur une valeur de liste déroulante, par exemple Mumbai, vous pouvez utiliser la solution suivante:

  • Bloc de code:

    driver.get("https://www.makemytrip.com/")
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@class='input_fromto checkSpecialCharacters ui-autocomplete-input' and @id='hp-widget__sfrom']"))).click();
    List<WebElement> myList = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//li[@class='ui-menu-item'][starts-with(@id,'ui-id-')]//span[@class='autoCompleteItem__label']")));
    for (WebElement element:myList)
        if(element.getText().contains("Mumbai"));
            element.click();
    
  • Instantané du navigateur:

 from_mumbai

0
DebanjanB

Vous pouvez utiliser ce code de travail:

WebDriver driver = new ChromeDriver();
driver.get("https://www.makemytrip.com/");

driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).clear();
driver.findElement(By.xpath(".//*[@id='hp-widget__sfrom']")).click();
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@class='ui-menu-item'][2]/div/p[1]/span[1]"))).click();

J'ai corrigé l'élément xPath de la liste déroulante. Essayez toujours de spécifier l'élément exact avec lequel vous voulez interagir. Par exemple, si vous souhaitez cliquer sur le bouton, essayez de trouver la balise <span> ou <button>, pour une balise link <a> et pour les champs de saisie balise <input>.

0
Andrei Suvorkov

Le code ci-dessous fonctionne bien pour moi et il est également paramétré, cela fonctionne pour n'importe quelle valeur d'entrée sans changer le xpath. Dans cet exemple, j'ai pris mumbai en tant que données de test.

    driver.get("https://www.makemytrip.com/");
    driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);
    driver.findElement(By.xpath("//input[contains(@id,'hp-widget__sfrom')]")).clear();
    driver.findElement(By.xpath("//input[contains(@id,'hp-widget__sfrom')]")).click();
    driver.findElement(By.xpath("//input[contains(@id,'hp-widget__sfrom')]")).sendKeys("Mumbai");
    Thread.sleep(2000);
    WebDriverWait wait = new WebDriverWait(driver, 30);
    By option = By.xpath("//div[@class='autoCompleteItem']/p/span[contains(text(),'Mumbai')]");
    wait.until(ExpectedConditions.elementToBeClickable(option));
    driver.findElement(option).click();
0
Bhargav Marpu

Vous pouvez essayer ce code: 

Je ne vois aucune utilisation de xpath dans ce scénario. J'ai converti une partie du xpath en sélecteur ou identifiant css. et n'en ont gardé qu'un. Bien que je n'ai pas fait face à une référence d'éléments périmés.

System.setProperty("webdriver.chrome.driver", "D:\\Automation\\chromedriver.exe");
        driver  = new ChromeDriver();
        driver.manage().window().maximize();
        WebDriverWait wait = new WebDriverWait(driver, 30);
        driver.get("https://www.makemytrip.com/");
        WebElement from =  wait.until(ExpectedConditions.elementToBeClickable(By.id("hp-widget__sfrom")));
        from.click();
        from.clear();
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("ul[class*='ui-widget-content hp-widget__sfrom']")));
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[contains(@aria-label,'Top Cities : Mumbai, India ')]"))).click();
0
cruisepandey