我正在使用Watir-5.0.0,selenium-webdriver-2.40并在IE-8上进行测试。当我执行以下代码时:
puts "@browser.tables.length=#{@browser.tables.length}"
@browser.tables.each { |t| puts t.to_s }
t=@browser.table(:class => "jrPage")
puts "jrPage=#{t}"
t.rows.each do |row|
# do something
end
我得到以下结果:
@browser.tables.length=5
#<Watir::Table:0x3921cc0>
#<Watir::Table:0x3921c48>
#<Watir::Table:0x3921c00>
#<Watir::Table:0x3921bd0>
#<Watir::Table:0x3921b88>
jrPage=#<Watir::Table:0x39219d8>
Selenium::WebDriver::Error::StaleElementReferenceError: Element is no longer valid
关于为什么我明确定位表 Watir :: Table:0x39219d8 的任何想法都不在@ browser.tables.each集合中?
我可以理解为什么我得到StaleElementReferenceError(找不到表),但不知道为什么我显式定位的表不在表列表中。
我可以在HTML中找到这个表。
答案 0 :(得分:1)
代码正在为表对象调用to_s
。 Watir-webdriver没有专门为元素定义此方法。因此,它调用Ruby的默认Object#to_s方法:
返回表示obj的字符串。默认的to_s打印出来 object的类和对象id的编码。作为一个特例, 作为Ruby的初始执行上下文的顶级对象 程序返回“main”。
正如您所看到的,这就是Watir正在做的事情 - Watir::Table
是对象的类,而0x39219d8
是对象id的编码。
在遍历表格或获取表格时,您将从头开始检索表格。换句话说,为每个命令创建一个新的表对象。即使再次运行该集合,您也会看到每次都有4个不同的表对象ID。
请注意,虽然您看到的表对象是唯一的,但jsPage指的是集合中的一个元素。您可以使用==
方法检查两个对象是否引用相同的html元素。
例如,你可以看到:
# Get the specific jrPage
jrPage = browser.table(:class => "jrPage")
# Check which element in the collection is the jrPage
browser.tables.each { |t| puts t == jrPage }
#=> false
#=> false
#=> true
#=> false
#=> false
上面告诉你jrPage是页面上的第3个表。