webdriver in action(两年多以来的零碎使用经历)

写于2015年1月14日
    我讲的经历是我个人的,也许与别人有雷同;我讲的技术,更是到处都可以搜到。写下这篇文字,目的在于记录,在于备忘。
废话不多说,直接上干货。

开发经历:

    2013年年初,有个项目爬取ICP备案查询网站的信息,当时用到httpclient,可是这个网站需要突破验证码,甚为麻烦,所幸验证码较为简单,于是在tesseract基础上二次开发了一套识别验证码的方案,正确率大概20%(已经不错了,毕竟不能跟UU打码比);当时为了防止被icp网站屏蔽,考虑进行时间间隔控制,但效果不甚好,而且post提交效果太差,很麻烦。总监推荐了webdriver。简单了解了下,发现的确是我的菜。
     webdriver是在 Selenium基础上进行封装的,个人感觉类似solr之于lucene。Selenium大名鼎鼎,做测试的工程师都知道。webdriver更加容易理解和使用,对java支持的也很好。于是改造了下就拿来用,效果很好,驱动firefox很流畅,因为ICP备案查询对速度要求不高,所以用起来还是很符合预期的。
    再过几个月,网监系统上马。其实这个ICP备案查询的项目就是为网监服务的,提供基础数据。网监有一块功能是需要截图取证,自然又想到webdriver,谁叫它能自动打开浏览器的呢?简单开发了下,居然成了,效果还不错。在客户端启动一个截图服务,服务端直接调用即可。
    时间到了2014年,需要做一个采集淘宝/天猫数据的项目。阿里还是很彪悍的,采集量一旦过大,就会被屏蔽,虽然httpclient模拟浏览器效果已经很好,但是和真是浏览器还是有差距的。于是又想到webdriver,这次由于对速度还是比较在意的,所以优先考虑了HtmlUnitDriver,不过实际体验感觉跟httpclient差不多,于是继续用FirefoxDriver,这次加入了一些配置,比如不显示图片(加快响应速度),以及模拟人工干预,遇到一直加载不完的网站,直接kill掉。
    期间又做了个模拟点击百度推广链接的程序,二话不说,继续webdriver,不过这次又加入了其他配置,比如创建代理(使用代理IP和端口)。
    然后是2015年了,就是最近几天,又做了一个小程序,继续用webdriver。
    个人觉得,webdriver虽然起初是用来做自动化测试的,但是实际工作中,面对一些特殊场景,应用在开发里效果很好的。对采集效率要求不太高的情况下,可以当做爬虫来用,截图也可以用,爬取懒加载网站可以用,爬取ajax可以用。没办法,谁叫它所见即所得。

技术摘录:

    1,初始化

    FirefoxDriver driver = new FirefoxDriver();//这个是初始化火狐浏览器,也是三大浏览器里最快的,推荐

    2,带有配置的初始化

    FirefoxProfile profile = new FirefoxProfile();
    profile.setPreference("permissions.default.image", 2);//不加载图片
    profile.setPreference("network.proxy.type", 2);//自动代理
    profile.setPreference("network.proxy.autoconfig_url", ip);//代理的ip和端口号
     FirefoxDriver    driver = new FirefoxDriver(profile);

    3,窗口切换

    String winHandleBefore = driver.getWindowHandle();
    driver.switchTo().window(winHandle);
    driver.switchTo().frame(0);//切换到iframe

    4,截图

   其实不是wendriver的技术:
    try{
            //拷贝屏幕到一个BufferedImage对象screenshot
            BufferedImage screenshot = (new Robot())
                    .createScreenCapture(new Rectangle(0, 0,
                            (int) d.getWidth(), (int) d.getHeight()-40));
            serialNum++;
            //根据文件前缀变量和文件格式变量,自动生成文件名
            String name = fileName + String.valueOf(serialNum) + "."
                    + imageFormat;
            File f = new File(name);
            System.out.print("Save File " + name);
            //将screenshot对象写入图像文件
            ImageIO.write(screenshot, imageFormat, f);
            System.out.print("..Finished! ");
        } catch (Exception ex){
            System.out.println(ex);
        }

    5,firefox版本

    webdriver只支持旧版本firefox浏览器,个人一直使用20.0版本,比较快,建议配置里关闭自动升级。

    6,强制关闭firefox

    利用JNI调用cmd强制关闭:
    String exe = "firefox.exe";
    Htmltools.execCmd("Taskkill /IM " + exe);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值