头脑风暴,用Watir-webdriver验证HTML表内容的方法

|| 我正在尝试制定一种方法来使用Watir-webdriver检查HTML表的内容。基本上,我想针对已保存的有效表(CSV文件)验证表内容,刷新或重绘操作后它们相同。 到目前为止,我提出的想法是: 抓取表格HTML并将其作为字符串与基线值进行比较。 遍历每个单元格并比较HTML或文本内容。 在表内容上生成2D数组表示形式,并进行数组比较。 最快/最好的方法是什么?您对如何处理类似问题有见解吗? 这是表格的示例:
<table id=\"attr-table\">
<thead>
<tr><th id=\"attr-action-col\"><input type=\"checkbox\" id=\"attr-action-col_box\" class=\"attr-action-box\" value=\"\"></th><th id=\"attr-scope-col\"></th><th id=\"attr-workflow-col\">Status</th><th id=\"attr-type-col\"></th><th id=\"attr-name-col\">Name<span class=\"ui-icon ui-icon-triangle-1-n\"></span></th><th id=\"attr-value-col\">Francais Value</th></tr></thead>
<tbody>
<tr id=\"attr-row-209\"><td id=\"attr_action_209\" class=\"attr-action-col\"><input type=\"checkbox\" id=\"attr_action_209_box\" class=\"attr-action-box\" value=\"\"></td><td id=\"attr_scope_209\" class=\"attr-scope-col\"><a href=\"#\" class=\"ws-invoke-editor\" id=\"attr_scope_209_a\"><img src=\"images/attrib_bullet_global.png\" title=\"global\"></a></td><td id=\"attr_workflow_209\" class=\"attr-workflow-col\"></td><td id=\"attr_type_209\" class=\"attr-type-col\"><a href=\"#\" class=\"ws-invoke-editor\" id=\"attr_type_209_a\"><img src=\"images/attrib_text.png\"></a></td><td id=\"attr_name_209\" class=\"attr-name-col\"><a href=\"#\" class=\"ws-invoke-editor\" id=\"attr_name_209_a\">Name of: Catalogue</a></td><td id=\"attr_value_209\" class=\"attr-value-col\"><a href=\"#\" class=\"ws-invoke-editor lang_10\" id=\"attr_value_209_a\"><p class=\"acms ws-editable-content lang_10\">2010 EI-176</p></a></td></tr>
<tr id=\"attr-row-316\"><td id=\"attr_action_316\" class=\"attr-action-col\"><input type=\"checkbox\" id=\"attr_action_316_box\" class=\"attr-action-box\" value=\"\"></td><td id=\"attr_scope_316\" class=\"attr-scope-col\"><a href=\"#\" class=\"ws-invoke-editor\" id=\"attr_scope_316_a\"><img src=\"images/attrib_bullet_global.png\" title=\"global\"></a></td><td id=\"attr_workflow_316\" class=\"attr-workflow-col\"></td><td id=\"attr_type_316\" class=\"attr-type-col\"><a href=\"#\" class=\"ws-invoke-editor\" id=\"attr_type_316_a\"><img src=\"images/attrib_text.png\"></a></td><td id=\"attr_name_316\" class=\"attr-name-col\"><a href=\"#\" class=\"ws-invoke-editor\" id=\"attr_name_316_a\">_[Key] Media key</a></td><td id=\"attr_value_316\" class=\"attr-value-col\"><a href=\"#\" class=\"ws-invoke-editor lang_10\" id=\"attr_value_316_a\"><p class=\"acms ws-editable-content lang_10\"><span class=\"acms acms-choice\" contenteditable=\"false\" id=\"568\">163</span></p></a></td></tr>
<tr id=\"attr-row-392\"><td id=\"attr_action_392\" class=\"attr-action-col\"><input type=\"checkbox\" id=\"attr_action_392_box\" class=\"attr-action-box\" value=\"\"></td><td id=\"attr_scope_392\" class=\"attr-scope-col\"><a href=\"#\" class=\"ws-invoke-editor\" id=\"attr_scope_392_a\"><img src=\"images/attrib_bullet_global.png\" title=\"global\"></a></td><td id=\"attr_workflow_392\" class=\"attr-workflow-col\"></td><td id=\"attr_type_392\" class=\"attr-type-col\"><a href=\"#\" class=\"ws-invoke-editor\" id=\"attr_type_392_a\"><img src=\"images/attrib_numeric.png\"></a></td><td id=\"attr_name_392\" class=\"attr-name-col\"><a href=\"#\" class=\"ws-invoke-editor\" id=\"attr_name_392_a\">_[Key] Numéro d\'ordre</a></td><td id=\"attr_value_392\" class=\"attr-value-col\"><a href=\"#\" class=\"ws-invoke-editor lang_10\" id=\"attr_value_392_a\"><p class=\"acms ws-editable-content lang_10\">2</p></a></td></tr>
</tbody>
</table>
    
已邀请:
我想出了一个主意。我使用了Hash和Class对象而不是2D数组。 foo.csv
209,global,text.Catalogue,2010 EI-176
392,global,numeric,Numéro d\'ordre,2
require \'csv\'
expected_datas = CSV.readlines(\'foo.csv\').map do |row|
  {
    :id => row[0],
    :scope => row[1],
    :type => row[2],
    :name => row[3],
    :value => row[4]
  }
end

class Data
  attr_reader :id,:scope,:type,:name,:value
  def initialize(tr)
    id = tr.id.slice(/attr-row-([0-9]+)/,1)
    scope = tr.td(:id,/scope/).img.src.slice(/attr_bullet_(.+?).png/,1)
    type = tr.td(:id,/type/).img.src.slice(/attrib_(.+?).png/,1)
    name = tr.td(:id,/name/).text
    value = tr.td(:id,/value/).text
  end
end

browser = Watir::Browser.new
browser.goto \'foobar\'
datas = browser.table(:id,\'attr-table\').tbody.trs.map{|tr| Data.new(tr)}

datas.zip(expected_datas).each do |data,expected_data|
  Data.instance_methods(false).each do |method|
    data.send(method).should == expected_data[method.to_sym]
  end
end

# something action (refresh or redraw action)
browser.refresh

after_datas = browser.table(:id,\'attr-table\').tbody.trs.map{|tr| Data.new(tr)}

datas.zip(after_datas).each do |data,after_data|
  Data.instance_methods(false).each do |method|
    data.send(method).should == after_data.send(method)
  end
end
    
您希望报告不匹配的详细程度?我认为这很可能会定义您要采用的方法。 例如,如果您只是想知道是否存在不匹配,并且不在乎,那么比较数组可能是最简单的。 如果行的顺序可以变化,那么我认为比较哈希值可能是最好的 如果要逐个报告每个不匹配项,则按行和列进行迭代将使您可以报告离散错误,尤其是如果您构建差异列表,然后根据找到的差异数量在最后进行断言     
你可以去精确匹配
before_htmltable <=> after_htmltable
或者您可以去除空格
before_htmltable.gsub(/\\s+/, \' \') <=> after_htmltable.gsub(/\\s+/, \' \')
我认为创建数组然后比较每个元素会更昂贵。 戴夫     

要回复问题请先登录注册