Разрешить page.evaluate () в кукловоде после события, инициируемого пользователем - PullRequest
0 голосов
/ 23 апреля 2019

Я запускаю page.evaluate(), который должен вернуть то, что я вручную набрал в поле ввода на странице.Я написал код, который, как я знаю, не будет работать, но он показывает намерение, стоящее за ним:

let inputText = await page.evaluate(() => {
    // some non-automated process done by hand
    let sendButton = document.querySelector(".button");
    sendButton.addEventListener("click", () => {
        let text = document.querySelector(".input").value;
        return text;
    }, false);
    // wait for text?

});
console.log(inputText);

Как заставить кукловода ждать моего триггера события внутри page.evaluate(), прежде чем вернуть набранный текст обратно вконтекст nodejs?

1 Ответ

1 голос
/ 23 апреля 2019

Вы не можете заставить evaluate ждать этого, но вы можете использовать exposeFunction для регистрации функции обратного вызова.

await page.exposeFunction('processInput', inputText => console.log(inputText));

await page.evaluate(() => {
    // some non-automated process done by hand
    let sendButton = document.querySelector(".button");
    sendButton.addEventListener("click", () => {
        let text = document.querySelector(".input").value;

        processInput(text);

    }, false);
});

Как прокомментировал miyagisan и это отличная идея, также можно вернуть обещание:

const inputText = await page.evaluate(() => { 
    return new Promise((resolve, reject) => { 
        let sendButton = document.querySelector(".button"); 
        sendButton.addEventListener("click", () => { 
            let text = document.querySelector(".input").value; 
            resolve(text); 
        }, false); 
    }); 
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...