前言

最近有需求要登录网站查询一些信息,然后再修改一些信息,而且这种工作重复性很强,想着通过自动化的方式来做这个东西。

技术选择

自动化的方式开始考虑的是用python的爬虫来做,但是登录的网站有好多防爬虫机制,js又是压缩的,登陆的时候post参数就有40多个,后来想过phantomjs但是还是有限制,后来发现了selenium这个自动化测试的工作,尝试了一些感觉用起来相对比较简单,而且python-selenium的官方文档也还行。

仔细研究了发现,其实selenium这种方式是最简单的也是最low的,这种方式速度很慢,但是相对来讲,我们的需求对速度没有那么大的需求,用selenium完成我们需要的东西最多也就1分钟差不多就能搞定了,又不用研究网站的登录验证。

还有就是我们想把这个功能放到linux服务器上,selenium需要图形界面还有浏览器的驱动,浏览器的驱动还好说,直接下载然后放到/usr/bin下就行了,但是图形界面有点儿坑,启动就要一段时间,后来在这个上面研究很久,发现了python有pyvirtualdisplay这个插件可以不用装X11这类的图形界面,直接让浏览器启动在虚拟环境中。

python版本的话,就选择python 2了,因为我们可以在自己笔记本上录制selenium脚本然后转成python脚本,不过录制脚本的浏览器(就是支持selenium ide的浏览器)到现在好像只有Firefox,然后导出的脚本也是python 2的,可以先录制所有的操作,然后自己导出脚本来改动,自己又省了好多事情。

样例代码

实际使用过程中还是有些坑,不过也是自己学习的过程,下面上一个样例代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*- import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from pyvirtualdisplay import Display
from selenium.webdriver.chrome.options import Options def reset_mail(dr): time.sleep(5)
dr.get('http://mail.163.com')
dr.find_element_by_id('cred_userid_inputtext').send_keys("wis@163.com")
dr.find_element_by_id('cred_password_inputtext').send_keys('12345678')
dr.find_element_by_id('cred_password_inputtext').send_keys(Keys.RETURN)
# 第一次的回车有时候不太管用,在发送一次回车
try :
time.sleep(1)
dr.find_element_by_id('cred_password_inputtext').send_keys(Keys.RETURN)
except Exception as e:
pass #直接请求需要的url,因为这个时候我们的浏览器driver已经有登录的各种信息了,这个时候我们可以直接dr.get_cookies()把已经登录的cookie拿到,然后直接拿着这个cookies来向我们需要url发送请求,前提是这个请求post的参数比较简单,如果比较复杂的话还是接着往下走吧。
dr.get('https://portal.partner.microsoftonline.cn/Admin/Default.aspx#ActiveUsersPage') dr.switch_to.frame(dr.find_elements_by_tag_name('iframe')[0])
dr.find_element_by_id('EAdminActiveUsersListView_ToolBar_MoveToToolbar').click()
ele = dr.find_element_by_name('EAdminActiveUsersListView$SearchBox')
ele.send_keys('hongzhi')
ele.send_keys(Keys.RETURN)
my_email = 'hongzhi@163.com' e1 = WebDriverWait(dr, 10).until(
EC.presence_of_element_located((By.XPATH, "//td[@title='%s']" % my_email ))
)
e1.click() dr.switch_to.frame('DetailPane_detailsFrame')
dr.find_element_by_id('ViewActiveUsers_contentContainer_lblResetPassword2').click() dr.switch_to.default_content()
dr.switch_to.frame('FlyoutIframe')
time.sleep(1)
WebDriverWait(dr, 10).until(
EC.presence_of_element_located((By.ID, "reset-button"))
).click()
WebDriverWait(dr, 10).until(
EC.presence_of_element_located((By.ID, "response_table"))
)
time.sleep(3)
#找到需要的元素然后打印出来
pass_ = dr.find_elements_by_xpath("//td")[3].text
print pass_ if __name__ == '__main__':
display = Display(visible=0,size=(800,600))
display.start()
#设置一下浏览器的属性要不然在虚拟环境中启动报错
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-setuid-sandbox")
dr = webdriver.Chrome(chrome_options=chrome_options)
try:
reset_mail(dr)
except Exception as e:
print e
raw_input("wait:")
dr.quit()
display.stop()
dr.quit()
display.stop()

Puppeter

现在 selenium 已经快过时了,最近学习了一下 Puppeter, 下面是登陆 dell idrac 做一些操作的代码:

const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch({headless: false,ignoreHTTPSErrors:true,autoClose:false,});
let pages = await browser.pages();
let page = pages[0];
await page.setViewport({
width: 1066,
height: 568,
});
await page.goto('https://idrac.wis.com/login.html');
await page.waitFor(1000);
await page.waitForSelector('#user',{timeout:5000});
await page.type('#user', process.env.USER);
await page.type('#password', process.env.PWD);
await page.keyboard.down('Enter');
await page.waitFor(3000);
await page.waitFor(2000);
let frame = page.frames().find(frame => frame.name() === 'treelist');
await frame.waitForSelector("#a_虚拟控制台");
await frame.click("#a_虚拟控制台");
await page.waitFor(4000);
await frame.click("#a_虚拟控制台");
let frame_console = page.frames().find(frame => frame.name() === 'da');
await frame_console.waitForSelector("#kvmPluginType");
// let s = frame_console.$("#kvmPluginType");
// await s; await frame_console.select("#kvmPluginType","0");
await frame_console.select("#kvmSessionTimeoutAction","1");
const selectElem = await frame_console.$$eval('#kvmSessionTimeoutAction', options => { return options });
console.log(selectElem);
console.log(selectElem[0]);
// console.log(selectElem.value);
const selectOptions = await frame_console.$$eval('#kvmPluginType > option', options => { return options.map(option => option.value ) });
await frame_console.waitFor(5000);
await frame_console.select("#kvmPluginType","2");
await frame_console.waitForSelector("#btn_apply_lbl");
await frame_console.click("#btn_apply_lbl");
await frame_console.waitForSelector("#launchButton");
await frame_console.click("#launchButton");
console.log(selectOptions); console.log(frame.title()); // await browser.close();
})();

通过selenium登录网页获取特定信息的更多相关文章

  1. PHP版微信第三方实现一键登录及获取用户信息的方法

    本文实例讲述了PHP版微信第三方实现一键登录及获取用户信息的方法.分享给大家供大家参考,具体如下: 注意,要使用微信在第三方网页登录是需要“服务号”才可以哦,所以必须到官方申请. 一开始你需要进入微信 ...

  2. selenium基础(获取验证信息-断言)

    获取验证信息 实际结果与预期结果进行比较称之为断言 通过获取title.URL.text等信息进行断言 text方法用于获取标签对之间的文本信息 from selenium import webdri ...

  3. 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github

    不知不觉,版本以每周更新一次的脚步进行着,接下来应该是重构我的代码及框架的结构,有朋友反应代码有点乱,确实如此,当时写的时候只是按照订阅号来写的,后来才慢慢增加到支持API接口.目前还在开发第三方微信 ...

  4. Andriod中WebView加载登录界面获取Cookie信息并同步保存,使第二次不用登录也可查看个人信息。

    Android使用WebView加载登录的html界面,则通过登录成功获取Cookie并同步,可以是下一次不用登录也可以查看到个人信息,注:如果初始化加载登录,可通过缓存Cookie信息来验证是否要加 ...

  5. 小程序登录&授权&获取用户信息

    一 .登录 时序图如下: wx.login() 获取js_code 示例代码: App({   onLaunch: function() {     wx.login({       success: ...

  6. cas单点登录如何获取更多信息

    现在有个新的系统(SpringMVC+Spring+Mybatis),我为它添加了一个单点登录功能.只是在本地客户端的web.xml文件里,添加了以下配置 <!-- 用于单点退出,该过滤器用于实 ...

  7. Java基础知识强化之网络编程笔记22:Android网络通信之 Android常用OAuth登录(获取个人信息)

    1. 获取百度个人信息(使用Gson解析): 2. 代码案例: (1)工程一览图,如下: (2)activity_main.xml: <LinearLayout xmlns:android=&q ...

  8. Java基础知识强化之网络编程笔记21:Android网络通信之 Android常用OAuth登录(获取令牌信息)

    1. 首先我们去下载开发相关SDK(Android): 下载百度使用OAuth的SDK(Android),如下: 下载链接为:http://developer.baidu.com/wiki/index ...

  9. python使用unittest模块selenium访问斗鱼获取直播信息

    import unittest from selenium import webdriver from bs4 import BeautifulSoup as bs class douyu(unitt ...

随机推荐

  1. 成为JavaGC专家—深入浅出Java垃圾回收机制

    对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢? 首先可以满足作为一名软件工程师的求知欲, 其次,深入了解GC如何工作可以帮你写出更好的Java应用. 这仅仅代表我个人的意见,但我坚信 ...

  2. i++ 是线程安全的吗?

    相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼.内心肯定还在质疑,i++ 居然还有线程安全问题?只能说自己了解的不够多,自己的水平有限. 先来看下面的示例来验 ...

  3. python 修改dataframe的列名

    1. 修改全部列名 df.columns base_data_model.columns = [u'有效率',u'提交率',u'参与度',u'回放占比',u'主好评率',u'辅好评率',u'是否付费' ...

  4. Django之路由系统 Dj

    Django之路由系统   Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...

  5. centos7 卸载 jdk

    ################ jdk 的安装 ###########################参考:https://www.cnblogs.com/Dylansuns/p/6974272.h ...

  6. Mysql 日期加减

    mysql表中有一些字段是显示日期的.因为各种需要,需要将它时间往后调整1年. mysql 日期增加一年的更新语句更新的语句如下:     UPDATE table SET date = DATE_A ...

  7. PHP和Redis实现在高并发下的抢购及秒杀功能示例详解

    抢购.秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等. 抢购.秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一.高并发对数据库产生的压力二. ...

  8. Android 阻隔返回键

    //阻隔 返回键 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.K ...

  9. Hibernate 再接触 悲观锁和乐观锁

    为什么取1248 二进制 CRUD 移位效率高 在并发和效率选择一个平衡点 一般不会考虑幻读 因为我们不会再一个事务里查询两次,(只能设置为seralizable) 悲观锁和乐观锁的前提是read-u ...

  10. easyui datagrid自定义按钮列,即最后面的操作列

    在很多时候我们要在表格的最后添加一列操作列,easyUI貌似没有提供种功能,不过没关系,我们可以自定义来实现首先是HTML部分 <table id="tt" class=&q ...