首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

watir是怎么定位元素的

2012-06-28 
watir是如何定位元素的最近将watir更新到了1.9.1,忽然发现以前承诺的带大家读waitr源码的”夸夸其谈”还尚未

watir是如何定位元素的
最近将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类,这个类是定位对象的1个helper类。该类中如如下2个方法:
    normalize_specifiers!: 该方法的作用是构造specifiers,而specifiers正是定位对象所要用到的”标识”。    matchwithspecifiers?: 该方法的作用是判断元素是否符合specifiers所定义的特征。如果符合,那么这个元素肯定就是我们要找的目标元素了。
简单看一下这2个方法的源码

首先简单介绍一下specifiers。specifiers看上去很陌生,但是在我们的watir脚本中,specifiers是无处不在的。考虑下面的代码:

ie.div(:class => 'red', :index => 3)


       首先watir会生成这样的1个@specifiers变量,其值为{:class_name => 'red', :index => 3}    然后watir会遍历页面上(实际上是container上,这里为了简单起见,简化了一下)所有的tag是div的元素,并将这些ole元素封装成了watir的element    最后在每一个element上调用how方法,在这个例子里就是调用@specifiers中的classname方法。为什么没有调用index方法?因为index是跳过的,详见matchwith_specifiers?方法    如果element.how等于what(为了理解又简化了,专家见谅),也就是element.class_name = ‘red’的话,则将看这个element是不是第index个,如果是则返回element的ole元素,元素定位之旅结束

在这里我们可以看到waitr定位元素一般是通过遍历页面上所有与给定元素拥有相同tag的元素,并比较其属性值的方式进行的。

其比较的方法和原理都很简单。当然,如果任意1个元素都通过遍历tag的方式进行的话,那么watir的效率将是比较低下的。为此watir也提供了快速定位的方法,这个我们以后再慢慢讨论。

热点排行