你的公式
login
IIFE
运行
async
异步
,你从不等待承诺。你不要等
登录
CASE1
也可以,但是你不能那样做,因为它什么也不回。你得先做
登录
Promise
通过制造它
异步
(您可以返回
承诺
却没有成功
异步
,但这样你就无法使用
await
login: async (page, selector) => {
await page.goto("localhost:8080/login");
await page.type("#username", "admin");
console.log("STEP 1 USERNAME");
await page.type("#password", "admin1");
console.log("STEP 2 PASSWORD");
const submit = await page.waitForSelector("#submit");
await submit.click();
console.log("STEP 3 - Login");
}
waitForSelector
returns the
ElementHandle
,所以你不需要打电话
page.click
then
无论如何。现在
登录
承诺
.
等待
那个
承诺
在里面
为了使功能本身
异步
:
CASE1: async (req, res) => {
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
try {
console.log("STARTING CASE 1");
await page.setViewport({ "width": 1280, "height": 720 });
await login(page, selector);
for (const type of ["day", "month", "year"]) {
const combobox = await page.waitForSelector(`#combobox_of_${type}`);
await combobox.click();
console.log(`SELECT combobox of ${type}`);
}
await browser.close();
console.log("ENDING navigation");
} catch (error) {
console.log(error);
}
}
selector
变量,也就是
登录
忽略它,但我还是留下它来匹配你的代码。