【问题标题】:ElementNotVisibleException in Selenium for a calender date inputSelenium 中的 ElementNotVisibleException 用于日历日期输入
【发布时间】:2015-09-19 22:09:40
【问题描述】:

我正在尝试使用 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。 还是不行。

【问题讨论】:

  • 你的第一篇文章做得很好。您做了自己的研究,尝试了一些事情,并发布了相关信息,以便我们更好地帮助您。我唯一推荐的是当你发布 HTML 时,使用像 jsbeautifier.org 这样的美化工具来格式化 HTML。它会为您缩进等,因此更容易阅读。

标签: java firefox selenium selenium-webdriver


【解决方案1】:

好的……现在我有了实际的站点。此代码正在运行。它设置开始和结束机场以及航班的开始和结束日期。

注意:除个人用途外,您不得出于任何目的抓取 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");

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

【讨论】:

  • 在继续使用 CSS 选择器之前,我已经尝试过 By.id。用户可以键入日期或使用日期选择器。我认为只需输入日期对我来说很容易。无论如何,如果它有帮助,我尝试这个的网站是 kayak.com。
  • 非常感谢!我什至尝试在输入之前单击字段,但我使用相同的 ID 来单击和输入字段。所以它没有识别出来。
  • 如果这个或任何答案对您有所帮助,请接受它作为答案。谢谢。
【解决方案2】:

当你检查时

startDate.isDisplayed();

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

【讨论】:

  • isDisplayed() 返回 false。我将尝试使用其他版本的浏览器。谢谢。
【解决方案3】:

您为什么要尝试将密钥发送到不是 input 字段的 HTML span 元素?我不知道 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']"));

【讨论】:

  • 我在使用 By.id() 之前尝试过您的建议。但它没有用。无论哪种方式,我同意 span 没有意义。因此更改了上面的代码以使用带有 cssSelector 的输入。但仍然是同样的例外。 :(
  • 嗯..您可以尝试将您的 wait.until 预期条件更改为:ExpectedConditions.elementToBeClickable(By.cssSelector("input[id='depart_date']"))
  • 即使这样也行不通。跨度(日历)的 isDisplayed 返回 true,但对于日期输入字段返回 false。谢谢你的cmets。除了尝试另一个版本之外,我想不出别的办法。
  • 不需要转换为WebElement
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2015-04-28
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多