Задача
Дескрипторы элемента необходимы в качестве уровня абстракции между Node.js и средой выполнения браузера. Фактические элементы DOM не отправляются в среду Node.js.
Это означает, что когда вы хотите получить атрибут от элемента, должны быть данные, переданные в браузер (какой элемент DOM использовать) и обратно (результат).
Решение
Следовательно, результат из await els[i].$('img')
на самом деле является не элементом DOM, а только оболочкой, которая ссылается на элемент в среде браузера. Чтобы получить атрибут, вы должны использовать функцию типа elementHandle.$eval
:
const imgSrc = await els[i].$eval('img', el => el.getAttribute('src'));
Запускает функцию querySelector
для данного элемента и выполняет данную функцию, чтобы вернуть его атрибут.