前端测试 还没被玩坏的 robobrowser(8)——robobrowser 的实现原理

乙醇 · 2015年01月10日 · 最后由 恒温 回复于 2015年01月11日 · 1290 次阅读

背景

学习使用工具实际上不难,不过我们应该通过阅读工具源码来提升自己的水平。

多读代码,读好代码。很不错,robobrowser 的代码简单易懂,值得学习。

预备知识

要点

  • RoboState 类里,页面上内容的抓取和处理实际上委托给了 BeautifulSoup。RoboState 类的_parsed 对象实际上就是 BeautifulSoup 的实例;

  • RoboState 类中保存了每个请求的响应内容——response.content;

  • RoboBrowser 类里,发送请求的方法实际上委托给了 requests 类——session;

  • RoboBrowser 类里比较复杂就是保存每次访问的状态,以及实现 back 和 forward 功能。其主要思想是把所有的访问历史都放在内存里,然后通过游标去访问;

  • 每次页面发生变化,也就是 open 和 submit_form 之后都会调用_update_state 方法去更新当前状态;

流程梳理

  • RoboBrowser() 实例化的时候,会 new 1 个 requests 的 session 用于发送 http 请求,同时初始化游标为-1 并且当前的 status 列表初始化为空;

  • RoboBrowser.open(url) 方法调用时,session 对象会访问具体的 url,然后更新游标和 status 列表。基本思想是往 status 列表里 append 1 个新 new 出来的 RoboState 对象;

  • RoboBrowser.find() 方法调用时,使用当前游标处的 state 对象的_parsed 对象的 find 方法去抓取页面内容,实际上就是 BeautifulSoup 的 find 方法;

讨论

从 robobrowser 的代码里我们可以看出来,对于测试框架或者具体的业务来说,发明轮子实际上是不太可取的。用最好的第三方库去做它们最擅长的事情才是王道。robobrowser 里请求的发送归 requests 负责,页面的解析由 BeautifulSoup 去管理,相得益彰。

另外 RoboBrowser 类中使用了委托模式,请求的发送委托给 requests 对象,页面解析委托给 BeautifulSoup 对象。

写在最后

新人往往纠结于读什么代码可以让自己进步。robobrowser 的源码很适合新人去读,相信读过之后会很有收获。

本教程旨在抛砖引玉,错误的地方还请多多指正。

全文完。

文本版权归乙醇所有,欢迎转载,但请标明出处。

共收到 1 条回复 时间 点赞

有空帮你做个合集

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册