Select Selenium Handling下拉列表(如果选择class not working)

Select Selenium Handling下拉列表(如果选择class not working),select,selenium-webdriver,drop-down-menu,Select,Selenium Webdriver,Drop Down Menu,我试图处理源代码的下拉列表,但在下面的代码片段中,我遇到了一个奇怪的问题: driver.get("https://www.airvistara.com/trip/"); driver.manage().window().maximize(); driver.findElement(By.className("location_icon")).click(); List<WebElement> elements=driver.findElements(By.t

我试图处理源代码的下拉列表,但在下面的代码片段中,我遇到了一个奇怪的问题:

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;
    }
}
driver.get(“https://www.airvistara.com/trip/");    
driver.manage().window().maximize();
driver.findElement(按.className(“位置图标”))。单击();
列表元素=driver.findElements(按.tagName(“div”));

对于(int i=0;i而不是您的代码,您可以尝试以下代码:

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;
}
driver.get(“https://www.airvistara.com/trip/");    
driver.manage().window().maximize();
driver.findElement(按.className(“位置图标”))。单击();
WebElement wbelement=driver.findElement(By.className(“scombobox列表”);
List elements=wbeelement.findElements(By.className(“scombobox mainspan”);

对于(int i=0;i而言,问题在于类
scombobox list
DIV
不是下拉列表中的元素,而是下拉列表。页面上有多个元素,例如来源、目的地等。您的代码
元素。获取(4)。单击();
尝试单击第四个下拉列表,而不是下拉列表中的第四个选项。您可以通过从所需的下拉列表中进一步查找DOM来解决此问题,并找到特定于源、目标等的唯一元素。在这种情况下,有一个
DIV
,它是所有源相关元素的容器

<div class="col-md-3 col-sm-6 widget-div-input scombobox" id="departsfrom-div" placeholder="Origin">
然后使用函数设置给定机场名称的始发机场

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

它仍然不适用于元素。get(4)。click();这真的很奇怪,因为i的循环有一个int值,然后还有元素。get(i)。click();可以工作,但是元素。get(4)。click();不起作用谢谢你建议使用定位器的解决方法:),但它在setOriginAirport(“Chandigarh(IXC)”上仍然失败;即使您尝试使用任何airportName文本,该错误元素也不可见。抱歉…我之前无法对其进行测试。我已更新了代码,现在应该可以工作了。我单击了错误的内容,以前没有打开下拉列表。这就是元素不可见的原因。我添加了一个简短的
sleep()
等待后。通常情况下,使用sleeps不是一种好的做法,但如果没有它,则无法正确单击元素。您应该在没有它的机器上尝试,看看它是否工作。
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();
}