javascript - 如何使用 Puppeteer 处理弹出窗口
问题描述
我正在编写一个脚本来在亚马逊上购买商品。
const puppeteer = require('puppeteer');
// Insert personal credentials
const email = '';
const password = '';
function press_enter(page) {
return Promise.all([
page.waitForNavigation({waitUntil:'networkidle2'}),
page.keyboard.press(String.fromCharCode(13))
]);
}
function click_wait(page, selector) {
return Promise.all([
page.waitForNavigation({waitUntil:'networkidle2'}),
page.click(selector)
]);
}
(async () => {
const browser = await puppeteer.launch({headless:false, defaultViewport:null, args: ['--start-maximized']});
const page = (await browser.pages())[0];
await page.goto('https://www.amazon.it/');
await click_wait(page, "a[data-nav-role='signin']");
await page.keyboard.type(email);
await press_enter(page);
await page.keyboard.type(password);
await press_enter(page);
// Search for the "signout" button as login proof
if(await page.$('#nav-item-signout') !== null) console.log('Login done!');
else return console.log('Something went wrong during login');
// Navigate to the product page
await page.goto('https://www.amazon.it/dp/B07RL2VWXQ');
// Click "buy now" (choose either Option A or Option B)
// Option A: Here the code get stuck since the page isn't refreshing and page.waitForNavigation() will reach its timeout
// await click_wait(page, "#buy-now-button");
// Option B: Waiting time manually set to 5 seconds (it should be more than enough for popover to fully load)
await Promise.all([page.waitForTimeout(5000), page.click('#buy-now-button')]);
// Conclude the purchase
await click_wait(page, '#turbo-checkout-pyo-button');
})();
到目前为止,我可以登录亚马逊,导航到产品页面并单击“立即购买”按钮。
然后,如果送货地址和付款选项都设置好了,(取决于亚马逊域名)它可能会显示一个弹出框来结束购买。
我无法在 和 上复制弹出框响应.com
,.co.uk
这些域似乎会将您重定向到一个全新的页面。
当我使用 Chrome 开发人员工具浏览页面时,我实际上看到了正在加载的页面的新块 ( <!DOCTYPE html>
),但我不知道这个元素的表示在 Puppeteer 中的位置。
如果我使用click_wait()
单击Buy Now,脚本会卡住(它仅在默认超时后返回page.waitForNavigation()
),因此它不被视为页面刷新。但是,即使我在单击“立即购买”后等待几秒钟,然后尝试单击input[id='turbo-checkout-pyo-button']
(橙色按钮“Ordina”),Puppeteer 也会引发错误,因为它无法找到该元素,尽管它已被明确加载。
解决方案
推荐阅读
- go - 在 Golang 中创建 bool 类型切片时出错?
- c# - FileHelpers.ConvertException 使用格式 dd/MM/yy HH:mm
- pine-script - 在 pinescript 的入口蜡烛高点设置止损
- c++ - 为什么释放空间的价值变化如此之快?
- android - Flutter: Open Drawer from a custom widget
- java - 查找Java接口中所有未实现的方法
- javascript - Firebase 中的自定义事件跟踪
- networking - how to create gcp projects without default network using gcloud sdk
- docker - 通过将在同一容器内执行的脚本取消设置 docker 容器内的 ENV 变量
- jquery - 我希望如果最后一个元素没有被点击并且想要显示点击的 li 活动,则不应该允许点击 li 的下一个元素