Question:
I am trying to work out a method to check the content of an HTML table with Watir-webdriver. Basically I want to validate the table contents against a saved valid table (CSV file) and they are the same after a refresh or redraw action.
Ideas I've come up with so far are to:
- Grab the table HTML and compare that as a string with the baseline value.
- Iterate through each cell and compare the HTML or text content.
- Generate a 2D array representation on the table contents and do an array compare.
What would be the fastest/best approach? Do you have insights on how you handled a similar problem?
Here is an example of the table:
<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>
Answers
1:
ust one idea I came up with. I used Hash and Class object instead of 2D array.
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
2:
You could go for exact match
before_htmltable <=> after_htmltable
Or you could strip whitespace
before_htmltable.gsub(/\s+/, ' ') <=> after_htmltable.gsub(/\s+/, ' ')
I would think that creating the array then comparing each element would be more expensive.
Dave
分享到:
相关推荐
头脑风暴法,又称 Brain Storming,是一种广泛应用在企业管理中的创新思维和决策支持工具,尤其在产品开发、革新、战略规划等领域。这种方法的核心在于鼓励团队成员自由地表达想法,旨在激发大量的创新观点,从而...
在QCC活动中,头脑风暴法(Brain Storming)被广泛应用,作为一种激发创新思维和集体智慧的方法。 头脑风暴法的核心在于鼓励参与者在无压力的环境中自由表达想法,无论这些想法是否传统或者离奇。这种方法分为两种...
### EventStorming:一种高效的复杂领域学习方法 #### 一、引言 在现代软件开发过程中,特别是涉及大型互联分布式系统以及与遗留系统集成时,理解业务领域本身的复杂性成为了项目成功的关键因素之一。面对这样的...
事件风暴(Event Storming)是一种集体学习和工作坊式的建模技术,由Alberto Brandolini发明,旨在帮助团队理解和设计复杂业务系统。事件风暴的核心概念在于“通过行动来学习”,强调团队成员之间的协作和沟通。通过...
Software Architecture for Developers is a practical and pragmatic guide to modern software architecture, specifically aimed at software developers....How to identify risks with risk-storming.
COLLABORATIVE LEARNING FOR COMPLEX DOMAINS EventStorming is a workshop format for quickly exploring complex business domains.
学生信息管理系统 图形用户界面(GUI) java 实现对数据库的操作 数据库用的mysql_hurricane&&storming的博客-CSDN博客_学生信息管理系统界面.html
EventStorming词汇表和备忘单 EventStorming是超越孤岛边界进行协作的最明智的方法。 EventStorming的强大功能来自一个多元化,多学科的群体,他们在一起拥有很多智慧和知识。 虽然最初是为为领域驱动的设计聚合建模...
EventStorming是一种基于研讨会的方法,可以快速找出软件程序领域中正在发生的事情。[1] 与其他方法相比,它非常轻巧,并且不需要计算机的有意支持。 结果以宽墙的粘滞便笺表示。 业务流程被“冲出”为一系列域事件...
P M : M A R C H - A P R I L 2 0 0 3Patnode is a Professor of Program Management and Leadership at the Defense Acquisition University, Fort Belvoir, Va.T E A M D E V E L O P M E N T M O D E LCan't Get ...
《Dataland Web Log Storming v3.4 Build705:深度剖析Web服务器日志分析工具》 在IT行业中,对于网站性能监控与优化,Web服务器日志分析扮演着至关重要的角色。Dataland Web Log Storming v3.4 Build705是一款专为...
其中,头脑风暴分为团队活跃时的Brain Storming和氛围较静的Brain Writing,两者各有侧重,前者强调气氛的活跃,后者更注重真诚的思考。 例如,在面对2008年北京奥运会商机时,可以进行头脑风暴预测热销产品,如...
本备忘单旨在为准备和推动Event Storming Workshop提供简短的总结。 它不打算对该主题进行完整的介绍,需要有关 DDD 和事件风暴的先验知识才能负责任地使用本文档。所需材料纸卷来创建造型表面。 可在宜家 (Mala, ...
首先,课件采用“头脑风暴”(Brain storming)的方式引入主题,通过展示猴子、书等图片,引导学生用英语描述数量,如"I see one"或"I see ten",训练他们用英语表达数字的能力。 在课程中,教师会展示生日蛋糕的...
通过 Brain Storming 和 Brain Writing,可以挖掘出多样化的产品创意,如纪念品、实用商品等。 【强制联想法】通过列举主题相关的特性、缺点或建议,引导思考,产生改进或创新的点子。例如,将不同的汉字进行组合,...
【EMS内训07QCC品管圈培训BrainStorming.pptx】是关于QCC品管圈的培训材料,其中详细介绍了如何运用Brain Storming(头脑风暴法)这一技术来提升团队创新和问题解决能力。QCC品管圈是一种质量管理工具,由品质保证部...
使用通过Event Storming提供的域驱动设计方法,它可以帮助减少项目团队中每个人理解业务域模型所花费的时间。 理论与实践:现实世界中的学习案例 经历所有学习过程,在AWS上开发->构建->部署工件 目录 事件风暴 ...
例如,面对特定的商业挑战,如2008年北京奥运会的商机,或者寻找Ball Pen的新用途,我们可以运用Brain Storming或Brain Writing等方法,让团队成员分别或集体提出各种可能的想法,甚至通过组合汉字来激发创新思维。...
"Brain storming feelings"环节鼓励孩子们进行头脑风暴,列出更多关于感觉的词汇,比如"tired"和"ill",这样有助于扩展他们的词汇库。 "Look and say"和"Act and guess"活动则通过观察和表演来锻炼孩子们的观察力和...
1. 头脑风暴法(Brain Storming, BS)是一种集体创新技巧,鼓励参与者提出各种想法,不受限制,旨在激发创意和思维共振。会议主持者需营造自由开放的氛围,避免过早评判,以便挖掘更多的潜在方案。 2. 哥顿法...