如何使用Selenium / Protractor设置HTML5 type =“date”输入字段(例如在Chrome中)?

时间:2014-01-22 22:25:35

标签: html5 angularjs selenium protractor

我想更新一些HTML5日期表单字段的日期值(显示为mm / dd / yyyy,只有可修改的数字部分):

<input type="date"/>

在我的Selenium / Protractor测试中。我已尝试使用sendKeys,但(在Chrome上)到目前为止尚未成功。

有没有办法使用sendKeys执行此操作?或者其他一些方法呢?

7 个答案:

答案 0 :(得分:7)

在Mac上使用带有Protractor的Chrome,以下方法对我有用。

模板(html5)

<input type="date" placeholder="Due Date" ng-model="newLesson.dueDate">

测试

this.newLessonDate = element( by.model('newLesson.dueDate') );
this.newLessonDate.sendKeys('01-30-2015');

在我输入日期格式为'01 -30-2015'之前,我一直收到错误。

答案 1 :(得分:2)

目前最好的方法似乎是更新输入字段而不触及其UI表示。

对于普通的Selenium,这种方法似乎有效(因为UI更新匹配):

selenium.executeScript('document.getElementById("continuousFrom").value = "2050-01-01"');
selenium.executeScript('document.getElementById("continuousTo").value = "2050-01-14"');

我的情况有点棘手,因为我使用的是Angular和Protractor,而上述方法并没有导致模型被更改。所以我最终采用了这种(甚至是更丑陋的)方法来直接修改模型:

browser.waitForAngular();
browser.executeScript('var scope = angular.element($("#continuousFrom").get(0)).scope(); scope.dates.from = "2033-01-01"; scope.$apply();');
browser.executeScript('var scope = angular.element($("#continuousTo").get(0)).scope(); scope.dates.to = "2033-01-14"; scope.$apply();');

这也是在Protractor测试中,我花了一段时间才意识到executeScript调用不等待Angular完成创建新DOM本身 - 因此waitForAngular确保ids就在那里。

答案 2 :(得分:2)

今天我遇到了同样的问题,我在这里找到了解决方案http://www.guru99.com/handling-date-time-picker-using-selenium.html

解决方案是仅发送日期编号,例如发送“2015-06-12”而不是发送“20150612”。

答案 3 :(得分:1)

我终于找到了一个有效的解决方案,使用Date.prototype.toLocaleDateString

// Remember that Date months are 0 based.
var keys = selenium.executeScript(
    'return (new Date(2016, 2, 7)).toLocaleDateString()'
);
sendKeys(keys);

答案 4 :(得分:1)

我的信用卡到期日仅包含月份和年份。我使用的解决方案是使用protractor.Key.TAB来移动光标并输入如下所示

element(by.id('cc-expiry')).sendKeys('12', protractor.Key.TAB, '2019');

所以在你的情况下你可以试试 element(by.id('cc-expiry')).sendKeys('12', protractor.Key.TAB, '12', protractor.Key.TAB, '2019');

答案 5 :(得分:0)

Selenium旨在模仿用户交互而不是设置属性。 但是,通过设置类型来更新DOM元素可以使用Javascript

完成
document.getElementById("someID").setAttribute("type","date")

答案 6 :(得分:0)

我遇到了sendKeys()正在运行的问题,但输入始终是$ invalid。对我有用的唯一格式是'YYYY-MM-DD',即'2015-08-05'。该格式的任何其他变体;斜杠而不是连字符,没有分隔符等仍然无效。

即使我使用的是Firefox版本37.0.2,它明确支持HTML5输入类型=日期,值得注意的是the docs say

“在尚不支持HTML5日期输入的浏览器中,将使用文本元素。在这种情况下,必须以有效的ISO-8601日期格式(yyyy-MM-dd)输入文本,例如: 2009-01-06“。

FWIW This answer与对我有用的东西相反。