少欲无为,身心自在。得失从缘,心无增减。

发布新日志

  • 我真正的名字

    2010-04-18 23:10:34

         我本名季文俊,别名季影风,其实别名才更符合我自己。我觉得我与“风”字很有缘:我工作用的英文名就叫Hurricane,飓风。我的常用网名是“暗冷夜空的风”。我喜欢“风色幻想”系列游戏。五行属性中我觉得“风”属性很特别,游戏中风属性不是特别强大就是特别弱小。玩鬼泣3时最爱用的武器是风火双刀...我与“风”字如此有缘,名字之中没有个“风”好像不太合情理嘛~但我相信我会成为风的掌控者,这风可强可弱,可大可小,全凭本人心意。最后再说清楚一点:本人叫季影风,季是四季的季,影是幻影的影、风是旋风的风~

  • 从央视《神话》说起

    2010-01-30 00:37:59

        《神话》这部电视剧是在很偶然的情况下看的。很奇怪吧?因为现在我都不看电视剧的,原因是没几部值得看的。有一天突然想逛音像店,看了半天的片子却一张都不想买,再不走店主恐怕要赶人了> <!!幸好店主是个好人,主动推荐说:这个片子不错,卖得很好。哈,正好有台阶下~仔细一看剧名:《神话》,一摸:三张盘,演员不是很美,但有胡歌主演。原来有名的电影《神话》电影已改编成由胡歌主演的电视剧啦,忽然感觉自己落后了一点。拿着片子回家的路上,我觉得不知道自己在干什么,呃,其实吧,我也不是很想买电视剧回去看的...以前我从没试过用DVD看过一部完整的电视剧,也没试过用电脑的DVD光驱看过一部完整的电视剧。但是,这次我堵上了我那可怜的DVD光驱的生命(平时我很宝贝它的,一般都不放什么碟片在光驱里超过10分钟~),全剧都是放光驱里直接播放~
        现在距看完这部电视剧已经一个礼拜了,它对我的冲击还没完全过去。我是上周看完的,央视上这个电视剧我压根没看(广告、时间限制太多)。或许不是在央视看的,“雷”的感觉不是很强烈。因为若是在一个很严谨的环境下看如此娱乐大众的东西,任谁都很难接受。可我看的时候没有这样的环境因素存在,这得益于用碟片看的关系。用碟片看好处有二:其一,进度自己控制,时长自己控制。我一次可以连续看完5、6集不带休息的,还没广告,剧情连贯性较好。其二,环境轻松,不会有“央视所放电视剧都很严谨,不会很夸张“的先入为主的观念。看完这部剧后,我若要推荐别人去看,我一定会说:这部电视剧争议很大,你要么一集都不要看,要看就必须全部看完后再做评价。
         《神话》一开始的内容其实很普通,没什么特别的。现代部分的剧情真的很烂,基本上后面看到有现代部分的剧情我就跳过的。但古代部分还是有点看头的。穿越,本不是什么新鲜的主题,看过《魔幻手机》、《寻秦记》的话,更不会对此有什么感冒。据网上的评论,《神话》的高收视率出现在刚开始放的几集上。其原因就是”雷“死人不偿命的台词和类似1年不断电、防水防电经久耐用的神奇电话(神话?)。但是,网络上的评论我是在看完整部电视剧后才上网了解的,因此没有很多先入为主的观念存在。当时看的时候,觉得编剧很可怜,这些所谓雷人的话,网上早就都有人写过类似的话。感觉像是从网上搜刮来再和剧情匹配后筛选出来改造形成的样子。当听到胡歌面不改色地说出那些所谓”雷“人的话,我的感觉是”雷同“而不是起鸡皮疙瘩。我觉得要是想”雷“的话,这样的台词只能说不够新鲜,不够夸张(难道我多见少怪了??)。仔细看那些台词,你会发现那些话在今天来讲完全合情合理。一个刚穿越到过去的现代人一时之间不相信会发生这样的事情很正常吧?继续按现代的背景知识,在古代讲现代的话语其实很正常啊,这才符合瞬间穿越的逻辑。你若很爱看篮球比赛,现在你和周围的朋友随口说个”胡人最近怎样了?“别人会觉得你在说的是侵犯我国边境的胡人、匈奴可能性大还是MBA的湖人队呢?觉得那个手机的存在不合理?其实仔细想想挺合乎制作方的情况的:为什么需要一个手机?手机在后面的剧情中可以说就是个”信物“,古有飞鸽传书,今有手机视频。既然是穿越,在古保有今的内容很正常,不出现个手机才不合理呢。为什么是个触摸屏手机?在电视剧里做活广告它不是第一家,而活广告能给电视剧的拍摄带来一定支持。触摸屏更是符合大众追新的口味。若看看网上的穿越小说,其实写法也就这样。可以说这部电视剧前半段的风格与网络穿越小说的写作风格很相似。
         与大多数电视剧套路一样,前半段戏剧,后半段悲剧。与大多数电视剧不同的是前半段的喜剧既不是靠体现浪漫温馨的眷侣彼此幸福感觉来表现,也不是靠男女之间嬉笑怒骂的搞笑来表现。而是利用古今环境下人物语言、行为的差异性来作为笑点。与魔幻手机的开端相似(以一个可以变化的娃娃多变的下落吸引观众),这又是一次新的尝试。能不能接受这样的尝试其实只要观众转换一下思维就可以做到:不要那么关注细节,看历史从全局去概览就可以了,有些还只是传说(孟姜女哭倒长城)。细节让那些考古、做历史调研的人去研究吧,我们只是匆匆过客,看一看笑一笑就过去了。这是电视剧,不是现实,本就是虚幻的,本就是人们的想象的具象化,这样的想象也反映着想象者自己的生活理想(很有可能想象的内容与现实正好相反)。和一个影子较真,没有意义。
        收视率是评价电视剧好坏的标准之一,注意是”之一“。异常的高收视率更是值得探讨。看完全剧,我认为后半段的内容远比前半段来得有内容。前半段,我解读为服务大众,博观众一笑。可以看做是种商业手段,为吸引观众而抛出的绣球而已。从收视率上看,应该是起了效用的,评价好坏不是问题,能抓到老鼠就是好猫,对吧?在我看来,高要的”入戏“要比小川早,而不是演技问题。张世演技的确棒,但”小川“这个角色定位从一开始就注定不能让人觉得”真“。这部戏,主要在打造两个形象,一个是如高要变赵高般的现实生活中的一般人,另一个是如小川般的理想境界的圣人。最后提供了一个跨越2千年时空的历史舞台。通过穿越,将现实与理想置于历史的舞台之中,不断地上演着一幕幕相互矛盾又合情合理的悲欢离合。其实,高要的经历、背景与当前生活的人们的情景更接近。比如没有背景,为别人工作,曾经为理想奋斗过,最后却在现实环境下大打折扣(这算好的了,更多的人根本就是放弃了)。换了新环境,相关的东西都不会,一切要从头来。就算是现在,相信也有很多人打算或已经在像高要那样一步步往上爬,从一个小角色蜕变成一个狠角色。这样的角色性格反差很大,经验老到者方能胜任而张世就是实力派演员,之前得的奖不是白拿的。而表现一个理想境界的圣人则很难把握,谁都可以有理想,但无论怎么描述都与现实差距非常大,而一个圣人,更是捉摸不透。这样的角色展现给观众看,大部分人是不会相信的。因为,现实告诉我们那是不允许存在的。正因为这样,胡歌后期只要面无表情就够感觉了,不真实才是需要表现的内容。大家都觉得小川这个角色太自私了,不是任性泡妞就是啥事儿不管,固执地按自己的想法做事:你不准放弃生命!我要和我的公主永远在一起!这正是理想与现实的差距,由于理想往往是自己想象的,主观意识强烈,自然顾不上他人感受,也忽略了现实中应有的因素。将这样的想象搬到电视上,给全国观众看,结果还是一样:它是与现实不容的存在。
         然而,若这部电视剧仅表现到这种程度,那它还不够分量。对我而言,最震撼的是它将”所有的一切永远无法挽回“的根本原因展现在了我的面前。这是最真实也是最残酷的现实:性格无法改变命运的原因是众人的性格在遇见同一件事情的时候相互作用才决定了最后的结局,而众人的性格无法都产生大变,更不知道在这众多的改变之中那种组合才能达成美好的结局。这里的”性格“不是指一个人的性格,而是与最终结局相关的所有人的性格。拥有不同性格的人的在遇见相似的事件时所作的决定是一样的,即使其中几个人的性格大变(比如小川和高要),也会由于其他相关人的举动将路线重新拉向最后的结局。小月,古代的高岚(她比现代的高岚漂亮多了~)。一旦认定自己所爱的人之后,只会关心所爱之人,无论生死都要在一起。对小川是这样,后来对项羽也是这样。项羽,一个尚武的猛将,豪爽的性格使他无法接受暂时的忍让。这样的两人在一起,荣辱与共(项羽),生死相随(小月)。无论得势之时还是失势之后,所作举动无二异。有几种结局几乎可以说是他们从一开始就选择好了的(虽然自己并不一定会意识到),但决定最后的结局的人不只他们两个,比如刘邦、小川,和大众脸武将。
         虽然觉得50集有点拖沓,好几段剧情就是把历史上的著名事件罗列一下,但是它也营造了一个环境:无论过去发生什么,只要发生过的就不能再改变。任你穿越千年,你也得一天天地过。任你阴险狡诈还是济世救人,人的最终结局也一定是一无所有。一个普通人,最终是向善还是从恶仅是一念之间。只是这一念一旦确立,就再也无法更改,因为发生过的事情无法再变更。
         有没有好过点的方式?像小川那样的好运气?真的是好运气么?若这样的好运气要用千年的苦等、最终阴阳相隔告终来交换,你想要吗?像高要那样当赵高么?看他后面的局面,是不是始终是个小人物?换个刘邦当主子,再换刘邦的儿子当主子,天天想着怎样从别人手上抢下食来?当人无法阻挡他胡作非为时,会有更多人的以一种不经意的方式摧毁他。向往小川桃花运么?最后他谁也没得到,只剩无尽的思念。人生苦短,生活却给小川开了个玩笑:活上千年,苦等千年。这里唯一看上去轻松点的就是崔文子了,出世也入世,似醉非醉,关键时刻济世救人一下。又偶尔阴险狡诈一番,达成一下自己的目的。
         看到后期,基本上我就一个感觉了:”心痛“。一种被巨大压力挤压心中所想的痛。历史一幕幕地重演,却无力改变丝毫。想要的永远得不到,得到了只有短短几日。编剧把历史细节改成什么样我已不在乎了,历史大方向根本没有改变。乌江自刎一定会发生,刘邦称帝一定会发生,小川穿越一定不会在历史上留下痕迹,长生不老永远不可能实现(最后瞬间变老)。电视剧想要展现的不是历史教科书,而是生活长卷以及那永恒不变的变化规律。
  • Selenium UI Element学习笔记(四)

    2009-09-18 16:39:33

    Selenium UI Element实战篇
        
         至此已经介绍完了UI Element的Map文件的全部内容。接下来就是真正在Selenium中应用它
    了。之前说过,UI Element是可以在Selenium IDE和RC中共用的。它的确为统一识别和维护网页
    对象提供了标准的处理方式。下面逐一介绍。    
         Selenium IDE
          在IDE中,要想使这些辛辛苦苦编写好的映射文件起作用还需要一些设置。这个映射文件是
    一个js文件。

    1. FirfeFox中打开Selenium IDE界面,在主菜单的options中选择Option...菜单项
    2. 在General标签页面中, 设置Selenium Core extensions为包含此js文件的路径
    3. 重启Firfox,使设置生效     

         Selenium RC
        
    在RC中,你有两种方式可以选择
    • 在RC的启动脚本中增加-userExtensions参数指定js文件
    启动Selenium服务器的脚本命令参考: 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 设置。您可以指定一个目

    录来让我们将您的设置拷贝过来,代替我们生成的。
    • 在编程IDE的代码文件中使用DefaultSelenium类的setUserExtensionJs(fileName)
      方法动态指定js文件。
        
         终于,Selenium UI Element的学习告一段落。先休息会,接下来就要好好应用了。待应
    用一段时间后,再来写体会,哈哈哈~
  • Selenium UI Element学习笔记(三)

    2009-09-18 14:41:36

    Selenium UI Element高级应用篇

         这次是高级应用篇了,读完这些,我发现利用UI Element能帮我处理掉大部分的对象识别问
    题了,这里将映射技术发挥得淋漓尽致。TestCompelte中的别名映射机制与它相比...唉,真是不
    好比啊~

         Testcases

         这里的testcase是用来验证Selenium能正确地按照Locator设置的路径来识别对象的。
    Selenium会统计失败的测试用例的情况。编写这样的测试用例的另一个目的则是可以直观地表现
    最终可能出现的对象路径。
         一个Testcases会是这样编写的
    testcase1: {
    args: { line: 2, column: 3 }
    , xhtml: '<table id="scorecard">'
    + '<tr class="line" />'
    + '<tr class="line"><td /><td /><td expected-
    result="1" /></tr>'
    + '</table>'
    }

    解析:
    一个testcase对象中有两个必要的属性,args(数组对象)和xhtml(String)。
    agrs属性的对象会被传递给UI Element的getLocator函数。它用来生成test locator,
    这个locator由xhtml语句描述。若这个Locator返回了期望的值,那么这个测试就被认为
    是通过的。xhtml属性必须用xhuml语言描述,不需要<html>标签,这会自动加上。这么做
    是为了能让Firfox的XML解析器正确解读。不幸地是不能生成HTML文档,只能生成XML文档。
    这就要求区分大小写,即所有的tag名都必须小写。


    模糊匹配

    实际的网页中,往往会看到这样的代码结构

    <table>
    <tr nclick="showDetails(0)">
    <td>Brahms</td>
    <td>Viola Quintet</td>
    </tr>
    <tr nclick="showDetails(1)">
    <td>Saegusa</td>
    <td>Cello 88</td>
    </tr>
    </table>

    想象一下,我在录制脚本。我想点击Cello 88这个按钮。IDE会为我创建这样一个Locator
    ://table/tr[2]/td[2]。这是否就意味这我的getLocator函数就会返回一个同样的
    Xpath吗?显然不是。点击这个表格的第二行中的人一个按钮都是同样的结果。我的UI
    Element的XPath很可能是
    这样的:
    //table/tr[2]。在录制的时候,作为点击动作的页面对象在层级结构的上一层
    (即TD标签而不是TR),这就不能和我的UI Elment Xpath匹配了。那么该怎么解决这个问
    题呢?

    Fuzzy matching!
    什么是Fuzzy Matching?
    它是一个函数,若一个Dom Elemnt目标可以被认为相当于另一个DOM Element的参照物(
    由Xpath生成)时,此函数返回True。一般而言,它的匹配规则是这样的:
    • 有多个相同的element
    • 参考element是唯一的,而目标element是它的后代
    • 参考element有一个onclik属性,而目标element是它的后代 
    这样的逻辑或许不一定适合你。幸运地是你可以修改它,在ui element.js文件中,
    你可以查看一下BrowserBot.prototype.locateElementByUIElement
    .is_fuzzy_match的定义。

    辅助定位器()

    辅助定位器是一种附加在UI Special String后面形成的一种组合定位模式。它们可以通过
    IDE录制器自动生成getOffsetLocator函数。
    当你需要将页面上大量的内容定义成UI
    Element时,
    这一特性也许非常有用,它可以用来简化代码。这种情况下,它允许你定义一个
    可以包含固定的其他的要素的UI Element。来看一例子感受一下吧
    假设有这样一段页面元素
    <form. name="contact_info">
    <input type="text" name="foo" />
    <textarea name="bar"></textarea>
    <input type="submit" value="baz" />
    </form>


    应用map时的对象引用写法如下
    ui=contactPages::contact_form()->//input[@name='foo']
    ui=contactPages::contact_form()->//textarea[@name='bar']
    ui=contactPages::contact_form()->//input[@value='baz']


    解析:
    录制时,系统将采用UIElement.defaultOffsetLocatorStrategy来自动生成对象
    代码。“->”符号用来界定根据何种固定要素来识别相似的Page Element。因此,这个符号
    不能在主要的定位器或任何可能产生意外结果的地方中使用。需要注意的是这中定位方式只适
    用于Xpath,其他定位方式以后或许也会提供相似的支持。


    Rollup Rules

    Rollup就是一组常用Selenium命令的组合体。UI Eleemnt的设计目标是使IDE中编写可以
    简单而轻松地编写测试代码,当然它缺少一些重要的编程特性(比如IF、While、Function
    )。这必然令你倾向于使用Selenium RC编写测试代码。另一种选择,就是Rollup Rule。
    通过Selenium的testruuner生成的组件命令执行rollup命令会表现得像在调用函数一样
    简单。这些rollup的扩展可在javascript中编写。因此,这样rule可以作为一个user
    extension加入到任何一款Selenium家族产品中。尤其突出的一点是,
    在理解了命令怎
    样扩展成rollup和roullup rules怎样被拆解成rollup命令
    后,就可以把IDE作为创建
    测试用例的工具。
    一个Rollup Rule会是这样一种结构

    var manager = new RollupManager();
    manager.addRollupRule({ ... });
    manager.addRollupRule({ ... });
    ...
    具体点就是这样的
    manager.addRollupRule
    (
    {
    name: 'do_search'
    , description: 'performs a search'
    , args:
     [
    name: 'term'
    , description: 'the search term'
          ]
    , commandMatchers:
    [
    {
    command: 'type'
    , target: 'ui=searchPages::search_box\\(.+'
    , updateArgs: function(command, args)
                  {
    var uiSpecifier = new UISpecifier
    (command.target);

    args.term = uiSpecifier.args.term;
    return args;
                  }
    }
    ,
    {
    command: 'click.+'
    , target: 'ui=searchPages::search_go\\(.+'
             }
    ]
    , getExpandedCommands: function(args)
    {
    var commands = [];
    var uiSpecifier = new UISpecifier
         (
    'searchPages'
    , 'search_box'
    , { term: args.term }
    );
            
    commands.push
    (
    {
    command: 'type'
    , target: 'ui=' + uiSpecifier.toString()
              }
    );

    commands.push
    (
    {
    command: 'clickAndWait'
    , target: 'ui=searchPages::search_go()'
               }
    );

    return commands;
    }
    }
    );
    解析:
         在这个例子中,Rollup Rlue被定义成用来执行搜索动作。利用CommandMatcher可
    以将Rule应用到连续的命令集中。Rollup有一个参数:term。之后扩展了原始的两个命令。
    值得注意的是第二个ComandMatcher匹配的是所有以Click开头的命令。这个Rollup可以
    将命令扩展成clickAndWait。下表是Rollup rules对象的所有属性。
     属性名 必选参数否 (数据类型)含义说明
    代码举例
     name  Yes
       
     description  Yes
       
     alternateCommand      
     pre      
     post      
     args  Conditional    
     commandMatchers\
    getRollup()
     Yes    
     expandedCommands\
    getExpandedCommands()
     Yes    








        
  • Selenium UI Element学习笔记(二)

    2009-09-18 11:45:26

    UI Element基础知识篇

         简而言之,这次介绍如何编写基本的Map文件(Extension.js文件)

         一个基本的Map文件大致是这样的:
    var map = new UIMap();

    map.addPageset( {name: 'aPageset',...} );

    map.addElement
    (
    'aPageset'
    , { ... }
    , {}
    );

    map.addElement('aPageset', { ... });
    ...

    map.addPageset( { name: 'anotherPageset', ... } );

         唉,我很晕这样的点啊、大括号、一推单引号的文档描述。没办法,谁让它用的是
    Javascript对象标记方式写的结构呢...先整理一下代码的编写规则:

    1. 映射图的结构被描述成了Map.Pageset.Element的对象链的线性结构。
    2. 一切从一个Map对象开始,即var map = new UIMap()要写在最前面!一个
      Js文件中,最好只写一个Map对象。
    3. 在Map对象后可通过Map对象.addXXX来增加节点(其实就是调用Map对象的Add系列
      方法)。节点的内容用()包围,分号结尾(Javascript的规范写法)
    4. 节点中的内容编写规则如下
    • 字符串要用单引号括起
    • 数组内容用{}括起
    • 数组元素的写法是 数组元素名 : 值。这里的数组元素也可以当做是节点
      对象的属性来看待.需要注意的是这里的元素设置顺序不可改变!
    • 多个数据用逗号分隔,为避免遗漏,建议将逗号写在最前面
    我的编写风格一般是这样的,个人觉得这样看上下关系会比较清楚。
    map.addElement
    (
          {
    'aPageset'
    , name:'testman'
    , description:'man'
    }

    'test'
    );

    搞清楚代码编写规则后,来看看map对象到底提供了什么方法和参数吧

    map.addPageSet(pagesetShorthand
    概述:增加Pageset节点
    pagesetShorthand
    :这是一个数组,其中的元素(Pageset的属性)如下(见文末表1)

    map.addElement(pagesetName, uiElementShorthand)
    概述:在指定的Pageset节点中增加Element子节点
    参数解析
    1.pagesetName 字符串类型,通过设置此参数为Pageset的名字与指定的Pageset进行关联
    2.uiElementShorthand 数组参数,包含了Element的诸多要素(也可看做属性)详细列
    表如下(见文末表2)

    核心方法就这么两个,会不会太单调了呢?当然不只这么点,不过那些以后再说。现在先看
    看与核心方法相关的一些内容吧

    UI Argument Shorthand
         刚才的参数解析中,有提到一个args对吧,这次来仔细看看这个东东里有什么玄机。
    先来看一段实例代码
    map.addElement('searchPages', {
    name: 'result'
    , description: 'link to a result page'
    , args: [
    {
    name: 'index'
    , description: 'the index of the search result'
    , defaultValues: range(1, 21)
    }
    , {
    name: 'type'
    , description: 'the type of result page'
    , defaultValues: [ 'summary', 'detail' ]
    }
    ]
    , getLocator: function(args) {
    var index = args['index'];
    var type = args['type'];
    return "//div[@class='result'][" + index + "]"
    + "/descendant::a[@class='" + type + "']";
    }
    });

    解析:这个Element在定义的时候还指定了args参数,内有两个参数index和type,
    并赋予了默认值(defaultValues语句)。随后在getLocator函数中,将接收这两个参数,
    并在其函数体中起到了动态路径赋值的作用。这里的
    defaultValues语句其实就是用Selenium IDE录制工具录制脚本时自动生成的默认值设置。
    (也就是说,自动生成脚本代码中用到的默认参数设置就是由这个属性决定的)。在IDE的
    录制模式中,IDE使用哪种定位对象方式是自动匹配的,但这往往不准确(这种事情录制时经
    常发生)。UI Element则提供了一种新的UI界面元素定位方式。使用这种方式(即实例代
    码所展示的)时,Selenium通过变换UI Element中定义的所有的参数中默认值来生成一个
    Xpath路径列表,再进行有效匹配。在这段代码中index参数的默认值是1、2、3...20,而
    type参数的默认值是summary和detail。当然,若你不想用IDE,你可以不使用UI
    Argument。
    下表是UI Argument对象的属性介绍(见文末表3)
    关于This关键字

         什么是this:一开始,在使用addPageset() or addElement()函数创建对象时,
    this指的是Selenium IDE的窗口对象(这时的this根本没用)。接着,在geLocator函
    数被调用后,this指的是
    调用此函数的Element对象了。因此,使用this,为UI
    Element定义的任何本地变量就可以使用了。getDefaulVlues函数也是如此。这儿有个有
    点神奇的的地方。若你在UI Element Shorthand部分之前定义你的本地变量,从
    Shorthand语句开始,这些本地变量就可以在arguments中使用通过this引用。注意,这
    不是标准的Javascirpt行为!在理清函数定义语句和避免在函数中使用用于列表和Map的
    全局变量的处理上,这种方式是有效的。这有时会很有用。比如,定义一个映射了人性化
    的参数值到DOM Element ID的参数值的对象。这种情况下,当getLocator函数使用这个
    map对象获得在Locator中的相关ID时,
    getDefaultValues()却可以简单地返回一个
    map对象的属性名。
         特别注意:this关键字仅在getLocator()getDefaultValues()函数中可以
    使用。

    表1

     属性名 是否必选 (数据类型)含义说明
    代码举例
     name  Yes (String)对象的名字,请确保这个名字在一个Map对象中是唯一的。
    name: 'shopPages'
    description  Yes (String)概述这个Pagest方便他人阅读  
    description: 'all pages displaying product'
     pathPrefix  No    
     paths/pathRegexp  Conditional    
     paramRegexps  No    
     pageContent  Conditional    


    表2

     属性名 是否必选
    (数据类型)含义说明
    代码举例
     name  Yes  (String)UI Element的名字
    name: 'article'
    description  Yes  (String)对Element的作用说明,方便阅读此文档  
    description: 'front or issue page link to article'
     args  No  (Array)可修改getLocator函数的参数列表。可以不指定任何参数。  
    [
    { name: 'index'
    , description: 'the index of the author, by article'
    , defaultValues: range(1, 5) }
    ]

    注意,最外层是中括号哦~
    locator/getLocator()  Yes (String\Function)仅可选择两种数据类型之一。若是Function则还可以带参数,此函数的返回值就是这个Element的代码级路径。
     
    locator: 'submit'
    getLocator: function(args) {
    return 'css=div.item:nth-child(' + args.index + ')'
    + ' > h5 > a';
    }
    getLocator: function(args) {
    var label = args.label;
    var id = this._idMap[label];
    return '//input[@id=' + id.quoteForXPath() + ']';
    }
     genericLocator/getGenericLocator  No    
     getOffsetLocator  No    
     testcase*  No    
     _*  No  (Any Data Type)为UI Element声明本地变量。这种变量在UI Element的getLocator函数和任何通过它进行参数传递的任何getDefaultValues函数中有效。这些变量以"_"开头。写法见代码举例。
     
    _labelMap: {
    'Name': 'user'
    , 'Email': 'em'
    , 'Phone': 'tel'
    }

    表3

     属性名 是否必选
    (数据类型)含义说明
    代码举例
     name  Yes  (String)参数的名字  
    name: 'index'
    description  Yes  (String)参数的易读性描述  
    description: 'the index of the article'
    defaultValues/getDefaultValues()  Yes
     (Array\Funcition)仅可选择两种数据类型之一。getDefaultValues(inDocument),这是此函数的结构。inDocument参数是录制时的当前页面的Document对象。
    defaultValues: [ 'alpha', 'beta', 'unlimited' ]
    getDefaultValues: function() {
    return keys(this._idMap);
    }
    getDefaultValues: function(inDocument) {
    var defaultValues = [];
    var links = inDocument
    .getElementsByTagName('a');
    for (var i = 0; i < links.length; ++i) {
    var link = links[i];
    if (link.className == 'category') {
    defaultValues.push(link.innerHTML);
    }
    }
    return defaultValues;
    }

  • Selenium UI Element学习笔记(一)

    2009-09-18 10:05:45

    简介
         Selenium UI Element是Selenium的特性之一。它使对网页的上的各种页面元素的用户含义与开发含义之间进行一种映射的想法成为可能。这样的映射是通过JavaSript对象标记法实现的,而且它可以在Selenium IDE和RC两种开发模式下共用。它也为日后脚本维护(页面对象变化了)提供了统一的维护方式。

    一、名词术语
    Page
         页面。一般来讲就是能够以指定的URL访问的具体网页的页面。专业点说就是一个Page是一个包括URL地址信息的DOM文档对象。

    Page Element
         一个网页上的各种构成要素。一般来讲,所有可与用户进行交互和所有有意义的内容都是Page Element。专业点说,一个Page Element就是一个DOM文档对象的一个节点和该节点的内容。因此,当我们在看待一个Page Element时应同时认识到以下两点:1.它是页面上的某样东西 2.它是DOM的具体表现形式,包括一个元素和其他元素之间的关系。

    Pageset
         共有页面设置。简单来说就是对一些通用页面元素的统一设置。你可以设计多个不同的Pageset,这没有限制。同样的,一个UI Element也可以包含在多个不同的Pageset中。Pageset一般会使用正则表达式来描述某一指定的网页页面。当然,要正确识别一个Page Element还有很多种情况需要考虑。对了,每个Pageset要给它取一个独一无二的名字哦~

    UI Element
         在Page Element的实际意义与定位DOM文档对象的节点路径之间所作的映射。Page Element通过定位器(Locator)进行查找,UI Element属于Pageset中内容。

    UI Argument
         界面参数。根据UI Element决定怎样生成定位器的的一个逻辑细节。Pageset中,它是不是必须的内容。但它经常被用在同一页面上出现多个相似Page Element的情况下区别相似Element,而且你也想通过单一的Element来统一识别它们。举例来说,若一个页面上展现了20条可双击打开的搜索结果记录,这个搜索结果的索引就是一个UI Element。

    UI Map
         界面映射图。一个包含所有Pagset的集合体,当然也包括了所有的UI Element。它是一个负责在UI specifier strings、Page Element和UI Element之间进行交流的中间件。

    UI specifier strings
         界面定义字符串信息。它包括Pageset的名称、UI Element的名称、可选参数的名称。这些文本是为了方便人们阅读文档而建立的。

    Rollup rule
         描述了怎样将多个Selenium命令组合成一条单一的命令以及如何将这样的单一命令做成Selenium组件的方法。这些单一的命令被称作“rollup”

    Command Matcher
         命令匹配器。一般做成一个Rollup Rlue后,用Command Matcher可以一个或多个Selenium Commands并有选择地对匹配的命令设置rollup参数值。一个Rollup rule一般会有多个命令匹配器。


        先来看看定义好UI Element后,在Selenium中网页对象的名字是什么样的吧:
    ui=allPages::section(section=topics)
    ui=subtopicListingPages::subtopic(subtopic=Creativity)

    记住这样的表示方式,以后还会有更深入的介绍。




  • Selenium学习报告

    2009-09-03 00:05:22

        花了几天时间,把Selenium的东西都大概浏览了一番。整体感受是当今的软件研发越来越推崇拆分设计、组合安装的设计思想了。过去用的是Test Complete,当时因为它不像QTP那样高度集成而不满过一阵子。后来,理解了它的结构后,才发现它拆那么散是为了具有灵活应变的特性所必须做出的牺牲。现在Selenium...同样的情况,不同的心情。Test Complete中再怎么拆,它都在Test Complete这个大环境之中。这次,我应该总结成我在学习Web 测试新技术会更恰当一些。因为要想在Web 测试上实现高度复用、灵活应变需求的自动化测试,它需要的是多个软件、技术的一整套整合才可以实现。简单来说,拿Test Complete的特性与Web测试中的内容作个比较就可略知一二了:

        Test Complete  & Web Testing特性对照表

        特性 Test Complete实现方法

              Web Testing实现方法 

     别名映射 Namemapping  Selenium IDE UI Element
     网页对象对象识别模式 Tag  Xpath
     数据驱动 DDT  Test NG\Selenium Core HTML
     跨浏览器与可编程基础 无  Selenium RC
     面向对象编程 Java Script  Java Coding 
     Ext对象操作 无  Java Script
     网页对象操作脚本 TC Record   Selenium IDE
     自定义测试报告 Log系列方法  XML 
     负载测试 内置功能  Selenium Grid 

        可以想象,以后要做自动化测试很有可能是这样一种情形:
        1.设计测试用例
        2.在Test NG单元测试框架下编写测试集
        3.将通过Selenium IDE将网页操作记录成的脚本放到测试集的方法中(熟练后就可直接写代码了)
        4.启动Selenium RC
        5.在Test NG中执行测试,生成的测试报告则从Test NG中生成好了(连统计功能都提供了,省很多事啊)
        6.在实践中总结问题,逐步优化异常处理机制

        报告先记录到此,后面有一堆东西要学,以后再总结~

  • 瞬间的感触

    2009-09-02 23:19:54

       音乐,如其他艺术形式一样,年代越久远越有质量。流行音乐,形式多样却缺乏灵魂。两相比较,自分高下。不过,流行音乐的词作之中却有很特别的东西。听古典音乐,沉醉在无限的想象空间之中;听流行音乐,因它讲述的心情故事而感动。聊举几例,作为曾经颇有感触的一种记录吧

        一、
        天地是舞台
        演不完情意
        不同的面具
        上演不同的戏
        是谁在编剧
        主角是我是你

        不同的面具
        上演不同的戏
        扮演的角色
        哭泣多于欢喜

        剧本不在自己手里
        随着剧情改变自己
        悲情面具 不哭泣
        悲情面具 不哭泣
        悲情面具 不哭泣
        无悲无恨无怨无悔...

        二、
        每一次 让泪水流回心里
        让梦想灌溉开出奇迹
        我要的坚强 不是谁的肩膀
        怀抱是个不能停留的地方
        这世界多拥挤 就有多匆忙
        我用全部寂寞时光给自己鼓掌

        我要的飞翔 不是借双翅膀
        自由是个不能代替的远方
        用路途的孤单
        来收获成长
        直到遇见了你一起分享

        三、
        曾经多次跌倒在路上
        曾经多少次折断过翅膀
        如今我已不再感到彷徨
        我要改变我的生活

        我想要怒放的生命
        就像飞翔在辽阔天空
        就像穿行在无边的旷野
        拥有改变一切的力量

        四、
        别管以后将如何结束
        至少我们曾经相聚过
        不必费心地彼此约束
        更不需要言语的承诺
        只要我们曾经拥有过
        对你我来讲已经足够
        人的一生有许多回忆
        只愿你的追忆有个我

        五、
        我是一只千年修行的狐
        千年修行 千年孤独
        夜深人静时
        可有人听见我在哭
        灯火阑珊处
        可有人看见我跳舞
        ...
        我爱你时
        你正一贫如洗寒窗苦读
        离开你时
        你正金榜提名洞房花烛
       

        能不能再为你跳一支舞
        只为你临别时的那一次回顾
        ...

        六、
        天给的苦向谁诉
        伤痛又有谁清楚
        只影单飞无人顾
        步步它都是坎坷路

        天给的苦说不出
        只好躲在心里哭
        痛到深处说不出
        苍天它怎知人孤独

  • 收拾心情,勇往直前

    2009-09-02 23:09:13

         坚持到不能再坚持,放弃到不能再放弃。自从明白了唯一不变的变化的真意后,本以为就此可以摆脱那些琐事了。可是,面对如铜墙铁壁般的现实压力...发自心底的无力感几乎将我吞没,生活的矛盾本质几乎将我撕裂。很难相信自己可以继续下去,然而能走到这里而不倒不正暗示着什么吗?对此,我想我能做的是宣泄一番,然后收拾心情,重新上路。因为这是我的选择,我也必然需要为我的选择付出代价。这些代价与生死相比,根本不算什么,不是吗?
  • 暗冷夜空的风

    2009-09-02 22:30:14

       一阵在昏暗、掺杂着一丝寒气的的风在空旷无垠的午夜星空上飘荡,而我就是这“暗冷夜空的风”。如果我不动,你就不能感受到我的存在。倘若我愿意晃动一下身躯,你就会感到一阵微风拂面,于是你感到了我的存在,但依然不明晰。只要我乐意晃动得厉害点,你就可以真切地发现我的存在;一阵大风向你吹来,于是我就进入了你的生活。然而,我总是喜静不喜动,不动则无风,所以常处于看不见又真实存在的状态之中。
Open Toolbar