nemo-page
Version:
View Interface for nemo enhanced with nested locators and collection mechanics.
96 lines (81 loc) • 3.64 kB
JavaScript
;
var ElementModel = require('./element'),
ArrayModel = require('./array'),
StaticItemModel = require('./staticItem'),
_ = require('lodash'),
debug = require('debug'),
log = debug('nemo-page:log'),
normalize = require('../lib/normalize');
var RadioModel = function (config, parent, nemo, drivex) {
log('RadioModel: Initializing Radio Model');
config = _.defaults(_.clone(config), { '_data': 'checked' });
// Initialize the base model object
var base = ElementModel(config, parent, nemo, drivex);
base.options = ArrayModel({
_data: 'attribute:value',
_itemsLocator: {
locator: config.locator,
type: config.type
}
}, base, nemo, drivex);
// Extend the base model with this models functions
_.extend(base, {
option: function (data, baseOverride) {
if (_.isNumber(data)) {
return base.options(data);
} else {
var baseElement = baseOverride || base.getBase(),
elementPromise,
itemPromise,
item;
elementPromise = nemo.page.doOperationWithRetry(function () {
return drivex.finds(base.locator(), baseElement).then(function (elements) {
function checkElementValue (index) {
if (elements[index]) {
return elements[index].getAttribute('value').then(function (value) {
if (value === data) {
return elements[index];
} else {
return checkElementValue(index + 1);
}
});
} else {
throw new Error('No radio with value "' + data + '" was found');
}
}
return checkElementValue(0);
});
}, nemo.page.NUM_RETRIES);
itemPromise = new nemo.wd.WebElementPromise(nemo.driver, elementPromise);
item = StaticItemModel(itemPromise, nemo);
return ElementModel({ '_data': 'attribute:value'}, item, nemo, drivex);
}
},
setValue: function (data, baseOverride) {
return base.option(data, baseOverride).click();
},
checkedCollect: function (baseOverride) {
return nemo.page.doOperationWithRetry(function () {
var baseElement = baseOverride || base.getBase();
return drivex.finds(base.locator(), baseElement).then(function (elements) {
function checkElementIsChecked (index) {
if (elements[index]) {
return elements[index].getAttribute('checked').then(function (value) {
if (value) {
return elements[index].getAttribute('value');
} else {
return checkElementIsChecked(index + 1);
}
});
} else {
return undefined;
}
}
return checkElementIsChecked(0);
});
}, nemo.page.NUM_RETRIES);
}
});
return base;
};
module.exports = RadioModel;