我正在尝试实现以下方案 1.打开Chrome浏览器并打开greyhound.com 2.通过选择来源,目的地来搜索旅行。 3.选择开始日期,返回日期。 4.最后,点击搜索按钮查找可用的公交车。
前四个字段工作正常。选择返回日期后,日历将不会关闭,这会导致单击搜索按钮时出现问题。 日历与搜索按钮重叠,使其无法点击。
为了解决这个问题,我使用了Thread.sleep()来让日历关闭一段时间,并且工作正常。 如何使用selenium等概念实现这一目标? 隐式和显式等待都不适用于我。
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();
}
}
答案 0 :(得分:3)
在这种情况下,您需要等待回程日期选择器关闭。返回trippicker元素是
<table class="ui-datepicker-calendar">...</table>
等待它关闭的代码是等待元素不可见。
new WebDriverWait(driver, 10).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("table.ui-datepicker-calendar")));
您的代码正在等待“搜索”按钮可见。从技术上讲,它已经可见,它只是由datepicker下拉列表覆盖。 Selenium中的可见性与不可见(display:none等)有关,而不是我看不到它,因为它被另一个元素所覆盖。