Проблема здесь в том, что $eval
делает несколько вещей, которые зависят друг от друга.
$eval
сначала выбирает элемент, а затем пытается оценить функцию по результату.
Вы можете решить свою проблему несколькими способами, но, возможно, проще всего просто проверить, соответствует ли селектор элементу, прежде чем делать что-либо еще:
let itemDescription2;
if (await items[i].$('.description-optional'))
itemDescription2 = await items[i].$eval('description-optional', div => div.innerText.trim());
В качестве альтернативы вы можете получить innerTextв браузере и верните его, не вызывая ошибки.
Примечание также:
i <= items.length;
должно быть i < items.length;
, а description-optional
должно быть .description-optional
как это селектор класса.