如何显示自动下拉列表中的所有值

问题描述:

如何使用硒标记驱动程序在使用<div>标记开发时在自动下拉列表中显示所有值。如何显示自动下拉列表中的所有值

我的代码

driver.get("https://www.yatra.com/");// URl of yatra 
String origin ="(//input[@name='flight_origin_city'])[1]";// text box for entering origin 
driver.findElement(By.xpath(origin)).sendKeys("Bangalore"); 
String destination = "(//input[@name='flight_destination_city'])[1]";// text for entering destination 
driver.findElement(By.xpath(destination)).sendKeys("M"); 
List<WebElement> lists= driver.findElements(By.xpath("(//div[@class='viewport'])[2]")); // this is the div where all the values are present. 

for (int i=0; i<lists.size();++i){ 
    System.out.println(lists.get(i).getText());// getting the text for all the values. 
} 

xpath"(//div[@class='viewport'])[2]"为您提供了一个单一的元素,就不一一列举。这也不是存储选项的地方,它是存储它们的容器的父级。尝试

List<WebElement> lists= driver.findElements(By.xpath("(//div[@class='overview'])[3]//li")); 

您的情况有点困难,但这就是值得探索的原因。这里的问题的逐步的解剖:

桌面通知对话框

首先,当我试图在Chrome运行测试中,“你要允许桌面通知吗?”对话框干扰了测试(它在第二个sendKeys之后弹出了一段时间,这就是为什么文本框失去了重点,并且其中一个条目被接受了,因此无法找到其他建议)。

我工作围绕,使用这个技巧:Disable Chrome notifications (Selenium)

找到合适的容器

您可以通过标识可以找到的建议容器为By.xpath("(//div[@class='viewport'])[2]")了很远了。但是,从那里开始,您需要更加专门针对正确的儿童元素。同样,因为这是动态内容,建议使用明确的等待语句来确保在元素加载时间较长时,测试不会过早失败。

我改变了你的测试,以便它看起来像元素的子元素元素viewport类。这些元素有孩子,相应地对城市,机场和国名进行格式化。要获得这些文本,您必须深入了解DOM结构。这里的解决方案是:

WebElement list = new WebDriverWait(driver, 2000).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(//div[@class='viewport'])[2]"))); 

List<WebElement> elements = list.findElements(By.tagName("li")); 

for (WebElement element : elements) {  
     String city = element.findElement(By.className("ac_cityname")).getText(); 
     String airport = element.findElement(By.className("ac_airportname")).getText(); 
     String country = element.findElement(By.className("ac_country")).getText(); 

     System.out.println(city + " " + airport + " (" + country + ")"); 
} 

到目前为止,这么好。但是请注意,该解决方案为您提供了followiing输出:

Mumbai (BOM) Chatrapati Shivaji (India) 
Madras (MAA) Chennai (India) 
Chennai (MAA) Chennai (India) 
Madurai (IXM) (India) 
() 
() 
() 
() 
() 
() 

滚动

这是因为你的页面的另一特色:它只是呈现为实际上是鉴于元素的文本。因此,除了上面的代码,应用此招,以确保所有的元素都被滚动到检索其文本前:Scroll Element into View with Selenium

长话短说:这是我的最终版本:

driver.get("https://www.yatra.com/");// URl of yatra 
String origin ="(//input[@name='flight_origin_city'])[1]";// text box for entering origin 
driver.findElement(By.xpath(origin)).sendKeys("Bangalore"); 
String destination = "(//input[@name='flight_destination_city'])[1]";// text for entering destination 
driver.findElement(By.xpath(destination)).sendKeys("M"); 

WebElement list = new WebDriverWait(driver, 2000).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(//div[@class='viewport'])[2]"))); 

List<WebElement> elements = list.findElements(By.tagName("li")); 

for (WebElement element : elements) { 
     ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element); 

     String city = element.findElement(By.className("ac_cityname")).getText(); 
     String airport = element.findElement(By.className("ac_airportname")).getText(); 
     String country = element.findElement(By.className("ac_country")).getText(); 

     System.out.println(city + " " + airport + " (" + country + ")"); 
} 

这应该给你在Google Chrome中运行时的以下输出:

Mumbai (BOM) Chatrapati Shivaji (India) 
Madras (MAA) Chennai (India) 
Chennai (MAA) Chennai (India) 
Madurai (IXM) Madurai (India) 
Mangalore (IXE) Bajpe (India) 
Mysore (MYQ) Mysore (India) 
Coorg (MYQ) (nearest airport Mysore) (India) 
Male (MLE) Male (Maldives) 
Melbourne (MEL) Tullamarine (Australia) 
Mauritius (MRU) Plaisancet (Mauritius)