Selenium中的ElementNotVisibleException,用于日历输入

时间:2015-09-18 05:43:27

标签: java firefox selenium selenium-webdriver

我正在尝试使用Selenium将sendKeys输入到FireFox浏览器中的日历日期元素。元素显示但我一直在异常之下:

Caused by: **org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with**
Build info: version: '2.47.1', revision: '411b314', time: '2015-07-30 02:56:46'
System info: host: 'abcde-693bdc76f', ip: '192.168.1.4', os.name: 'Windows XP', os.arch: 'x86', os.version: '5.1', java.version: '1.8.0_60'
Driver info: driver.version: unknown

定位器唯一标识元素;当我执行findElements时,列表中只有一个元素。

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("input[id='depart_date']")));
WebElement startDate = (WebElement)   driver.findElement(By.cssSelector("input[id='depart_date']"));
startDate.isDisplayed();
startDate.sendKeys(Keys.DELETE);
startDate.sendKeys("20/09/2015");

以下是元素的HTML代码:

<div id="travel_dates-start-wrapper" class="r9-datepicker-wrapper r9-  datepicker-twofields r9-datepicker-start-empty">
    <span class="r9-datepicker-icon r9-icon-calendar-depart"></span>
    <span id="travel_dates-start" class="r9-datepicker-section r9-datepicker-start">
        <span id="travel_dates-start-display" class="r9-datepicker-display" contenteditable="true" tabindex="0" aria-label="Start Date"></span>
        <span id="travel_dates-start-placeholder" class="r9-datepicker-placeholder">Depart</span>
    </span>
    <span id="travel_dates-start-clear" class="r9-datepicker-clear"></span>
    <input id="travel_dates-start-tab" class="r9-datepicker-tab" type="text" readonly="true">
    <input id="depart_date" class="r9-datepicker-input r9-datepicker-start" type="text" value="" name="depart_date">
</div>

这是我在StackOverflow上的第一篇文章,很抱歉,如果我的帖子有任何问题。我在同一个例外发现了很多问题。尝试了一切,但似乎没有任何工作,我坚持似乎是一个简单的问题。请帮忙。

修改:在@ spcial的建议下,从span更改为input。       仍然无效。

3 个答案:

答案 0 :(得分:0)

您为什么要尝试将密钥发送到不是span字段的HTML input元素?我不知道HTML代码在行动中的样子,但我会尝试将密钥发送到相关的depart_date input元素,例如:

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("input[id='depart_date']")));
WebElement startDate = driver.findElement(By.cssSelector("input[id='depart_date']"));

答案 1 :(得分:0)

检查时

startDate.isDisplayed();

的答案是真还是假(元素是否可见)?如果不清楚,你就无法与之互动。 然而,在我看来,Selenium报告了一个不可见的元素,但是因为isDiplayed()方法中存在错误。在这种情况下,请尝试另一个版本的浏览器(较旧或较新)和另一个版本的驱动程序(较旧或较新)

答案 2 :(得分:0)

好的......现在就做我已经拥有的实际网站了。这段代码正在运行。它设置起始机场和终点机场以及航班的起止日期。

注意:除个人使用外,您不得刮取KAYAK网站。查看他们的terms of use

  

此外,您同意不事先做以下任何事情   表达KAYAK的书面许可:

     

(i)使用任何手动或自动过程访问Good Stuff   除您个人使用或包含KAYAK页面之外的其他目的   在搜索索引中;

driver.get("http://www.kayak.com/flights");
WebElement originFlight = driver.findElement(By.id("origin"));
originFlight.clear(); // clear the default airport
originFlight.sendKeys("JFK");
driver.findElement(By.id("destination")).sendKeys("LAX");
driver.findElement(By.id("travel_dates-start")).click();
WebElement startDate = driver.findElement(By.id("travel_dates-start-display"));
startDate.clear(); // clear the default start date
startDate.sendKeys("12/1/2015");
driver.findElement(By.id("travel_dates-end")).click();
WebElement endDate = driver.findElement(By.id("travel_dates-end-display"));
endDate.clear(); // clear the default end date
endDate.sendKeys("12/15/2015");

问题是您必须单击开始/结束日期控件才能显示元素,以便输入日期。