一、浏览器环境补充
当使用puppeteer登录时,常规步骤:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
slowMo: 100, //放慢速度
headless: false,
defaultViewport: {width: 1440, height: 780},
ignoreHTTPSErrors: false,
args: ['--single-process', '--no-zygote', '--no-sandbox']
})
const page = await browser.newPage()
await page.setDefaultNavigationTimeout(0);
await page.goto('https://auth.alipay.com/login/index.htm');
await page.click('li[data-status="show_login"]');
//输入账号密码
const uniqueIdElement = await page.$('#J-input-user');
await uniqueIdElement.type('账号', {delay: 30});
const passwordElement = await page.$('#password_rsainput', {delay: 20});
await passwordElement.type('密码');
})()
手动输入验证码,再点击登录,会出现登录失败的情况,因为网站做了浏览器检测。这时候补充下浏览器环境就可以了
添加一下代码:
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
Object.defineProperty(navigator, 'plugins', {
get: () => [1, 2, 3],
});
Object.defineProperty(navigator, 'languages', {
get: () => ['zh-CN', 'zh'],
});
window.chrome = {
runtime: {},
};
const originalQuery = window.navigator.permissions.query;
window.navigator.permissions.query = (parameters) => (
parameters.name === 'notifications' ?
Promise.resolve({ state: Notification.permission }) :
originalQuery(parameters)
);
})
如此,就可以登录成功了。
至于验证码模块,可以使用打码平台,也可以采用深度学习的方法自己训练模型来实现。
二、iframe操作
想着alipay都能登录了,tmall是不是也可以成功登录呢,就去做试验了。tmall的登录模块遇到了iframe的操作,以前都是用
frame = page.mainFrame();
subIframe = frame.childFrames()[Index];
获取iframe的,这次怎么尝试都不行,看了文档还是这个方法啊
后来尝试使用如下代码,成功登录了。
await page.waitForSelector("iframe");
const elementHandle = await page.$('#J_loginIframe');
const subIframe = await elementHandle.contentFrame();