07 2011 档案
摘要:前几天在《戏说设计模式》这篇文章中看到了一段关于组合模式的描述:COMPOSITE—Mary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己挑。”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。” “……”,MM都会用Composite模式了,你会了没有?这个例子还是比较通俗的解释了合成模式的。所谓合成模式就是指将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模
阅读全文
摘要:昨天因为要装watir-webdriver的原因将用了快一年的ruby1.8.6升级到了1.9。由于1.9是原生支持unicode编码,所以我们可以使用中文进行自动化脚本的编写工作。做了简单的封装后,我们可以实现如下的自动化测试代码。请注意,这些代码是可以正确运行并作为正式的自动化测试用例的。1 测试浏览器 = Watir::Browser.new :firefox2 测试浏览器.转到 'www.google.com'3 在(测试浏览器.的.text_field(:name, "q")).中.输入 "qq"4 点击 测试浏览器.的.but
阅读全文
摘要:bluecloth是一种ruby语言实现的text to html转换器。关于bluecloth的介绍如下:BlueCloth is a Ruby implementation ofMarkdown, a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).bluecloth作为老
阅读全文
摘要:AutoIt是windows上强大的自动化工具。我们可以通过ruby去调用AutoItX3.dll来使用autoit的部分功能。具体代码如下1require'win32ole'2at=WIN32OLE.new('AutoItX3.Control')34#然后就可以使用5at.WinWait6at.Send
阅读全文
摘要:昨天在stack overflow上问了2个关于Rspec源码的问题,结果由于表意不清加之问题含糊被老外鄙视了一遍。但是没有想到的是,竟然还是高人非常清楚的问答了出来。其中一个问题是这样的:classOptionParser<::OptionParser这句代码究竟是什么意思?原来这句话的作用是定义1个OptionParser类,其集成至ruby核心库的OptionParser。这句话里面的::表示强制使用核心库的namespace。万恶的ruby语法。
阅读全文
摘要:从上一篇博文我们可以看出,策略模式的策略类实际上就是一组实现特定功能的代码集合。而ruby实际上已经原生提供了操作一组代码集合的对象,Proc类。于是我们可以用更加ruby些的方式来实现我们的Report类和策略模式。具体代码如下:classReportattr_reader:title,:textattr_accessor:formatterdefinitialize&formatter@title='Myreporttherubyway'@text=['Thisisareport','whichwaswritten','int
阅读全文
摘要:我们经常要在子类的initialize方法中调用super和super()。从语法上说super和super()是有微妙区别的。super不带括号表示调用父类的同名函数,并将本函数的所有参数传入父类的同名函数;super()带括号则表示调用父类的同名函数,但是不传入任何参数;演示代码如下:1classSParent2definitialize*args3args.each{|arg|putsarg}4end5end67classSChild<SParent8definitializea,b,c9super10end11end1213a,b,c=*%W[abc]14SChild.newa,
阅读全文
摘要:默认情况下使用selenium或者waitr webdriver启动浏览器,浏览器中保存的cookie是不可访问的。为什么要保留浏览器中的cookie呢?这是因为有些站点登陆时候有验证码或动态密码验证。一般情况下selenium或watir webdriver是无法获取动态密码或验证码自动完成登陆的。那么使用动态密码或验证码的网站我们就无法自动化测试了么?答案是不一定,因为有些网站登陆后会在cookie中写入当前用户的登录态,于是只要登陆一次该站点,那么下次访问的时候就不需要再登陆了。因此我们需要让浏览器为我们保存cookie以使得我们可以不需要登陆站点就能进行自动化测试。但是selenium
阅读全文
摘要:观察者模式应该是最容易理解的设计模式了。考虑这个例子。作为雇员的你当工资发生改变的时候你会想到什么?请朋友吃饭?给女朋友买衣服?给自己买台Iphone4?很可惜,你所增加的那点可怜的工资恐怕难以支持你做以上这些事情吧。当你工资增加之后,你的个人所得税理所当然的增加了;你的住房公积金提高了;你的社保不出意外也要多交了。剩下来的那点应该也不够塞牙了。这个理应是喜剧的杯具中实际上包含了观察者模式的基本概念。在这个例子中,社保局、税务局实际上是你的观察者。当你的工资发生变化时,你(一般来说是你的雇主)会通知有关部门,以便有关部门能够根据你的收入调整税收或社保政策。下面的代码(使用ruby1.9实现,1
阅读全文
摘要:一般来说,观察者模式的定义应该是这样的:building a clean interface between the source of news that some object has changed and the consumers of that news。观察者模式在消息的生产者和消费者之间建立了clean interface,这样就使得消息的生产者和消费者之间的耦合是抽象的。被观察者可以不认识任何一个的观察者,它只知道他们都实现了一个共同的接口。由于观察者和被观察者没有紧密的耦合在一起,所以他们可以属于不同的抽象层次。观察者模式支持广播通信,被观察者会向每个注册了的观察者发送广播
阅读全文
摘要:好像网上一直没有比较详细的中文资料来讲述如何使用cakephp来实现i18n。正好昨天被逼无奈的将代码中的提示中文化了一把,略有心得,简而志之。中文化cakephp有如下几步:1,在代码中使用__()函数。在需要进行中文化的地方使用__()函数,如下所示:__('This is the string i need to translate', true);将第2个参数置为ture,这样如果有相对应的翻译词条的话那么翻译过的词条将输出,否则会输出未翻译的词条。2,执行i18n task如果你的代码中存在__()函数的话,你就可以执行i18n task来进行代码扫描了。i18n t
阅读全文
摘要:原本以为要自己写helper去截取中文字符串,没想到cakephp的Text helper类中已经提供了truncate方法。下面是truncate方法的原型。truncatetruncate(string $text, int $length=100, array $options)Cuts a string to the $length and adds a suffix with ‘ending’ if the text is longer than $length. If ‘exact’ is passed as false, the truncation will occur aft
阅读全文
摘要:众所周知php原生函数substr是不支持截取中文字符串的。下面的代码提供了多种截取php中文字符串的方法。1. 截取GB2312中文字符串<?php< ?php//截取中文字符串function mysubstr($str, $start, $len) { $tmpstr = ""; $strlen = $start + $len; for($i = 0; $i < $strlen; $i++) { if(ord(substr($str, $i, 1)) > 0xa0) { $tmpstr .= substr($str, $i, 2); $i++;
阅读全文
摘要:写过java的同学一定对java中无处不在的设计模式印象深刻。相比较而已ruby在设计模式这一块就显得稍微有些拿不出手了。作为一门动态到极致的语言,设计模式在ruby中的应用可能不太传统,有些许的变种。但万变不离其宗,在这里我们就通过一些ruby代码所描述的例子来理解和学习一些基本的设计模式。注:本文中所有例子及代码均来自ruby design pattern一书,无任何本人原创,请勿对本人产生个人崇拜。从这里开始:模板模式。下面的代码实现了一个简单的模板,代码通俗易懂,应该很好理解。class Report def initialize @title = 'Monthly Repor
阅读全文
摘要:strategy.txt模板模式固然不错,但其还是有一些缺陷的。比如其实现依赖于继承并且缺足够的灵活性。在这时候我们就需要找到一个更加优化的解决方案——策略模式。下面是使用策略模式实现的Report模板1#encoding:utf-823classFormatter4defoutput_reporttitle,text5raise'cannotcallAbstractmethod'6end7end89classHTMLFormatter<Formatter10defoutput_reporttitle,text11puts'<html>'12p
阅读全文
摘要:今天将waitr代码移植至watir-webdriver时,发现watir-webdriver的Select.select(text)方法似乎不支持中文的text。也就是说watir-webdriver的select方法无法选择中文的option。研究了一下源码发现Select.select方法是这样实现的: 1 def select(str_or_rx) 2 select_by :text, str_or_rx 3 end 4 5 #select方法又调用了select_by方法 6 def select_by(how, str_or_rx) 7 assert_exists 8 9 case
阅读全文
摘要:在gem 安装完watir-webdriver后,默认情况下chrome浏览器的支持是没有安装上的。所以如果要使用webdriver测试chrome的话,我们需要手动安装chrome支持。RequirementsThe ChromeDriver controls the browser using Chrome's automation proxy framework. Consequently, the ChromeDriver is only compatible with Chrome version 12.0.712.0 or newer.从官方文档上可以看出,chrome d
阅读全文
摘要:今天在本地的gem list中发现了1个叫做rautomation的扩展,仔细一看原来这是个使用watir的语法进行windows程序测试的工具库,不敢独享,略志一二。首先看一下rautomation的简介RAutomation is a small and easy to use library for helping out to automate windows and their controls for automated testing.RAutomation是个小巧易用的工具库,其主要用来进行windows窗体和控件的自动化测试工作。RAutomation的特点Easy to u
阅读全文
摘要:最近在把watir代码移植到watir-webdriver。移植过程中发现了,也总结了一些经验,志之并分享。webdriver的wait方法。watir的wait方法是稳定且smart的,基本上调用browser.wait方法是可以保证浏览器渲染并加载dom完毕的。但是webdriver的wait方法却不是这样。watir-webdriver的wait方法仅仅是等待浏览器状态栏出现compelete状态。在有些情况下,出现compelete状态后,浏览器还是没有加载完成的,这就导致页面上一些对象无法定位。解决方法:可以在操作元素前调用element.waituntilpresent方法,该方法
阅读全文
摘要:最近将watir更新到了1.9.1,忽然发现以前承诺的带大家读waitr源码的”夸夸其谈”还尚未实现,甚表歉意,暂且先说明一下watir定位(locate)元素的基本原来,聊以将功补过。以下说明均以watir 1.9.1为例。在这里建议大家最好将watir升级到最新版本,因为最新版本增加了对IE9的支持,尽管支持的不是很全面,但聊胜于无,优势总是有的。在watir的源码中找到locator.rb文件。该文件一般位于your_disk:\Ruby192\lib\ruby\gems\1.9.1\gems\watir-1.9.1\lib\watir\目录下。locator文件定义了1个Locator
阅读全文