为什么找不到我的Watir :: Table?

时间:2014-03-16 20:09:44

标签: watir watir-webdriver

我正在使用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中找到这个表。

1 个答案:

答案 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个表。