#javascript #angularjs #protractor
#javascript #angularjs #транспортир
Вопрос:
Я пытаюсь вернуть значение из функции execute script и сопоставить его с ожидаемым методом. поскольку IsSelected не работает со многими флажками, которые используются в приложении, я должен пойти этим путем. Вот мой код, и я действительно ценю вашу помощь.
Я пробовал использовать IsSelected с такими флажками, но это не работает. Приведенный ниже код выдает следующую ошибку. Сбой: не удается прочитать свойство ‘getText’, равное нулю
exports.verifyRegularCheckboxChecked = function () {
browser.driver.executeScript(function() {
var special_list = $('div > div');
var returnValue = 'itIsTrue';
var label, label_children;
special_list.filter(function(index, elem) {
label = elem.children;
label_children = $(label).children();
label_children.filter(function(nestedIndex, nestedElem) {
if(nestedElem.tagName === 'INPUT') {
if(nestedElem.checked) {
return returnValue;
}
}
});
});
}).then(function (returnValue) {
expect(returnValue.getText()).toBe('itIsTrue');
});
};
HTML-код:
<div class="form-group">
<div class="checkbox">
<label>
<input class="ark-checkbox ng-untouched ng-valid ng-dirty ng-valid-parse"
ng-model="block.properties.milestoneIsVariable.value" type="checkbox">
<span aria-label="ark-checkbox"> ::before </span> use variable
</label>
</div>
</div>
Комментарии:
1. пожалуйста, покажите HTML-код
2. Вот HTML, но, пожалуйста, обратите внимание, что все входные теги выделены серым цветом при проверке, поэтому выглядят как скрытые. Вот почему я не могу использовать локаторы, такие как ng-model, было бы просто.
<div class="form-group"> <div class="checkbox"> <label> <input class="ark-checkbox ng-untouched ng-valid ng-dirty ng-valid-parse" ng-model="block.properties.milestoneIsVariable.value" type="checkbox"> <span aria-label="ark-checkbox"> ::before </span> use variable </label> </div> </div>
Ответ №1:
Для фильтра(функции) jQuery вам необходимо вернуть логическое значение.
exports.verifyRegularCheckboxChecked = function () {
let result = browser.driver.executeScript(function() {
let special_list = $('div > div');
let label, label_children;
let checkedList = special_list.filter(function(index, elem) {
label = elem.children;
label_children = $(label).children();
return label_children.filter(function(nestedIndex, nestedElem) {
return estedElem.tagName === 'INPUT' amp;amp; nestedElem.checked;
}).length > 0;
});
// return matched Dom element
return checkedList.length > 0 amp;amp; checkedList.get(0);
}); // end of executeScript
expect(result.getText()).toBe('itIsTrue');
};
На самом деле, вы можете упростить свой код следующим образом:
exports.verifyRegularCheckboxChecked = function () {
let result = browser.driver.executeScript(function() {
return $('div > div').filter(function(){
return $('input:checked', this).length > 0;
})
.get(0);
});
expect(result.getText()).toBe('itIsTrue');
};
Комментарии:
1. Как вы можете видеть в моем комментарии выше, вставлен html. Я ищу решение, в котором я могу передать фактическое значение текста флажка функции, как
use variable
в приведенном выше html, а затем проверить, установлен флажок или нет. Ваши вышеуказанные решения возвращают что-то вроде этого, если я просто console.log(результат)ManagedPromise { flow_: ControlFlow { propagateUnhandledRejections_: true, activeQueue_: TaskQueue { name_: 'TaskQueue::22696', flow_: [Circular], tasks_: [Array], interrupts_: null, pending_: null, subQ_
Ответ №2:
Итак, я заставил его работать, изменив свой код следующим образом.
exports.verifyRegularCheckboxChecked = function () {
var result = browser.driver.executeScript(function() {
var returnValue = false;
var special_list = $('div > div');
var label, label_children;
special_list.filter(function(index, elem) {
label = elem.children;
console.log('inner text is: ' label.textContent);
label_children = $(label).children();
label_children.filter(function(nestedIndex, nestedElem) {
if(nestedElem.tagName === 'INPUT') {
if(nestedElem.checked) {
returnValue = true;
}
}
});
});
return returnValue;
});
result.then(function (value) {
expect(value).toBeTruthy();
});
};