前两天,想抢购一个小米MIX,结果,一开始抢就没有了。于是想,作为程序猿,总得有点特殊手段吧,比如说一个小脚本。最近在学习python,百度了一下,发现了Splinter这个强大的东东!用了不到两小时的时间,就可以实现许多令人点赞的功能,真让人很兴奋呐!

首先,官网(https://splinter.readthedocs.io/en/latest/index.html)介绍,一句话,一个开源工具用来通过python自动化测试web,让电脑自动操作网页:

Splinter is an open source tool for testing web applications using Python. It lets you automate browser actions, such as visiting URLs and interacting with their items.

既然可以自动操作网页,当然不局限于自动化测试喽!

第一步,下载Splinter模块和Chrome或FireFox的驱动(就是强大的开源web自动化测试框架selenium的驱动

Splinter模块是python egg,下载当然很简单:pip install splinter

由于基于selenium,所以,FireFox和Chrome的驱动,都依赖于pip install selenium,不过好像执行pip install splinter之后默认就已经安装了,没有的话再安装一下。

我这个用Chrome的驱动chromedriver,注意版本要对应,不然基本上会有unknown error,打不开浏览器!

官网下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads  当然这里需要可以连接上google!

selenium 3.x开始,webdriver/firefox/webdriver.py的__init__中,executable_path="geckodriver",所以火狐浏览器需要这个驱动!

下载地址:https://github.com/mozilla/geckodriver/releases/

上述驱动也可以在selenium官网中查找并下载:http://docs.seleniumhq.org/download/

下载之后,放在任意目录,配置该目录到系统环境变量的path中,让电脑可以找到即可:
 

这样,Splinter就可以自动打开浏览器,并进行操作了!

另外注意:1. Splinter的Browser类默认优先调用的驱动是firefox,所以用chrome的话需要在初始化Browser时候指定driver_name="chrome"参数,建议都明确指定浏览器!
     2. 如果chrome或者firefox的安装目录不是默认目录,selenium可能会找不到浏览器,此时只要把浏览器的安装路径配置在电脑的path路径中,让selenium可以自动找到即可!
     例如报错:

WebDriverException: Message: Expected browser binary location, but unable to find binary in default location, no 'moz:firefoxOptions.binary' capability provided, and no binary flag set on the command line

第二步,你可以根据官网的例子用python IDLE运行,打开浏览器并进入指定网页,操作网页。

我这边有写了一个自动登录163邮箱的小脚本:
  1) 创建一个Browser实例,就会打开相应的浏览器。
  2) visit(url): 故名思议,访问指定网站
  3) find_by_id("控件的id").first: 根据控件的属性id找到控件,一般控件都有独立唯一的id。不然,Splinter api还提供by_name,by_id,by_tag等方法!first表示返回第一次找到的控件。
  4) fill("要填充的内容"): 用指定的内容填充相应控件
  5) click(): 点击控件   
  6) 登录后,browser.cookies.all()中保存了本次登录的cookie信息(dict类型),可以打印出来或者保存下次使用
7) quit_browser(browser)函数: 要求用户交互输入q再退出。否则,程序跑完之后就直接退出了,释放Browser的实例,调用quit()方法,浏览器也就关闭了。
#coding:utf-8
from splinter import Browser
import time, threading
def qq_mail_login(url=None, username=None, password=None):
with Browser(driver_name="chrome") as browser:
browser.visit(url)
browser.find_by_id(u"userNameIpt").first.fill(username)
browser.find_by_id(u"pwdInput").first.fill(password)
browser.find_by_id("btnSubmit").first.click() for k, v in browser.cookies.all().items():
print (k, ":", v) quit_browser(browser)
def quit_browser(browser=None):
flag = input("Input q when you want to quit: ")
if 'q' == str(flag):
quit(browser) if __name__=='__main__':
url="http://email.163.com/"
username="你的邮箱地址"
password="你的邮箱密码"
#t1 = threading.Thread(target=qq_mail_login,args=(url,username,password))
#t1.start()
#t1.join()
qq_mail_login(url,username,password)

运行效果就是,你什么都不用管,可以自动用指定浏览器打开你的邮箱:

 

第三步,好了,言归正传,splinter这么强大,肯定不仅仅能做用来打开邮箱这么简单事情。下来就想想,怎么用它来抢东西吧!
    于是,对上述代码稍作修改:首先,登录小米官网,登录后,模拟点击去抢购即可。
    在购买界面,J_chooseResultInit控件,是下一步操作的按钮,在货物不足的时候是隐藏的,所以,我这里用一个while循环,每10秒检查一次,一直等待该按钮可用。之后点击进行下一步购买操作:
#coding:utf-8
from splinter import Browser
import time, threading
def qq_mail_login(url=None, username=None, password=None):
with Browser(driver_name="chrome") as browser:
browser.visit(url[0])
#进入登录界面
browser.click_link_by_href("//order.mi.com/site/login?redirectUrl=http://www.mi.com/")
#输入用户名密码,完成登录
browser.find_by_id(u"username").first.fill(username)
browser.find_by_id(u"pwd").first.fill(password)
browser.find_by_id("login-button").first.click()
time.sleep(1)
#进入购买界面
browser.visit(url[1])
#点击购买“下一步”
count = 1
while not browser.is_element_not_present_by_id('J_chooseResultInit'):
print ("第",count,"次: ",browser.is_element_not_present_by_id('J_chooseResultInit'))
time.sleep(10)
count += 1
browser.find_by_id("J_chooseResultInit").first.click()
quit_browser(browser) def quit_browser(browser=None):
flag = input("Input q when you want to quit: ")
if 'q' == str(flag):
quit(browser) if __name__=='__main__':
url=["http://www.mi.com/","http://item.mi.com/buyphone/mix/"]
username="你的用户名"
password="你的密码"
#t1 = threading.Thread(target=qq_mail_login,args=(url,username,password))
#t1.start()
#t1.join()
qq_mail_login(url,username,password)
因为现在只能进入到这个购买界面,也不知道下个界面有什么控件,所以该例子只是为了学习强大的splinter工具包!至少可以做些日常生活中的小工具嘛!
真想做好抢购工作,当然还有一个重要的问题是图片验证码的处理。最理想的是多线程模拟请求发送,不过需要事先抓包构造请求数据,还是比较麻烦的。
不过现在网上都有或多或少的解决方案,感兴趣的话,我会继续研究并持续更新,不过这篇博客还是为了学习为主哦!
玩蛇网有一篇抢购火车票的帖子,我觉得也蛮不错的,可以参考:http://www.iplaypython.com/news/a260.html

Splinter学习——不仅仅是自动化测试哦的更多相关文章

  1. Splinter学习--初探1,模拟百度搜索

    Splinter是以Selenium, PhantomJS 和 zope.testbrowser为基础构建的web自动化测试工具,基本原理同selenium 支持的浏览器包括:Chrome, Fire ...

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

    目前,qq邮箱的登录方式有: 1.利用账号.密码登录 2.快捷登录,前提是你本地已有qq账号登录中 和前面一样,还是先到qq邮箱登录首页,审查页面元素,找到我们进行登录操作所相关的链接.按钮或是输入框 ...

  3. Selenium学习笔记(1) - 自动化测试体系与原理

    技术体系 基于代码的测试(Code-Based Testing) 基于协议的测试(Protocol-Based Testing) 基于界面的测试(GUI-Based Testing) 工作原理 基于代 ...

  4. Python学习总结 10 自动化测试Selenium2

    一, 配置 Selenium2 1 Selenium是什么? Selenium是一个用于Web应用程序测试的工具.Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括I ...

  5. 持续集成学习5 jenkins自动化测试与构建

    一.jenkins参数 1.主要参数类型 2.触发构建参数 3.参数值的使用 4.给git仓库配置参数,让其构建的时候可以选择分支 5.配置password参数 6.添加Choice参数 7.其它好用 ...

  6. 在做自动化测试之前你需要知道的,转自:http://www.cnblogs.com/fnng/p/3653793.html

    什么是自动化测? 做测试好几年了,真正学习和实践自动化测试一年,自我感觉这一个年中收获许多.一直想动笔写一篇文章分享自动化测试实践中的一些经验.终于决定花点时间来做这件事儿. 首先理清自动化测试的概念 ...

  7. 基于python的接口测试学习笔记一(初出茅庐)

    第一次写博客笔记,讲一下近来学习的接口自动化测试.网上查阅了相关资料,最后决定使用python语言写接口测试,使用的是python的第三方库requests.虽然python本身标准库中的 urlli ...

  8. Python3+Selenium2完整的自动化测试实现之旅(五):自动化测试框架、Python面向对象以及POM设计模型简介

    前言 之前的系列博客,陆续学习整理了自动化测试环境的搭建.IE和Chrome浏览器驱动的配置.selenium-webdriver模块封装的元素定位以及控制浏览器.处理警示框.鼠标键盘等方法的使用,这 ...

  9. 浅谈UI自动化测试

    最近一直在学习python,正好部门技术结构调整,就开始了点工向UI自动化测试的转变,我要说瞌睡来了就掉枕头么? 不过还好,可以将python的学习成果在自动化测试中实践... 1.about自动化测 ...

随机推荐

  1. C#面向对象设计模式纵横谈——6.Prototype 原型模式(创建型模式)

    动机(Motivation) 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作.由于需求的变化,这些对象经常面临着剧烈的变化,但他们却拥有比较稳定一致的接口. 如何应对这种变化?如何向“客户程 ...

  2. php截取中文无乱码

    在PHP中需要对字符串进行截取,如果没有装mb扩展(mb_substr函数),对中文截取就需要进行相应的处理.下面是对字符串 "世s界s的功s\\\夫萨的mn是非得失sdf dsf dsf ...

  3. wpf 遍历控件及其值

    /// <summary> /// 遍历控件及其值 /// </summary> /// <param name="uiControls">界面 ...

  4. Emotion Debt 2017/1/6

    原文 We can't move beyond the past until our emotional debts are paid. Many people today live under th ...

  5. Python Day18

    WEB框架 MVC Model View Controller 数据库 模板文件 业务处理 MTV Model Template View 数据库 模板文件 业务处理 Web请求流程 -- 原始Web ...

  6. WPF 控件总结

    内容控件:1.Button:当Button.IsCancel="True"时,点击按钮,对话框关闭.当Button.IsDefault="True",按回车触发 ...

  7. 安装出现了error launching installer

    安装geany时,出现问题: 两种解决方法: 解决的办法是: 在控制面板中寻找"区域.语言设置"--管理--更改系统区域设置--中文(简体.中国),确定退出即可! 但是....我不 ...

  8. JS-时间函数

    /** * 日期范围工具类 */ var dateRangeUtil = (function () { /*** * 获得当前时间 */ this.getCurrentDate = function ...

  9. GOPATH 使用总结

    GOPATH 环境变量用于指定这样一些目录:除 $GOROOT 之外的包含 Go 项目源代码和二进制文件的目录.go install 和 go 工具会用到 GOPATH:作为编译后二进制的存放目的地 ...

  10. [Python] from scipy import sparse 报 DLL load failed:找不到指定模块错误

    依赖vc运行环境.需要安装 vc_redist Py3.5要安装2015版 传送门: https://www.microsoft.com/zh-CN/download/details.aspx?id= ...