我正在尝试处理 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();
没有选择任何值
答案 0 :(得分:1)
问题是,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">
由于它有一个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条件