所以我打开了一个网站,等待所有重定向完成,以捕获验证码图像并将其通过vie nodejs发送给用户,以获取键入的验证码
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
await page.goto('http://localhost/p1.php' );
await page.waitForNavigation();
const captcha_image = await page.$eval('#security', e => e.getAttribute('src'));
io.emit('send_captcha_to_client' , {text : captcha_image });
var captcha = await captchaPromise;
在我获得capthca的输入值之后,我将其放在字段中,然后单击登录按钮
await page.$eval('#W_CAPTCHA', (el , _captcha) => el.value = _captcha.W_CAPTCHA , captcha );
await page.click('#login-btn');
现在单击按钮后,一个ajax请求将被发送到服务器,让我们说http://example.com/login.php
...,如果验证码正确,我将重定向到我的仪表板,但是如果ajax调用返回就说{status:er}
页面中有<span id="alert"></span>
,它将向其中添加.Error
类,并将错误文本放在其中...我如何拦截ajax调用并检查登录是否成功或不 ?
我可以检查ajax调用的结果,或者等待并检查div.Error
的文档,但是不确定我该怎么做..这是我失败的尝试!
await page.waitForNavigation();
page.waitForSelector('.Error');
const error = await page.$eval('.Error', e => e.value );
console.log(error);
browser.close();
答案 0 :(得分:12)
您可以同时等待并处理最先发生的情况:
await Promise.race([
page.waitForNavigation({ waitUntil: "networkidle0" }),
page.waitForSelector(".Error")
]);
if (await page.$(".Error")) {
// there was an error
} else {
// the page changed
}
答案 1 :(得分:1)
接受的答案不是在等待请求,而是在等待选择器。那种老套的方式不适合我。
等待 Promise 解析以及请求响应状态是实现它的最简单方法。
await Promise.all( [
page.click( selector ), // ... action
page.waitForResponse( response => response.status() === 200 ), // ... wait for network
] );
响应 | 说明 |
---|---|
200 OK |
HTTP 200 OK 成功状态响应码表示请求成功。 200 响应默认是可缓存的。 |