Проблема связана с разрешением обещания, я передаю xPath для всех элементов, которые нужно искать, вместе со строкой для поиска, и я хотел бы, чтобы элемент вернулся. Вот код:
export class Library {
static findListItem(xPath: string, findItem: string): any {
let z = 0;
const allItemsXPath = xPath.split('[X]');
const itemXPath = xPath.split('X');
console.info(xPath + ' : ' + findItem);
const itemList = element.all(by.xpath(allItemsXPath[0] + allItemsXPath[1])).map(function (item) {
return item.getText();
});
itemList.then(function (itemText) {
console.info(itemText.length);
for (let k = 0; k < itemText.length; k++) {
itemFound = true;
console.info(itemText[k] + ' : ' + findItem);
if (itemText[k] === findItem) {
z = k + 1;
console.info('found ' + z);
}
}
}).then(() => {
console.info(itemXPath[0] + z + itemXPath[1]);
// element(by.xpath(itemXPath[0] + z + itemXPath[1])).click();
return element(by.xpath(itemXPath[0] + z + itemXPath[1]));
});
};
Прокомментированная строка для нажатия работает. Он может увидеть элемент и щелкнуть по нему. Я хотел бы вернуть элемент вызывающему абоненту, который затем щелкнет.
Если возврат не находится в разделе .then, тогда возврат происходит слишком быстро и z = 0. Теперь, как сейчас, ничего не возвращается.
Ваша функция findListItem
не возвращает значения, добавьте return
перед itemList.then
static findListItem(xPath: string, findItem: string): any {
...
return itemList.then(function (itemText) {
...
});
}
Library.findListItem(xxx, yyy).then(function(item){
return item.click();
})
У меня есть вопрос по приведенному ниже коду, чтобы найти соответствующий элемент, вы сравниваете один символ itemText
со всей строкой findItem
на итерацию. Вы уверены, что можете найти подходящий вариант с приведенным ниже кодом.
for (let k = 0; k < itemText.length; k++) {
itemFound = true;
console.info(itemText[k] + ' : ' + findItem);
if (itemText[k] === findItem) {
z = k + 1;
console.info('found ' + z);
}
}
Вы действительно объявили тип возвращаемого значения для функции, но вы не указали явный оператор return
для функции, проверьте это дважды. поэтому, когда вы вызываете findListItem()
, он возвращает undefined
.
Спасибо, это очень помогло. Хотя он возвращает обещание, поэтому после вызова функции с помощью const obj = <function call> я должен использовать obj.then (function (elem) {elem.click ();}); Есть ли способ вернуть объект после разрешения обещания? Если нет, то это сработает, и еще раз спасибо, Ён!
В вашем случае невозможно вернуть невыполненное обещание.
Я понимаю и еще раз благодарю вас. Вы решили мою проблему.
Функция возвращает значение, используя «любое» в заголовке функции. То, что происходит со списком элементов, - это строки над ним, где он определен, захватывает все значения в раскрывающемся списке и, используя .map, преобразует обещания в массив текста. Элемент itemlist.then, который вы упоминаете, заставляет его ждать разрешения обещания, поэтому возврат туда не поступает. itemList - это массив строк, поэтому itemList [k] является строкой, а не символом. Надеюсь, это имеет смысл