Я случайно столкнулся с этим, когда начал использовать headless-chrome с проектом кукольник.

Мне нравится использовать puppeteer для тестирования кода браузера, и много раз я использую его для тестирования библиотек Javascript с богатым API.
Но меня немного огорчил API оценки. Среда внутри функции оценки и связь с внешней средой кажутся слишком разрозненными и многословными, мне приходится передавать слишком много параметров и запоминать их порядок.

Например, чтобы использовать метод scrollBy, необходимо написать следующий код:

await page.evaluate((x, y) => window.scrollBy(x, y), x, y)

Приходится трижды повторить параметры! Кажется, это неправильно ... Я хотел, чтобы код выглядел больше так:

await page.window.scrollBy(x, y)

Поэтому я поигрался с прокси-серверами ES6, пытаясь найти способ, позволяющий добиться этого.
Поступая так, я обнаружил интересную особенность прокси при использовании с кодом async / await: ловушка прокси получит сообщение apply вызов функции then .

Это было то, что мне было нужно, и оттуда действительно возможен код, аналогичный приведенному выше! Кроме того, теперь вы можете ожидать обычных геттеров внутри окна, например:

const window = directJSHandle(page.evaluate(() => window))
const tagName = await window.document.body.tagName

Я использую прокси для связывания и хранения всех геттеров, сеттеров и вызовов, а затем разрываю цепочку, когда получаю вызов волшебной функции для «then».

Это все доступно в небольшом проекте на github. Он еще не готов к поддержке как проект с открытым исходным кодом (возможно, так и будет, если мы начнем использовать его внутри Wix), но больше похож на концепцию.



Предостережения: отладка подобного кода немного громоздка и требует инструментов, чтобы облегчить боль, а видеть «окно» в контексте узла сбивает с толку. Но было достаточно весело поделиться.

Продолжение следует…