由于本人一时兴起,在扇贝创建了一个共同学习英语的前端小组,随着人数的增多,为了更好管理,添加自动打卡检测。
const puppeteer = require('puppeteer')
const account = `609457773@qq.com`;
const password = `****`;
const sleep = time => new Promise(resolve => {
setTimeout(resolve, time)
})
async function loginShanbei(loginUrl, teamUrl) {
// 返回解析为Promise的浏览器
const browser = await puppeteer.launch({
args: ['--no-sandbox'],
dumpio: false
})
// 返回新的页面对象
const page = await browser.newPage()
// 页面对象访问对应的url地址
await page.goto(loginUrl, {
waitUntil: 'networkidle2'
})
// 等待3000ms,等待浏览器的加载
await sleep(1000)
await page.type('#input-account', account);
await page.type('#input-password', password);
await page.click('#button-login');
await page.waitForNavigation({
waitUntil: 'load'
});//等待页面加载出来,等同于window.onload
await page.screenshot({path: 'example.png'});
// 跳到小组页面
await page.goto(teamUrl, {
waitUntil: 'networkidle2'
})
// 可以在page.evaluate的回调函数中访问浏览器对象,可以进行DOM操作
let lis = await page.evaluate(async () => {
const table = document.getElementById('members')
let members = table.getElementsByClassName('member')
let li = []
for (let i = 0; i < members.length; i++) {
const member = members[i]
const rate = member.getElementsByClassName('rate')[0]
const rateSpan = rate.getElementsByTagName('span')[0]
if (rateSpan.innerHTML && parseInt(rateSpan.innerHTML) < 95) {
$(member).find('.checkbox').click()
li.push(i)
}
}
return li
})
await page.screenshot({path: 'example2.png', fullPage: true});
// 如果有满足条件的就踢人
if (lis.length > 0) {
await page.click('#dismiss_container .btn');
// 等待1000ms,等待浏览器的加载
await sleep(1000)
await page.click('.confirm');
}
// 关闭无头浏览器
await browser.close()
return Promise.resolve()
}
loginShanbei('https://web.shanbay.com/web/account/login', 'https://www.shanbay.com/team/manage/#p1')
没有复杂逻辑,主要是用组长的账号登陆,之后跳转到小组管理页面,计算打卡低于95的同学,剔除小组。
pupeteer截图
网友评论