Selenium Handling dropDown с List, если Select класс не работает - PullRequest
0 голосов
/ 24 мая 2018

Я пытался обработать выпадающий список источника https://www.airvistara.com/trip/, но я столкнулся со странной проблемой в приведенном ниже фрагменте кода:

driver.get("https://www.airvistara.com/trip/");    
driver.manage().window().maximize();    
driver.findElement(By.className("location_icon")).click();    
List<WebElement> elements=driver.findElements(By.tagName("div"));

for(int i=0;i<elements.size();i++){
    if(elements.get(i).getAttribute("class").contains("scombobox-list"))
    {
        System.out.println(elements.get(i).getText());
        elements.get(i).click();
        break;
    }
}

Он работает нормально и выбирает элемент, еслиЯ пишу elements.get(i).click(); Но если я поставлю значение i как любое число (меньше elements.size), тогда он не выберет ни один город.

Если я напишу elements.get(4).click();, я не выбираюлюбое значение

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Проблема в том, что DIV с классом scombobox-list не является элементом в раскрывающемся списке, а является раскрывающимся.На странице их больше одного, например, «Происхождение», «Место назначения» и т. Д. Ваш код elements.get(4).click(); пытается щелкнуть 4-й раскрывающийся список , а не 4-й вариант в раскрывающемся списке.Вы можете обойти это, посмотрев дальше вверх по DOM из выпадающего списка, и найдите уникальный элемент, относящийся к Origin, Destination и т. Д. В этом случае есть DIV, который является контейнером для всех связанных с Origin элементов.,

<div class="col-md-3 col-sm-6 widget-div-input scombobox" id="departsfrom-div" placeholder="Origin">

Поскольку у него есть идентификатор, мы можем использовать его в наших локаторах для указания дочерних элементов, не беспокоясь о других возможных совпадениях.Это решит проблему с несколькими существующими выпадающими списками.

Большая часть вашего кода зацикливается и выполняет сопоставление строк, чтобы найти нужный элемент.Вы бы гораздо лучше служили для достижения этого с локаторами.В этом случае вы можете щелкнуть раскрывающийся список, чтобы открыть его, а затем щелкнуть элемент, содержащий нужное название аэропорта, например «Ахмедабад (AMD)»

driver.get("https://www.airvistara.com/trip/");    
driver.manage().window().maximize();    
setOriginAirport("Ahmedabad (AMD)");

, и затем иметь функцию, которая устанавливаетаэропорту происхождения с указанием названия аэропорта.

public void setOriginAirport(string airportName)
{
    driver.findElement(By.cssSelector("#departsfrom-div .location_icon")).click();
    By locator = By.xpath("//div[@id='departsfrom-div']//span[contains(.,'" + airportName + "')]");
    WebElement e = new WebDriverWait(driver, 5).Until(ExpectedConditions.elementToBeClickable(locator));
    Thread.sleep(500); // may need this even after wait
    e.click();
}
0 голосов
/ 24 мая 2018

Вместо вашего кода вы можете попробовать следующий код:

driver.get("https://www.airvistara.com/trip/");    
driver.manage().window().maximize();    
driver.findElement(By.className("location_icon")).click();    
WebElement wbelement=driver.findElement(By.className("scombobox-list"));
List<WebElement> elements = wbelement.findElements(By.className("scombobox-mainspan"));
for(int i=0;i<elements.size();i++){
System.out.println(elements.get(i).getText());
elements.get(i).click();
break;
}

, если вы хотите щелкнуть в любом конкретном месте, вы можете включить, если условие в для цикла

...