Splinter学习--初探3,两种方式登录QQ邮箱

目前,qq邮箱的登录方式有:

1、利用账号、密码登录

2、快捷登录,前提是你本地已有qq账号登录中

和前面一样,还是先到qq邮箱登录首页,审查页面元素,找到我们进行登录操作所相关的链接、按钮或是输入框。

QQ邮箱登录首页:https://mail.qq.com/

打开登录页,可以看到两种登录方式选择,如下图:

   

审查页面元素,发现快速登录方式,对应ID为“qlogin_list“的一个div,而账号、密码登录方式对应ID为“web_login”的一个div,且这两个div元素都位于ID为“login_frame"的iframe的内嵌html中,如下:

对于快速登录方式,若当前已有qq账号在登录中,在"qlogin_list"下会有一个<a>链接元素,否则没有,因此通过对于该元素的判断,可以实现优先选择快速登录方式,直接点击该链接即可。

对于账号、密码登录,方法同博客园登录一样,找到用户名、密码的对应元素,实现填充后点击登录按钮即可。

登录成功后,可通过browser对象的cookies属性获取当前cookie。Splinter有一个CookieManager对象,该对象为dict类型,并持有添加、删除cookie的方法,具体如下:

cookie_manager.add({‘name‘: ‘Tony‘})    # 增加一个cookie

cookie_manager.all()   # 获取所有cookie

cookie_manager.delete()  # 删除所有cookie
cookie_manager.delete(‘name‘, ‘birthday‘,‘favorite_color‘)  # 删除这三个cookie
cookie_manager.delete(‘name‘)  # 删除一个cookie,cookie的名字为“name”

Splinter为Browser对象提供了get_iframe()方法,用于获取iframe,可通过iframe相关的id,name, 或是index进行查找。

具体参考代码如下:

 1 def qq_mail_login(username=None, password=None):
 2     """
 3     模拟登录QQ邮箱,账号密码登录
 4     :param username:
 5     :param password:
 6     :return:
 7     """
 8
 9     url = "https://mail.qq.com/"
10     browser = Browser()
11     browser.visit(url)
12     time.sleep(5)
13
14     with browser.get_iframe("login_frame") as iframe:
15         ‘‘‘
16         if username is None and password is None:
17             # 切换到"快速登录"
18             div = iframe.find_by_id("qlogin_list").first
19             div.find_by_xpath("a")[0].click()
20         else:
21             # 利用账号,密码登录
22             iframe.find_by_id("u").first.fill(username)
23             iframe.find_by_id("p").first.fill(password)
24             iframe.find_by_id("login_button").first.click()
25         ‘‘‘
26         # 优先选择"快速登录"
27         div = iframe.find_by_id("qlogin_list").first
28         try:
29             quick_href = div.find_by_xpath("a")
30             quick_href.first.click()
31         except exceptions.ElementDoesNotExist, e:
32             print e.message
33             # 利用账号,密码登录
34             iframe.find_by_id("u").first.fill(username)
35             iframe.find_by_id("p").first.fill(password)
36             iframe.find_by_id("login_button").first.click()
37         time.sleep(10)
38
39     for k, v in browser.cookies.all().iteritems():
40         print k, ":", v

qq_mail_login

时间: 2024-10-22 05:12:43

Splinter学习--初探3,两种方式登录QQ邮箱的相关文章

「linux学习」之两种方式yum搭建

方式一本地yum源配置: mkdir /mnt/cdrom/ 将/mnt/cdrom/目录称为 /dev/cdrom 的挂载入口 执行挂载命令 mount /dev/cdrom  /cdrom/mnt/ # mount: /dev/sr0 写保护,将以只读方式挂载 挂载后查看目录文件: ls /mnt/cdrom 挂载成功后使用 rpm -qa | grep rpm 查看所有rpm的包,选取需要的安装 rpm -ivh /mnt/cdrom/Packages/rpm+tab键自动补齐,这里需要注

spring学习一——基本搭建,属性注入的两种方式

今天用spring 3.2.5搭建了基本的环境,spring出的太快了,前段时间才3.2.5,今儿个一瞧已经上了4的版本了,稍后给出spring的jar下载地址,毕竟现在官网上找不到了啊. 废话少说了,spring 3.2.5已经将所有的依赖包都放在了dist的lib下面,并且都有doc包和源码包,很是方便.先导入所需的jar包:core,context,beans,expression 四个jar包,除此之外,还需导入commons-logging. 下一步,新建xml文件,建议名称为 app

MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

先来张在路上-- 此项目是用Maven创建的,没有使用Maven的,自己百度.谷歌去:直接用Junit测试就行,先执行里面的save方法,添加10000条测试数据提供各种聚合查询等. 废话不多说,上干货-- 一.MongoDB数据库的配置(mongodb.xml) 以下是我自己的配置,红色字体请改为自己本机的东东,你说不懂设置端口,不会创建数据库名称,不会配置用户名密码,那有请查阅本系列的第4节(MongoDB的使用学习之(四)权限设置--用户名.密码.端口==),你说懒得设置,那就@#¥%--

cmd窗口使用sftp命令非密钥和密钥登录SFTP服务器的两种方式

cmd窗口使用sftp命令非密钥和密钥登录SFTP服务器的两种方式 一.在Windows环境下搭建SFTP服务器可参见http://www.cnblogs.com/Kevin00/p/6341295.html 二.非密钥登录 0.Bitvise SSH Server服务器 1.Win + R 进入cmd窗口. 2.登录命令:sftp -P 28 [email protected] 说明:-P 端口参数 28是端口,默认端口是22   kevin是登录的用户名,127.0.0.1是SFTP服务器的

Cocos2d-x学习笔记(五岁以下儿童) 精灵两种方式播放动画

 这几天在看控件类,临时没有想好实际运用的方向.单纯的创建网上已经有非常多这方面的样例,我就不写了.接下来是学习精灵类.精灵类若是单独学习也是非常easy.于是我加了一些有关动画方面的知识点与精灵类一起使用.让精灵播放简单的帧动画. 首先我们准备好动画素材,我在网上下了一个小游戏.将里面的素材做成了png和plist大图以供程序调用.我是用TexturePackerGUI来生成plist的.我选的是一个简单的待机动作,我们的目的就是让这张图动起来~ 第一种方式:使用CCSpriteFrame

菜鸟学习Spring——SpringMVC注解版前台向后台传值的两种方式

一.概述. 在很多企业的开法中常常用到SpringMVC+Spring+Hibernate(mybatis)这样的架构,SpringMVC相当于Struts是页面到Contorller直接的交互的框架也是界面把信息传输到Contorller层的一种架构,通过这个架构可以让我们把页面和Contorller层解耦,使得开发人员的分工更加明确. 二.代码演示. 1.首先配置SpringMVC环境. 1.1导入jar. 值得注意的是红色标记的commons-logging这个jar包一定得引入进去不然会

java基础知识回顾之java Thread类学习(三)--java线程实现常见的两种方式实现好处:

总结:实现Runnable接口比继承Thread类更有优势: 1.因为java只能单继承,实现Runnable接口可以避免单继承的局限性 2.继承Thread类,多个线程不能处理或者共享同一个资源,但是实现Runnable接口可以处理同一个资源. 下面我们做个测试:验证下.车站的售票系统售票的例子,车站的各个售票口相当于各个线程,我们先使用第一种方法几继承Thread类的方式实现: 代码如下: package com.lp.ecjtu.Thread; /** * * @author Admini

钉钉扫码登录网站(两种方式实现)

原文:钉钉扫码登录网站(两种方式实现) 钉钉扫码登录网站(两种方式实现)# 效果:# 源代码地址:https://github.com/jellydong/DingQrCodeLogin 动手敲代码!# 第一步,钉钉后台配置 参考链接:获取appId及appSecret. 点击进入钉钉开发者平台 的页面,点击左侧菜单的[移动接入应用-登录],然后点击右上角的[创建扫码登录应用授权],创建用于免登过程中验证身份的appId及appSecret,创建后即可看到appId和appSecret. 这里因

react学习笔记1之声明组件的两种方式

//定义组件有两种方式,函数和类 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } class Welcome extends React.Component{ render(){ return <h1>Hello, {this.props.name}</h1>; } } ReactDOM.render( <Welcome name="kevin"/&g