如何处理与使用Java的Selenium自动化中的其他元素重叠的日历?

问题描述:

我试图执行以下场景 1.打开Chrome浏览器并打开greyhound.com 2.通过选择来源,目的地来搜索旅程。 3.选择开始日期,返回日期。 4.最后,点击搜索按钮找到可用的巴士。如何处理与使用Java的Selenium自动化中的其他元素重叠的日历?

前四个字段正常工作。选择返回日期后,日历将不会关闭,这会导致点击搜索按钮的问题。 日历与搜索按钮重叠并使其不可点击。

为了克服这个问题,我使用了Thread.sleep()来允许日历关闭一段时间,并且它可以正常工作。 如何使用硒等待概念实现这一目标? 隐式和显式等待都不适用于我。

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

    } 

在这种情况下,你需要等待回程日期选择器关闭。返回日期datepicker元素是

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

等待它关闭的代码是等待元素不可见。

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

您的代码正在等待搜索按钮显示。从技术上讲,它已经可见,它只是由datepicker下拉菜单覆盖。 Selenium中的可见性与不可见(display:none等)有关,而不是我无法看到它,因为它被另一个元素所覆盖。

+0

以上由@JeffC提供的解决方案都可以工作,您可以使用流畅的等待来即兴创作上述代码。检查此[链接](https://stackoverflow.com/questions/28224943/webdriver-wait-until-invisibility-of-element) –

+0

@richardmendonca'FluentWait'只是一个完全可定制的版本'WebDriverWait'。这里不需要它,因为上面的代码将完成OP所需的操作。 – JeffC

+0

@JeffC您使用的元素的隐形工作。谢谢! – Yuga