2

First post. I have a situation where I am using jQuery UI's datepicker to set model attributes. This is done with Angular UI and seems to work well, but I'm having a hard time trying to test it in the E2E scenarios.

This is the html:

<form ng-submit="submitForm(request)">
    <input ng-model="request.startDate" ui-date placeholder="Start Date" />
</form>

This is the controller:

$scope.submitForm = function(request) {
    var startDateStr = $filter('date')(request.startDate, dateFilterFormat);
    // Do something with startDateStr.

    var startYear = request.startDate.getFullYear();
    var startMonth = request.startDate.getMonth(); // 0-based.
    var startDayOfMonth = request.startDate.getDate();
    // Do something with date fields.
}

I have tried to set the input field in my E2E test, but it doesn't seem to set the datepicker. When I try to access the model, I'm getting just the string as expected, not a date object like I would with Angular UI. My initial thoughts were to either set the datepicker via jquery, but I'm not sure how I would go about doing that in the E2E test, or set the model attribute directly, which I also don't know how to do.

Can anyone provide any insight please? Thanks.

2 Answers 2

1

First add in your describe function:

angular.scenario.dsl('jQueryFunction', function() {
    return function(selector, functionName /*, args */ ) {
        var args = Array.prototype.slice.call(arguments, 2);
        return this.addFutureAction(functionName, function($window, $document, done) {
            var $ = $window.$; // jQuery inside the iframe
            var elem = $(selector);
            if (!elem.length) {
                return done('Selector ' + selector + ' did not match any elements.');
            }
            done(null, elem[functionName].apply(elem, args));
        });
    };
});

(taken from How to execute jQuery from Angular e2e test scope?)

Then to open and pick date use:

jQueryFunction('#datepickerElementId', "focus");
jQueryFunction('ul.dropdown-menu span:contains("07")', "click");

Where datepickerElementId is the id of the datepicker element in your html/template.

0

To me the the element(selector, label).{method}(value) was working.

In coffeescript I've done a little helper:

@UiDateHelper =
  selectCalendarDay: (day) ->
    element("[ui-date] a:contains('#{day}')").click()

  selectCalendarYear: (year) ->
    element('[data-handler="selectYear"]').val(year)

  selectCalendarMonth: (month) ->
    element('[data-handler="selectMonth"]').val(month - 1)

  selectDate: (date) ->
    year = date.substr(0, 4)
    month = date.substr(5, 2)
    day = date.substr(8, 2)
    @selectCalendarYear(year)
    @selectCalendarMonth(month)
    @selectCalendarDay(day)

UiDateHelper.selectDate('2014-01-21')

Hope this was useful.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.