2017-09-25 3 views
1

J'essaie d'implémenter le scénario suivant 1. Ouvrez le navigateur Chrome et ouvrez greyhound.com 2. Recherchez un trajet en sélectionnant une source, une destination. 3. Choisissez une date de début, une date de retour. 4. Enfin, cliquez sur le bouton de recherche pour trouver les bus disponibles.Comment gérer le calendrier qui se chevauche avec d'autres éléments dans l'automatisation Selenium en utilisant Java?

Les quatre premiers champs fonctionnent correctement. Après avoir choisi la date de retour, le calendrier ne se fermera pas, ce qui pose un problème pour cliquer sur le bouton de recherche. Le calendrier se chevauche avec le bouton de recherche et le rend non-cliquable. Pour surmonter cela, j'ai utilisé Thread.sleep() pour laisser du temps pour la fermeture du calendrier et cela fonctionne très bien. Comment puis-je y parvenir en utilisant le concept d'attente sélénium? Les attentes implicites et explicites ne fonctionneront pas pour moi.

public class UsingChrome { 
     public static void main(String args[]) throws InterruptedException { 

      //Chrome Driver 
      System.setProperty("webdriver.chrome.driver", "Y:\\Selenium\\chromedriver.exe"); 

      //Creating driver element 
      WebDriver driver = new ChromeDriver(); 

      //Implicit Wait 
      //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

      //To maximize browser window 
      driver.manage().window().maximize(); 

      //Open webpage 
      driver.get("https://www.greyhound.com/"); 

      //Scroll 
      JavascriptExecutor jse = (JavascriptExecutor)driver; 
      jse.executeScript("window.scrollBy(0,300)", ""); 

      //Select an origin and destination 
      driver.findElement(By.id("fromLocation")).sendKeys("New York, NY"); 
      driver.findElement(By.id("toLocation")).sendKeys("Boston, MA"); 

      // To input a date using 'sendKeys' 
      //Choose a Start Date 
      driver.findElement(By.id("datepicker-from")).click(); 
      driver.findElement(By.id("datepicker-from")).sendKeys("10/22/2017"); 

      //Choose an End Date 
      driver.findElement(By.id("datepicker-to")).click(); 
      driver.findElement(By.id("datepicker-to")).sendKeys("10/27/2017"); 
      driver.findElement(By.id("datepicker-to")).sendKeys(Keys.ENTER); 


      //Explicit wait 
      WebDriverWait wait = new WebDriverWait(driver, 300); 
      WebElement search = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id=\'fare-search-btn\']"))); 
      search.click(); 

      //Search 
      //Thread.sleep(3000); 
      driver.findElement(By.id("fare-search-btn")).click(); 

      //driver.quit(); 
     } 

    } 

Répondre

3

Dans ce cas, vous devez attendre le datepicker voyage de retour à fermer. L'élément datepicker de voyage de retour est

<table class="ui-datepicker-calendar">...</table> 

Le code d'attendre à fermer est d'attendre que l'élément soit invisible.

new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("table.ui-datepicker-calendar"))); 

Votre code attendait que le bouton Rechercher soit visible. Techniquement, c'est déjà visible, c'est juste couvert par la liste déroulante datepicker. La visibilité dans le sélénium a à voir avec non invisible (affichage: aucun, etc.) plutôt que je ne peux pas le voir parce qu'il est couvert par un autre élément.

+0

Ci-dessus la solution fournie par @JeffC fonctionnera, vous pouvez improviser le code ci-dessus en utilisant couramment l'attente. check this [link] (https://stackoverflow.com/questions/28224943/webdriver-wait-until-invisibility-of-element) –

+0

@richardmendonca 'FluentWait' est juste une version entièrement personnalisable de' WebDriverWait'. Il n'y a pas besoin d'ici car le code ci-dessus fera ce que l'OP a besoin. – JeffC

+0

@JeffC Cette invisibilité de l'élément que vous avez utilisé a fonctionné. Merci! – Yuga