Ruby Watir无法从集合中找到元素

Ruby Watir无法从集合中找到元素,ruby,watir,watir-webdriver,Ruby,Watir,Watir Webdriver,我刚刚遇到这个问题,在处理集合中的元素时有点困难。在我的例子中,我试图解析一个表并检查列的单元格中包含的值。 代码如下: def check_cells_values(table, cell_index) table.rows.each do |row| row.cells[cell_index].text.should == some_value end end 在“row.cells[cell_index].text.should==some_value”行中,测试失败,出现以下

我刚刚遇到这个问题,在处理集合中的元素时有点困难。在我的例子中,我试图解析一个表并检查列的单元格中包含的值。 代码如下:

def check_cells_values(table, cell_index)
 table.rows.each do |row|
   row.cells[cell_index].text.should == some_value
 end
end
在“row.cells[cell_index].text.should==some_value”行中,测试失败,出现以下错误:

Watir::Exception::UnknownObjectException: unable to locate element, using {:element=>#<Selenium::WebDriver::Element:0x7b40a27fd80f640e id="{af57e857-69ed-5345-a4ae-5ab80dff364a}">}
Watir::Exception::UnknownObjectException:无法使用{:element=>#}定位元素
只需遍历行并输出每行的文本就足够了。在一些行(随机)之后,它会失败,并显示相同的消息

我在Justin讨论这个问题的地方找到了这个链接(),但我没有找到任何与元素集合相关的东西

更新: 下面是我正在解析的一个表的行示例

  <tr class="dataRow even  first" onclick="highlightElem(this)" onmouseover="if (window.hiOn){hiOn(this);} " onmouseout="if (window.hiOff){hiOff(this);} " onblur="if (window.hiOff){hiOff(this);}" onfocus="if (window.hiOn){hiOn(this);}">
      <td class="dataCell  " id="someid3" colspan="1"><a href="/url">8882</a></td>
      <td class="dataCell  " id="someid2" colspan="1">
           <label>Some kind of service</label></td>
      <td class="dataCell  " id="someid6" colspan="1"></td><td class="dataCell  " id="someid7" colspan="1"><input class="btn" id="someid8" onclick="A4J.AJAX.Submit('pgToolOffer:pgForm',event,{'similarityGroupingId':'someid8','oncomplete':function(request,event,data){UpdatePopupPosition();},'parameters':{'selectedRatePlan':'Annual','selectedOfferFriendlyName':'Some service 50$','someid8':'someid8','selectedProduct':'Service Descrition','selectedOfferCode':'product\duration\x2DDG275'} } );return false;" value="Show Offer Details" type="button"></td>
  </tr>

某种服务
第一个选项(严格的代码):

table.rows.each do |row| #We'll take each row
  cell = row[given_index] #We'll take one cell of the taken row
  puts cell.text #We'll do some stuff with the text of the cell
end
i = 0
table.rows.length.times do
  table = b.table(id: "table")
  puts table[i][given_index].text
  i = i+1
end
第二个选项(让我们不断尝试重新定位表):

table.rows.each do |row| #We'll take each row
  cell = row[given_index] #We'll take one cell of the taken row
  puts cell.text #We'll do some stuff with the text of the cell
end
i = 0
table.rows.length.times do
  table = b.table(id: "table")
  puts table[i][given_index].text
  i = i+1
end

我怀疑页面上的客户端javascript代码仍然在构建表,或者在自动化与表交互时更新表

作为一种尝试查看情况是否如此的方法,我会尝试在代码开始运行之前短暂插入一个大的等待,比如10或15秒。我通常避免使用sleep进行同步(因为sleep太短(片状测试)或太长(缓慢测试)。但是对于故障排除和调试来说,它可以快速识别同步问题


如果这造成了不同,您知道您有一个同步问题,然后可以更深入地了解如何判断页面何时完成了自身更新。通常这意味着查找在更新结束时创建的某个元素,并让代码等待直到它看到页面上的该元素后再继续。对于页面使用jQuery还可以获得jQuery.active值(打开ajax请求)然后等待它变为零,并在那里停留半秒钟左右,作为一种告诉页面已使用客户端ajax请求完成,并且可能处于正确状态,以便测试继续进行的方式。

您确定这是针对该段代码的异常情况吗?我希望#-ie
c的
未定义方法'each'ells[给定索引]。每个
都不应该有效。一旦您有了一个特定的单元格,
单元格[给定索引]
,就没有什么可重复的了。我同意Justin的观点。
.cells
返回一个集合,但是
单元格{index]
将是一个单元格,因此无需迭代。对于rows.each循环中的代码,我希望类似于
row.cell(:index=>gived_index).text.should==预期值
很抱歉,我发现我写错了代码。我已经添加了所需的更正。但是有一个问题。是不是
行.单元格(:index=>给定的索引)。text
行.单元格[index]
相同(其中
索引
是单元格在集合中的位置)?请提供您的html代码。您是否确定在测试工作时没有ajax请求可以更改元素的DOM?我已经添加了我正在解析的表行的示例html代码。感谢您的帖子。但这没有帮助。即使将正文替换为
put row.text
,代码也会失败。我还更新为b问题的主体。添加了另一种方式。这是一种相当肮脏的方式,但可能会有所帮助。