• Splinter学习——不仅仅是自动化测试哦


      前两天,想抢购一个小米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
  • 相关阅读:
    json和xml以及ajax的数据格式用法
    关于PHP数据库mysql的一些案例
    PHP的一些语句 if...else...elseif
    Python中的流程控制(if、while、for)
    Python获取当前系统时间
    Python中格式化输出的三种方式
    Python中如何修改文件
    Python的五大数据类型的作用、定义方式、使用方法
    了解Python
    ~
  • 原文地址:https://www.cnblogs.com/yuanzhaoyi/p/6085123.html
Copyright © 2020-2023  润新知