Как ждать операции щелчка объекта ElementHandle в Puppeteer - PullRequest
0 голосов
/ 30 января 2020

Я получил список «элементов списка» в виде массива ElementHandle, и теперь я хочу щелкнуть по ним отдельно (чтобы загрузить дополнительные данные на той же странице без перехода на другую страницу), а затем нажать на другую кнопку. который загружается после того, как я нажимаю на элемент списка.

Это то, чего я достиг до сих пор:

       // get list of all li's
       let handles = await page.$$('div.listMiddle > div > div > ul > li');
        for (let handle of handles) {
            // get content of that li's
            let text = await page.evaluate(element => element.textContent, handle);
            // if they contains some specific string then click on them
            if (text.includes('something here')) {
                await handle.click();
                // this is where I am stucked at
            }
        }

Так что я отметил место, где я застрял, с комментарием к выше код. После нажатия на элемент списка, я хочу дождаться загрузки данных и затем нажать на кнопку, которая была недавно загружена. Эта кнопка будет перемещаться на новую страницу, но я собираюсь сделать это несколько раз. Это означает, что мне нужно go вернуться назад и снова щелкнуть другой элемент списка, а затем снова нажать кнопку, после чего он перейдет на другую страницу, что-то сделает на этой странице и затем вернется ...

Идет как это для всех элементов списка. Но не существует метода wait для этого объекта дескриптора, который имеет тип ElementHandle. Так как я могу это сделать? (Кстати, я пишу машинописным шрифтом, если это важно, но я думаю, что нет)


Редактировать: Если вопрос слишком сложный, просто ответьте на него; после await handle.click(), как я могу получить ответ этого клика в виде страницы или элемента?

1 Ответ

0 голосов
/ 30 января 2020

ElementHandle создаются внутри контекста исполнения. Это означает, что если вы перейдете на другую страницу, контекст выполнения будет уничтожен, поэтому ElementHandle перестанет работать.

Итак, несколько советов. Во-первых, вместо циклического перемещения по массиву дескрипторов вы можете сначала узнать, сколько элементов у вас есть, а затем перейти на эту страницу, щелкнуть первый элемент, выполнить свои действия, вернуться назад, щелкнуть второй элемент и т. Д.

Таким образом, шаги будут:
* Go к странице.
* Получить количество элементов.
* L oop, используя while (while(currentIndex < count))
* Страница вызова. $$
* Получить элемент, используя currentIndex
* Нажмите
* waitForNavigation
* Делайте вещи
* Go назад

Во-вторых, вы можете подождать, пока переход на новую страницу по клику.

await Promise.all([
    page.waitForNavigation(),
    handle.click(),
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...