Project Euler 8解题报告

 

Find the greatest product of five consecutive digits in the 1000-digit number.

中文题目:找出以下这个1000位的整数中连续5个数字的最大乘积。

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

分析:

from string import whitespace 
from operator import mul 
data = open('/tmp/data') # Number pasted to file. 
nos = [int(c) for line in data for c in line if c not in whitespace] 
print max([reduce(mul, nos[i:i+5]) for i in range(len(nos)-5)]) 

阅读全文 »

python闭包(closure)

python闭包(closure)其实并不是什么很复杂的东西,其定义是:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变量)对于“外层”包含它的函数而言,是本地变量。

简单的闭包例子:

def add(num):

   def add_inner(num_inner):

       return num+num_inner

   return add_inner

 

执行p=add(23)将会产生内层函数add_inner的一个闭包,这个闭包在内部引用了名字num,而num绑定到23上了。

test=add(20)

test1=add(20)

print test(100),test1(120)

 

阅读全文 »

python 菜谱(python cookbook) 1.8 判断一个字符集是否在另一个字符集中

挑战任务1:判断一个字符串是否在另外一个字符串中

对于处理一个字符串时候在另外一个字符串中,使用in是最简单的解决方案。

ast='a in b'

bst='this a in b only'

ast is in bst

挑战任务2:判断一个字符集是否在另一个字符集中

  • 简单的处理方法是判断每个出现在一个字符串的字符是否出现在一个字符串中

          for c in ast:

              if c in bst

                  ......

  • 另外set(集合)能很好的处理这个问题。

              set(ast).issubset(set(bst))

 

阅读全文 »

python 菜谱(python cookbook) 1.7 反转字符或者按照单词反转

 

挑战任务1:反转单个字符

切片方法是最好解决这个问题的办法,步长为-1的切片方法就能解决,但是需要注意的是字符串是不能修改,所以通过赋值(拷贝):

value=astring[::-1]

挑战任务2:按照单词反转

列表有内置的反转函数,所以首先能把,接着反转列表,接着拼接列表中的元素就能解决问题:

words=astring.split()         #一段字符串放入列表

words.reverse()                 #反转列表

' '.split(words)                    #拼接列表中的元素

挑战任务3:按照单词反转,但是还需要保持原来的空格符原样  “this  a top”->"top a  this"

上面这种方法虽然能实现反转,但是无法保持原来空格符原样,如果需要保持原来空格符原样的话,需要记住空格符的个数,正则能很好的实现这个目的。
import re
words=re.split('\s+',astring)     #切割
words.reverse()                        #反转列表
''.split(words)                            #拼接列表中的元素
 
上面的解决方案都是最基本的,各位可以通过更简洁的方式去实现,这个挑战就交给各位自己了!

阅读全文 »

快速深入一门语言的绝招

1.hello, world

目标:屏幕上打印出hello, world。
原因:不解释。

进阶:当命令行给与不同参数的时候,打印hello, 名字。给与开关的时候,打印hello, 123。

2.正则提取

目标:写一个正则表达式(或者类似的东西),从一段网页源码中找到某个标签的内容,去掉前后空格,显示。
原因:测试字符串处理能力。
进阶:支持正则扩展

3.扫描排重
目标:将某个目录和子目录下的所有文件扫描,排除重复的文件。
原因:测试文件系统操作能力。
进阶:多线程处理,注意吞吐颠簸。

4.做24点自动计算程序
目标:写一个程序,能够计算24点。要求能够自定义扩展算符。
原因:检查深度优先搜索,栈,结构设计,抽象处理能力等等。
进阶:做并发处理。有数种语言可能无法实现并发,或并发实现难度大,不美观,例如python。

5.做一个计算器
目标:做一个计算器,要求能计算1+2*3=7,并支持()。
原因:表达式解析和处理需要用到程序的方方面面,字符串处理等等。

进阶:做一个本语言的eval函数出来。

7.抓网页
目标:实现一个服务,定期下载符合规则的一批网页,解析,获得格式化的数据,并存入数据库。
原因:测试系统开发能力,基础网络库,字符串处理能力。
进阶:分布化抓取。

8.留言板
目标:设计一个留言板,将所有人提交的话保存起来,能一并展示。提交不需验证,展示不需分页。
原因:测试网络服务能力,数据库支持和多国语言支持。
进阶:防止XSS攻击。

9.异步大并发服务器
目标:设计一个异步http服务器,能对请求做出响应,添加,删除,修改数据库中的数据。不得使用现有的http框架和容器。
原因:集成性测试
进阶:不使用现有数据库,自己写一个。。。

 

 

 

 

转载自 shell's home

阅读全文 »

python科普(转自 潘俊勇)

python科普(转自 潘俊勇) 软件业的特点,就是层出不穷的新东东涌现。Windows早就革了DOS的命,浏览器差不多革了桌面软件的命,云计算准备再革所有软件的命,最后还追上个乔布斯说一切听他的。 动荡的软件界,让人眼花缭乱。这一切的后面,是失落的编程族:好容易才精通的东西,随之变得一钱不值。曾经的人才,如同数码产品般的迅速贬值。乃至好多人怀疑,编程是吃青春饭的行当。 在我前10年的编程经历里,重复着同样的杯具。Turbo C学完了,用Borland C,Visual C++太麻烦,开始用PowerBuilder快速开发,接上去Delphi、C++Builder、JBuilder,十八般武艺都学完了,结果又蹦出个新时髦。哪天有个终结?在软件的浪潮里,程序员太渺小了。我们害怕自己,会同过气的语言一样昙花一现,成为过眼烟云。 不是我见异思迁,而是潮流不可阻挡。但直至Python出现,故事开始转折。 起源于上世纪80年代末的Python语言(http://python.org),是一种开放源代码的解释型高级动态类型语言,语法简练、类库丰富,以开发效率高著称。 20多年的发展时间,Python是愈久弥香,经历住了时间的考验。Python是Goolge的三大语言之一;全球最大的视频网站YouTube,以及国内的豆瓣网也是采用Python开发;最新最热的行当中,python是往往web game的首选开发语言之一,谷歌和国内的易度云计算开发平台也都选择了Python语言。 这就是神奇的Python,在交错的语言大战中,Python却成为一颗长青树,不断焕发新的光彩。 而Python也成为我最近8年的编程生涯的主体,或许这将是我作为程序员的归属,一直走下去。让我们一起分享下这不一样的Python。 简单是硬道理 ==================== php被很多严肃的开发人员诟病,太简单、太脏了。然而php却被企业所喜欢,连yahoo和facebook都选择了php, php不断在发展,生命力异常旺盛。 为什么?因为简单。 程序语言,从机器语言到汇编,到高级语言,不就是简单在驱动吗?程序员也是人,需要更容易使用的语言。时髦点的话,就是语言也要多为咱程序员服务了,人机接口、用户体验要好。 因为简单,所以开发效率高;因为简单,所以容易阅读和维护;因为简单,所以不怕没人接手;因为简单,重构下也无妨;因为简单,项目经理就不必写伪代码了,直接Coding出框架代码吧. 简单带来的优势,是成指数级别增长。简单省了钱,加快的进度,减少的项目风险,首先老板会喜欢。简单是硬道理。.net同样是靠简单占领了不小的市场份额。 python语言最早设计指导思想之一,就是想提高代码的可读性。Python语言采用缩进来标识代码块,而Java采用的是配对的大括号来标识。不仅仅是排版更漂亮,Python的数据结构非常简单和统一,Python自带非常庞大的类库,很多东西拿来即可。这样,相同的逻辑,使用python可能只需要java五分之一的代码量。 很多软件爱拿自己 数百万行代码 出来说事,表明自己很强大。而在Python的世界里,人们在炫耀相同的功能后,喜欢说我只有几千行代码(比如Python上的对象数据库系统ZODB就只有不到5千行代码)。背后的意思是,放心用吧,有问题你也很容易维护这个系统;或者如果有时间,你自己也可以接管这个代码。 Pythonic之美 ====================== php靠一个 简单 占领了市场,php的哲学是quick and dirty;Python同样简单,但Python的哲学是Pythonic。Pythonic是什么?Pythonic是quick and not dirty,也就是quick and beautiful. 这个Pythonic之美,代表了程序员的素养和品味。什么是好的代码?什么是漂亮的代码?有一本书,叫做《unix编程艺术》,实际上一本对编程审美进行洗脑的经典书籍。而Python语言的设计理念,正符合了这种编程审美。因此,Python深受高端开发人员的喜欢,Python和他们有相同的文化。这如同,很多人将拥有Mac机作为自己审美品味的象征一样。 让我们再一次领略下Pythonic的禅意,它作为一个彩蛋隐藏在python的this模块:: import this 下面是我基于赖勇浩先生的首译,稍作更改后的翻译:: (让我们来说说该如何写代码:) 优美胜于丑陋, 清晰明了胜于晦涩, 简洁胜于复杂, 而复杂又胜于杂乱。 扁平胜于多层嵌套, 适当空行、错落有致胜于拥挤不堪, 可读性很重要。 虽然实用主义往往和上述规则矛盾, 但所有特例都不足以打破他们。 绝不要忽略异常(不写 except:pass), 除非你进行精准地捕获。 当你遇到含糊不清,不要尝试猜测可能, 一定有一种,而且绝对是唯一的一种明显的处理方法。 虽然你可能一开始很难找到这条路,除非你是 Python 之父。 现在就动手好过永远不做, 虽然不做通常好于蛮干。 实现方法如果难以表述,那这思路就肯定不对; 反之如果容易表述,那可能是个好想法。 命名空间是一个值得叫好的想法,我们应当多加利用。 Python宝库 =================== Python号称自带电池(Battery Included),也就是有强大的类库。 Python内建的类库就已经非常全面了。从web抓取,到xml解析,到嵌入式数据库,到压缩包的处理,到邮件协议,到json解析,而且不断在增长。 如果你还觉得不够,可到http://pypi.python.org上去找,这里有1万多种第三方的类库。从图片处理、到加密算法,到excel文件解析生成,到pdf文件转换,可谓应有尽有,无所不能。探访这里的乐趣,就如同海边拾贝,如同山间采菌,那种惊喜,那种 大国大民 的优越感,让你在心底涌现出投身Python的幸福,进而归属感倍增。 更重要的是,所有的这些宝贝,全部开源,而且大都是类 BSD协议的开源,您直接用于商业。有了这些,我会经常为自己选择了Python而庆幸,这使得我们像易度这样庞大的应用快速构建起来。 Python自带强大的包管理机制,简简单单一个easy_install命令,您就可以在线安装升级、卸载这些包。这类似debian/ubuntu的apt包管理机制一般方便。 全能选手 =============== 可能是因为Python语言练就了动态语言的以柔克刚、借力打力的太极推手功夫,加上Python简单导致的生产力指数级增长效应,Python应该是应用最全面的一种语言了。 从脚本、到web开发、到嵌入使用、到客户端、到云计算,python都干得不错。你只需要学会Python这一门语言,老板给你什么任务你几乎都能完成。让我们随着时间的年轮滚进,看看Python应乎潮流的72变。 操作系统脚本 ------- ...

阅读全文 »

Selenium私房菜系列8 -- Selenium RC服务器命令行参数列表

使用示例: java -jar selenium-server.jar [-interactive] [options] -port nnnn : selenium服务器使用的端口号(默认 4444) -timeout nnnn : 我们放弃前(超时)所等待的秒数 -interactive: 进入交互模式。参考 教程 获取更多信息 -multiWindow: 进入被测试网站都在单独窗口打开的模式,并且selenium支持frame -forcedBrowserMode browser : 设置浏览器模式(例如,所有的会话都使用 *iexplore ,不管给getNewBrowserSession传递什么参数) -userExtensions file : 指定一个被载入到selenium的JavaScript文件 -browserSessionReuse: 停止在测试间重新初始化和替换浏览器。 -alwaysProxy: 默认情况下,我们尽量少的进行代理;设置这个标志将会强制所有的浏览器通讯都通过代理 -firefoxProfileTemplate dir : 一般情况,我们在每次启动之前都生成一个干净的Firefox设置。您可以指定一个目录来让我们将您的设置拷贝过来,代替我们生成的。 -debug: 进入debug模式,会有更多的跟踪调试信息 -htmlSuite browser startURL suiteFile resultFile : 使用指定的浏览器(例如 *firefox )在指定的URL(例如 http://www.google.com ),运行一个单独的HTML Selenese (Selenium Core)测试套件然后立即退出。您需要指定HTML测试套件的绝对路径还有我们将会生成的HTML测试结果文件的路径。 -proxyInjectionMode: 进入代理注入模式,这个模式中selenium服务器作为进入测试程序的所有内容的代理服务器。在这个模式下,可以跨多个域访问,并且还支持如下附加参数: -dontInjectRegex regex : 附加的正则表达式,代理注入模式能够使用它决定是否进行注入 -userJsInjection file : 指定一个JavaScript文件,将它注入到所有页面中 -userContentTransformation regex replacement : 一个正则表达式,对所有被测HTML内容进行匹配;第二个string将会对替换所有匹配的内容。这个标志能够使用多次。一个简单的适合使用这个参数的例子:如果你添加 -userContentTransformation https http 那么测试应用程序的HTML中的所有 https 字符串都会被替换为 http 。 我们还支持两种Java系统属性: -Dhttp.proxyHost 和 -Dhttp.proxyPort 。使用Selenium服务器作为代理服务器,Selenium RC一般重载你的代理服务器配置。使用这个参数适合在使用Selenium服务器代理的同时使用你自己的代理服务器。使用代理服务器时这样配置: java -Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=1234 -jar selenium-server.jar 如果你的HTTP代理服务器需要验证,你还可以在http.proxyHost和http.proxyPort后面设置- Dhttp.proxyUser 和 - Dhttp.proxyPassword 。 java -Dhttp.proxyHost=myproxy.com -Dhttp.proxyPort=1234 -Dhttp.proxyUser=joe -Dhttp.proxyPassword=example -jar selenium-server.jar ...

阅读全文 »

Selenium私房菜系列7-- 玩转Selenium Server

本篇主要是想更进一步介绍Selenium Server的工作原理,这次我们从Selenium Server的 交互模式 开始。 在《 第一个Selenium RC测试案例 》中,我们以命令 java -jar selenium-server.jar 启动了Selenium Server,其实在启动Selenium Server时,我们还可以加上各种参数(具体的参数请参考《 Selenium RC服务器命令行参数列表 》), 而开启 Selenium Server交互模式 的命令为 java -jar selenium-server.jar -interactive 。交互模式,是Selenium Server提供的一种快速的测试方法,你可以对Selenium Server输入命令从而直接启动测试。 1.启动Selenium Server交互模式 2.在命令行中输入: cmd=getNewBrowserSession 1=*iexplore 2=http://www.google.com 。控制Selenium Server启动浏览器,以及创建Session。 (1) .--- Requesting http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession 1=*iexplore 2=http://www.google.com 看过《 深入了解Selenium RC工作原理(1) 》的应该了解:我们所编写的测试案例,其实是通过发送Http请求实现对Selenium Server的控制,而测试案例所发送的请求就正是:--- Requesting http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession 1=*iexplore 2=http://www.google.com 。我们可以再打开一个IE浏览器,在地址栏输入: http://localhost:4444/selenium-server/driver?cmd=getNewBrowserSession 1=*iexplore 2=http://www.google.com ,回车!看,Selenium Server又为此产生了一个Session了!呵呵: (2) .这里,Selenium Server为上面的请求随机生成了一个Session ID:9505f5f8c52041c28f4cdc1f8e59f769(由于写这篇文章的时候中途重启了Selenium Server,所以这里和上图的Session ID不同,并且下文会继续使用Session ID:9505f5f8c52041c28f4cdc1f8e59f769)。 (3) .如果一切正常,Selenium Server最后会出现Get Result Ok的字样,并出现如下两个框框: 3.控制浏览器访问 www.google.com /webhp,输入: cmd=open 1=http://www.google.com/webhp sessionId=9505f5f8c52041c28f4cdc1f8e59f769 噢,浏览器成功访问 http://www.google.com/webhp 了: 。 总结一下: (1) .在Selenium Server中输入命令的格式为: cmd=Command 1=Target 2=Value SessionID= ,这和Selenium IDE的案例语句很像。 (2) .在输入命令后,Selenium Server会发条Http请求给自己,请求的URL格式也是固定的: http://localhost:4444/selenium-server/driver?cmd=Command 1=Target 2=Value SessionID= ,我们完全可以用浏览器发送请求控制Selenium Server进行测试。 (3) .另外,sessionId是很重要的一个参数,当一个Selenium Server同时运行多个测试案例时,Selenium Server就是通过sessionId判断到底该操作哪个浏览器窗口。而在下面的C#代码中: ISelenium selenium = new DefaultSelenium( 127.0.0.1 , 4444, *iexplore , http://www.google.com ); selenium.Start(); selenium.Open( /webhp ); selenium就相当于上文中的sessionId。 (4).在Selenium Server启动一个Session时,必须先指定一个 源 (原因见《 深入了解Selenium RC工作原理(2)》), 在上面的代码中 http://www.google.com 就是 源 了,然而这是可能出现问题,请看下面代码: ISelenium selenium = new DefaultSelenium( 127.0.0.1 , 4444, *iexplore , http://www.google.com ); selenium.Start(); selenium.Open( http://www.baidu.com ); 我们在启动Session时,定义了源为 http://www.google.com ,但在后来的操作中,我们打开的却是 http://www.baidu.com ,由于二者非同源,所以接下来的操作就可能会出现各种问题,故此Selenium Server会给出以下警告: Selenium Server提示说;如果测试案例是运行在*iehta或者*chrome上,或者改变Selenium Server的运行模式为proxy injection mode即可避免问题出现。 恩,在这里,我不得不承认之前在《 深入了解Selenium RC工作原理(1) 》中,为了简化问题,我故意少写了一些东西! 其实, Selenium Server其实有2种运行模式 : (1). Heightened Privileges Browsers (2). Proxy Injection 现在Selenium Server启动的默认模式为:Heightened Privileges Browsers。如果要启动Proxy Injection模式,可以加参数 -proxyInjectionMode 。而之前在《 深入了解Selenium RC工作原理(1) 》中介绍Selenium RC与Testcase关系,其实就是在描述 Proxy Injection 的工作模式,因为我个人认为Proxy Injection设计模式更为合理,所以只对Proxy Injection模式作介绍。在这里我补充说明一下,为什么Heightened Privileges Browsers模式不能避免上面的问 ...

阅读全文 »

Selenium私房菜系列6 -- 深入了解Selenium RC工作原理

前一篇已经比较详细讲述了如何使用Selenium RC进行Web测试,但到底Selenium RC是什么?或者它由哪几部分组成呢?? 一.Selenium RC的组成: 关于这个问题,我拿了官网上的一幅图来说明这个问题。 Selenium RC主要由两部分组成: (1).Selenium Server: Selenium Server负责控制浏览器行为,总的来说,Selenium Server主要包括3个部分: Launcher , Http Proxy , Selenium Core 。其中Selenium Core是被Selenium Server嵌入到浏览器页面中的。其实Selenium Core就是一堆JS函数的集合,就是通过这些JS函数,我们才可以实现用程序对浏览器进行操作。 (2).Client Libraries: 写测试案例时用来控制Selenium Server的库。 二.Selenium RC与Testcase的关系 先看下图: (1).测试案例(Testcase)通过Client Lib的接口向Selenium Server发送Http请求,要求和Selenium Server建立连接。 为什么要通过发送Http请求控制Selenium Server而不采用其他方式呢?从上文可以看出,Selenium Server是一个独立的中间服务器(确切地说是代理服务器),它可以架设在其他机器上!所以测试案例通过发送HTTP请求去控制Selenium Server是很正常的。 (2).Selenium Server的Launcher启动浏览器,把Selenium Core加载入浏览器页面当中,并把浏览器的代理设置为Selenium Server的Http Proxy。 (3).测试案例通过Client Lib的接口向Selenium Server发送Http请求,Selenium Server对请求进行解析,然后通过Http Proxy发送JS命令通知Selenium Core执行操作浏览器的动作。 (4).Selenium Core接收到指令后,执行操作。 (5).浏览器收到新的页面请求信息(因为在(4)中,Selenium Core的操作可能引发新的页面请求),于是发送Http请求,请求新的Web页面。 由于Selenium Server在启动浏览器时做了手脚,所以Selenium Server会接收到所有由它启动的浏览器发送的请求。 (6).Selenium Server接收到浏览器的发送的Http请求后,自己重组Http请求,获取对应的Web页面。 (7).Selenium Server的Http Proxy把接收的Web页面返回给浏览器。 为什么Selenium RC中的Selenium Server需要以这种代理服务器的形式存在?其实,这和浏览器的 同源策略 (The Same Origin Policy)有关。 一.什么是同源策略 同源策略 ,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略。 为什么需要同源策略 ,这里举个例子: 假设现在没有同源策略,会发生什么事情呢?大家知道,JavaScript可以做很多东西,比如:读取/修改网页中某个值。恩,你现在打开了浏览器,在一个tab窗口中打开了银行网站,在另外一个tab窗口中打开了一个恶意网站,而那个恶意网站挂了一个的专门修改银行信息的JavaScript,当你访问这个恶意网站并且执行它JavaScript时,你的银行页面就会被这个JavaScript修改,后果会非常严重!而同源策略就为了防止这种事情发生,看下图: 比如说,浏览器的两个tab页中分别打开了 http:// www.baidu.com /index.html和http:// www.google.com /index.html,其中,JavaScript1和JavaScript3是属于百度的脚本,而JavaScript2是属于谷歌的脚本,当浏览器的tab1要运行一个脚本时,便会进行同源检查,只有和 www.baidu.com 同源的脚本才能被执行,所谓 同源 ,就是指域名、协议、端口相同。所以,tab1只能执行JavaScript1和JavaScript3脚本,而JavaScript2不能执行,从而防止其他网页对本网页的非法篡改。 二.Selenium Server为什么以这种代理服务器的形式存在 上面说了同源策略,那同源策略的Selenium Server有什么关系呢??呵呵,上一篇说过,Selenium Core是一堆JS函数的集合,它是我们操作浏览器的基础。当存在同源策略时,便出现一些问题,看下图: 因为Selenium Core的JS脚本的 源 是localhost,所以浏览器会阻止Selenium Core的JS脚本在测试页面上执行,这就是为什么在本系列第一篇中说,如果只使用Selenium Core进行测试,需要把Selenium Core安装到远程服务器上。 为了解决上面这个问题,Selenium RC中的Selenium Server就以代理服务器的形式出现了,下图说明它是如何借助代理的身份蒙骗浏览器的: Selenium Server以代理的形式存在,通过修改WebSite的源信息,从而达到欺骗浏览器的目的,就这样,Selenium RC就轻松绕过了同源策略。在上图中,浏览器会认为WebSite和Selenium Core来自同一个 源 ----代理服务器! ...

阅读全文 »

Selenium私房菜系列5 -- 第一个Selenium RC测试案例

《 Selenium简介 》中讲过,Selenium RC支持多种语言编写测试案例,如:C#,Python。在工作中,我倾向于是用Python这类动态语言编写测试案例,因为这样的测试案例无需编译: ,试想如果你有1000个测试案例,每个都要编译,那会给编译服务器很大的压力,而且案例修改后,还得重新编译才能运行: 。但在本系列的文章中,我还是打算使用C#编写示范例子。 Selenium RC下载: http://seleniumhq.org/download/ 写Selenium RC的测试案例 上一篇《 Selenium IDE的使用 》中,提到了Selenium IDE可以把录制的脚本转为其他语言的脚本,所以我继续用上一篇的脚本为例子,下面是把脚本语言转换为C#后的代码: using System; using System.Text; using System.Text.RegularExpressions; using System.Threading; using NUnit.Framework; using Selenium; namespace SeleniumTests { [TestFixture] public class NewTest { private ISelenium selenium; private StringBuilder verificationErrors; [SetUp] public void SetupTest() { selenium = new DefaultSelenium( localhost , 4444 , *chrome , http://change-this-to-the-site-you-are-testing/ ); selenium.Start(); verificationErrors = new StringBuilder(); } [TearDown] public void TeardownTest() { try { selenium.Stop(); } catch (Exception) { // Ignore errors if unable to close the browser } Assert.AreEqual( , verificationErrors.ToString()); } [Test] public void TheNewTest() { selenium.Open( / ); selenium.Type( kw , hyddd ); selenium.Click( sb ); selenium.WaitForPageToLoad( 30000 ); try { Assert.IsTrue(selenium.IsTextPresent( hyddd - 博客园 )); } catch (AssertionException e) { verificationErrors.Append(e.Message); } selenium.Click( //table[@id='1']/tbody/tr/td/a/font ); } } } 在这里,转换后的脚本使用了NUnit测试框架,为了简化,我用VS的Test Project代替(当然你也可以用Console Application建立测试工程的),步骤如下: 1.建立Test Project 2.导入DLL引用 把selenium-dotnet-client-driver-1.0-beta-2目录中的 ThoughtWorks.Selenium.Core.dll , ThoughtWorks.Selenium.IntegrationTests.dll , ThoughtWorks.Selenium.UnitTests.dll 加入项目: 3.把上面自动生成的代码再改一下 using System; using System.Text; using System.Collections.Generic; using Microsoft.VisualStudio.TestTools.UnitTesting; using Selenium; namespace SeleniumTest { [TestClass] public class UnitTest1 { [TestMethod] public void Test() { // 127.0.0.1为Selenium测试服务器位置。 // 4444为Selenium测试服务器监听端口。 // *iexplore为启动浏览器类型,我把它改为了IE浏览器。 // http://www.baidu.com为源地址 。 ISelenium selenium = new DefaultSelenium( 127.0.0.1 , 4444 , *iexplore , http://www.baidu.com ); selenium.Start(); selenium.Open( / ); selenium.Type( kw , hyddd ); selenium.Click( sb ); selenium.WaitForPageToLoad( 30000 ); Assert.IsTrue(selenium.IsTextPresent( hyddd - 博客园 )); selenium.Click( //table[@id='1']/tbody/tr/td/a/font ); selenium.Close(); selenium.Stop(); } } } 4.启动Selenium测试服务器 打开cmd进入selenium-server-1.0-beta-2目录,输入 java -jar selenium-server.jar (需要先安装JRE) ,启动Selenium测试服务器。 5.运行测试案例 (1).运行测试案例: (2).测试结果: 恩,案例Pass了,如果案例失败的话,Error Meesage会说明失败的原因。 (注意:和Firefox一样,IE下也有屏蔽弹出网页功能,修改设置方法:MenuBar- Tools- Popup Blocker- Turn off Popup Blocker,或者在Popup Blocker Settings里面配置。) ...

阅读全文 »