2017-02-26 71 views
-1

如何使用硒標記驅動程序在使用<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. 
} 

回答

0

xpath"(//div[@class='viewport'])[2]"爲您提供了一個單一的元素,就不一一列舉。這也不是存儲選項的地方,它是存儲它們的容器的父級。嘗試

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

您的情況有點困難,但這就是值得探索的原因。這裏的問題的逐步的解剖:

桌面通知對話框

首先,當我試圖在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)