如果选择类不起作用,Selenium处理带有List的dropDown

时间:2018-05-24 12:51:54

标签: select selenium-webdriver drop-down-menu

我正在尝试处理 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 :(得分:1)

问题是,DIVscombobox-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">

由于它有一个ID,我们可以在我们的定位器中使用它来指定子元素,而不必担心其他可能的匹配。这将解决现有多个下拉列表的问题。

你的大部分代码都在循环并进行字符串匹配以找到你想要的元素。使用定位器可以更好地实现这一目标。在这种情况下,您可以单击下拉列表将其打开,然后单击包含所需机场名称的元素,例如“艾哈迈达巴德(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();
}

答案 1 :(得分:0)

您可以尝试使用以下代码代替您的代码:

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;
}

如果要单击任何特定位置,可以在for循环中包含if条件