Я случайно столкнулся с этим, когда начал использовать 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), но больше похож на концепцию.
Предостережения: отладка подобного кода немного громоздка и требует инструментов, чтобы облегчить боль, а видеть «окно» в контексте узла сбивает с толку. Но было достаточно весело поделиться.
Продолжение следует…