前言:
最近项目中有类似的需求:需要对前端项目中某一个用户下的产品数据进行批量的处理。手动处理的流程大概是首先登录系统,获取到当前用户下的产品列表,点击产品列表的中产品项进入详情页,对该产品进行一系列的操作,然后保存退出。因为当前有20多万条数据,手动一条一条的处理不太现实,所以希望通过写脚本的方式来进行处理。
需求分析
其实这个需求还算比较简单,需要实现的点主要有三个,一是如何进行登录,获取登录信息,查询当前用户下的产品数据;二是如何知道当前数据是否处理完,然后退出当前的处理流程;三是如何异步的处理一批数据。
所以需要做的工作就是模拟登录,调用产品列表的查询接口获取产品ID集合,然后循环遍历当前的集合,通过产品ID跳转产品详情页面,模拟页面按钮的点击操作,监听处理完成的动作,退出当前的流程。
Selenium 介绍
What is Selenium"color: #ff0000">Node 环境搭建1. node的安装在此不再赘述。点击链接查看官网下载安装方法。
2. express安装$ npx express-generator或者
$ npm install -g express-generator创建项目:
$ express --view=ejs selenium-start $ cd selenium-start $ yarn启动项目:
$ DEBUG=myapp:* yarn start至此,Node 项目创建完毕。接下来我们就可以在项目中集成Selenium WebDriver
Selenium WebDriver 集成
1. 安装selenium-webdriver
yarn add selenium-webdriver2. 下载安装支持不同浏览器的驱动。(此处只介绍Chrome驱动)
[ChromeDriver][3]
下载并解压文件,同时把解压的执行文件放置到 /usr/bin目录下。或者设置相应的PATH路径,确保可执行文件在PATH路径中。开始使用
进入我们刚才创建的项目文件夹,目录如下:
页面添加一个开始按钮,以及给按钮添加事件。
找到 views/index.ejs, 添加如下代码:(为了方便操作,引入了jquery, axios, 所以需要下载准备好)
添加对应的路由
在app.js文件中,引入路由chromeDriver
var chromeDriverRouter = require('./routes/chromeDriver'); app.use('/chromeDriver', chromeDriverRouter);引入selenium-webdriver
在routes/chromeDirver.js文件中,我们添加了一个方法handleBaiDuDriver,这个方法用于处理模拟百度搜索自动化的一些测试。
首先我们需要在文件顶部引入selenium-webdriver
const {Builder, By, Key, until} = require('selenium-webdriver'); // Builder: 用于创建一个WebDriver实例。 // By: 表示通过什么方式来查找页面的元素。 // By.className( name ) → By // By.css( selector ) → By // By.id( id ) → By // By.js( script, ...var_args ) → function(WebDriver): Promise // By.linkText( text ) → By // By.name( name ) → By // By.partialLinkText( text ) → By // Key: 表示键盘上一系列的按键。 // until: 定义了一些工具类的方法。然后书写我们的方法体里的内容。
const handleBaiDuDriver = async () => { let driver = await new Builder().forBrowser('chrome').build(); try { await driver.get('http://www.baidu.com'); await driver.findElement(By.id('kw')).sendKeys('webdriver', Key.RETURN);//正常使用 await driver.findElement(By.id('su')).click(); await driver.wait(until.titleIs('百度一下,你就知道'), 1000); } catch (error) { console.log(error) } finally { await driver.sleep(2000); await driver.quit(); } }启动服务,查看效果。
启动服务之后,我梦能看到如下的界面。
点击页面中的【点击开始】按钮,最终能够看到如下的界面,为了演示我做了两秒的延迟。生成的gif图有9M多,无法上传。后续可以下载源码运行看效果。
获取登录信息
以上是selenium-webdriver的简单集成。在之前我们提到过实际需求中如何获取登录信息的问题。在访问产品列表页面的时候需要进行登录校验。如果没有登录则会跳转界面。由于我们的登录页是通过iframe来嵌套引入的。由于暂时还没有了解如何处理iframe里的操作,所以没法去模拟用户名密码的输入。
查看API文档,WebDriver 会有一个manage方法:
this.manage() → Options该方法会返回一个Options实例,具有如下的方法:
其中有对cookie的操作方法。所以可以通过首次输入用户信息并进行缓存的方式来实现登录态的保存。在下一次再打开页面的时候直接从缓存里获取cookie信息,并通过addCookie方法进行cookie的设置。但是由于我不知道什么时候、多长时间登录才会成功,所以在获取cookie的时候需要通过不断循环的方式去获取,直到拿到cookie。当然可以设置一个超时时间。超时之后就退出当前driver。
// 缓存cookie async function setCookies(driver) { const manage = driver.manage(); let sleepTime = 6000; await driver.sleep(sleepTime); let cookies = null try { cookies = await manage.getCookies(); } catch (error) { } while (!cookies || !findSessionIdFromCookies(cookies)) { await driver.sleep(2000) sleepTime += 2000; try { cookies = await manage.getCookies(); } catch (error) { } } if (cookies && findSessionIdFromCookies(cookies)) { cache.cookies = cookies; // cache是全局用于缓存cookie的对象 cache.cookiesStr = cache.cookies.map((cookie) => { return `${cookie.name}=${cookie.value}` }).join(';'); } return cookies; } // 设置cookie async function initCookies(driver) { const cookies = cache.cookies; if (cookies && cookies.length > 0) { await driver.manage().deleteAllCookies(); for (let i = 0 ; i < cookies.length; i++) { cookie = cookies[i]; await driver.manage().addCookie(cookie); }; } }获取到cookie 信息之后就可以请求产品列表以及通过产品ID进入产品详情页。然后再模拟页面按钮点击操作即可。
Github地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]