Watir ::直接访问对象与使用集合时的元素ole_object值

时间:2014-08-27 17:38:44

标签: ruby watir win32ole

我们说我有一个关于课程的单一链接'示例'。 a(class: 'example').ole_object返回nil,而as(class: 'example').first.ole_object返回WIN32OLE对象。为什么呢?

1 个答案:

答案 0 :(得分:1)

不同之处在于Watir :: Element位于懒惰位置,而Watir :: ElementCollections位于其中。

Watir :: Element#ole_object方法只返回@o的值:

def ole_object
  @o
end

@o仅在调用locate方法时设置:

def locate
  @o = @container.locator_for(TaggedElementLocator, @specifiers, self.class).locate
end  

当你创建一个Watir :: Element但不对它做任何事情时,你可以看到它还没有找到(即懒惰的位置):

p browser.link(id: 'an id that does not need to exist')
#~ #=> #<Watir::Link:0x..fc40fdd4a located=false specifiers={:tag_name=>["a"], :id=>"an id that does not need to exist"}>

找到元素后,通常在通过locate等其他方法调用text时,@o将使用Win32OLE对象进行设置:

e = browser.link
p e.ole_object
#=> nil

e.locate # this is called internally by other methods such as text, click, etc.
p e.ole_object
#=> #<WIN32OLE:0x30de3c0>

相反,您将看到元素集合方法(例如links)将立即查找所有元素。因此,这些元素已经定位并且指定了@o

p @browser.links(id: 'some id that exists')
#<Watir::LinkCollection:0x58b43284 length=1 container=#<Watir::Browser:0x40fa1c8c url="https://some.page.com" title="Test Page">>