Как выбрать вариант из динамического раскрывающегося списка с помощью Selenium?

Я пытаюсь щелкнуть раскрывающееся значение, чтобы выбрать город в поле «Сделать поездку» http://www.makemytrip.com/. Но возникает исключение ссылки на устаревший элемент. Идентификаторы меняются при загрузке страницы. Пробовал код ниже:

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]"))));

person user2377826    schedule 07.07.2018    source источник
comment
Пожалуйста, предоставьте полное исключение, чтобы лучше объяснить, почему это произошло.   -  person murali selenium    schedule 07.07.2018
comment
Спасибо @muraliselenium за ваш ответ, но теперь он решен.   -  person user2377826    schedule 08.07.2018


Ответы (4)


Чтобы щелкнуть раскрывающееся значение, например Мумбаи вы можете использовать следующее решение:

  • Блок кода:

    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();
    
  • Снимок браузера:

from_mumbai

person DebanjanB    schedule 07.07.2018
comment
Спасибо за ответ, просто хотел понять, зачем мне указывать имя класса в xpath в 'From', когда идентификатор From уникален. - person user2377826; 08.07.2018
comment
@ user2377826 Итак, в основном ваш вопрос заключается в том, почему мы использовали xpath, когда присутствует id. Короче говоря, использование имени класса, id, name или имени тега преобразуется в селектор css Java Client по умолчанию. Итак, выбор стоит между использованием css selector или xpath. Поскольку ваши испытания кода были основаны на xpath, поэтому я так и сделал. Вы можете найти подробное обсуждение в официальных стратегиях поиска для webdriver - person DebanjanB; 08.07.2018

Вы можете использовать этот рабочий код:

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();

Я исправил xPath элемента раскрывающегося списка. Всегда пытайтесь указать точный элемент, с которым вы хотите взаимодействовать. Например, если вы хотите нажать на кнопку, попробуйте найти тег <span> или <button>, для тега ссылки <a> и для поля ввода тега <input>.

person Andrei Suvorkov    schedule 07.07.2018

Вы можете попробовать этот код:

Я не вижу использования xpath в этом сценарии. Я преобразовал часть xpath либо в селектор css, либо в id. и сохранил только один. Хотя я не встречал ни одной ссылки на устаревшие элементы.

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();
person cruisepandey    schedule 07.07.2018

Приведенный ниже код отлично работает для меня, и он также параметризован, он работает для любого входного значения без изменения xpath. В этом примере я взял Мумбаи в качестве тестовых данных.

    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();
person Bhargav Marpu    schedule 13.07.2018