我们说我有一个关于课程的单一链接'示例'。 a(class: 'example').ole_object
返回nil,而as(class: 'example').first.ole_object
返回WIN32OLE对象。为什么呢?
答案 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">>