symbiont 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +14 -0
  3. data/HISTORY.md +6 -0
  4. data/README.md +1 -1
  5. data/app/Gemfile +4 -0
  6. data/app/app.rb +167 -0
  7. data/app/config/database.rb +9 -0
  8. data/app/models/plan.rb +10 -0
  9. data/app/models/product.rb +10 -0
  10. data/app/models/study.rb +11 -0
  11. data/app/models/user.rb +13 -0
  12. data/app/public/css/style.css +138 -0
  13. data/app/views/create_plan.erb +21 -0
  14. data/app/views/create_product.erb +15 -0
  15. data/app/views/create_study.erb +24 -0
  16. data/app/views/create_user.erb +60 -0
  17. data/app/views/db_plans.erb +31 -0
  18. data/app/views/db_products.erb +29 -0
  19. data/app/views/db_studies.erb +33 -0
  20. data/app/views/db_users.erb +23 -0
  21. data/app/views/entity_list.erb +10 -0
  22. data/app/views/index.erb +7 -0
  23. data/app/views/layout.erb +39 -0
  24. data/app/views/login_page.erb +17 -0
  25. data/app/views/success_1.erb +2 -0
  26. data/app/views/success_2.erb +2 -0
  27. data/app/views/test_database.erb +13 -0
  28. data/app/views/test_events.erb +44 -0
  29. data/app/views/test_page.erb +164 -0
  30. data/lib/symbiont.rb +3 -0
  31. data/lib/symbiont/enclosers.rb +17 -0
  32. data/lib/symbiont/evaluators.rb +17 -0
  33. data/lib/symbiont/platform_watir/platform_object.rb +22 -2
  34. data/lib/symbiont/version.rb +1 -1
  35. data/lib/symbiont/web_objects/_common.rb +36 -1
  36. data/lib/symbiont/web_objects/table.rb +9 -0
  37. data/lib/symbiont/web_objects/table_row.rb +9 -0
  38. data/spec/symbiont/enclosers_spec.rb +5 -0
  39. data/spec/symbiont/evaluators_spec.rb +24 -0
  40. data/spec/symbiont/web_object_spec.rb +60 -2
  41. data/spec/symbiont/web_objects/table_row_spec.rb +9 -0
  42. data/spec/symbiont/web_objects/table_spec.rb +8 -0
  43. data/specs/button.feature +2 -0
  44. data/specs/definitions/pages.rb +17 -0
  45. data/specs/evaluators.feature +5 -0
  46. data/specs/events.feature +19 -0
  47. data/specs/link.feature +2 -0
  48. data/specs/support/test_steps/action_steps_buttons.rb +2 -0
  49. data/specs/support/test_steps/action_steps_evaluators.rb +3 -0
  50. data/specs/support/test_steps/action_steps_events.rb +40 -0
  51. data/specs/support/test_steps/action_steps_links.rb +2 -0
  52. data/specs/support/test_steps/action_steps_navigate.rb +4 -0
  53. data/specs/support/test_steps/action_steps_webobjects.rb +25 -0
  54. data/specs/web_object.feature +11 -0
  55. data/symbiont.gemspec +3 -3
  56. metadata +47 -13
@@ -0,0 +1,24 @@
1
+ <section id="create_study">
2
+ <span id="navigate"><a href="entity_list">Back to List</a> | <a href="test_database">Logout</a></span></p>
3
+ <form id="studyFormID" clas="studyFormClass" name="studyFormName" method="post" action="/create_study">
4
+ <p><label id="lbl_studyName" class="Fld" for="studyName">Study Name:</label><br />
5
+ <input id="studyName" name="studyName" class="Fld" size="40" type="text"/></p>
6
+
7
+ <p><label id="lbl_studyProtocol" class="Fld" for="studyProtocol">Protocol:</label><br />
8
+ <input id="studyProtocol" name="studyProtocol" class="Fld" size="40" type="text"/></p>
9
+
10
+ <p><label id="lbl_studyProduct" class="Fld" for="studyProduct">Product:</label><br />
11
+ <select id="studyProduct" name="studyProduct">
12
+ <option value="blank"></option>
13
+ <% @products = Product.all %>
14
+ <% @products.each do |product| %>
15
+ <option value="<%= product.name %>"><%= product.name %></option>
16
+ <% end %>
17
+ </select>
18
+
19
+ <p><label id="lbl_studyPhase" class="Fld" for="studyPhase">Phase:</label><br />
20
+ <input id="studyPhase" name="studyPhase" class="Fld" size="40" type="text"/></p>
21
+
22
+ <p><input id="btnSubmit" name="btnSubmit" class="btn" type="submit" value="Create Study"></p>
23
+ </form>
24
+ </section>
@@ -0,0 +1,60 @@
1
+ <script>
2
+ function showPasswordFields() {
3
+ document.getElementById('password_area').style.display = '';
4
+ document.getElementById('SetPasswordLink').style.display = 'none';
5
+ }
6
+
7
+ function showCapabilities() {
8
+ document.getElementById('capabilities_area').style.display = '';
9
+ document.getElementById('RevealCapabilities').style.display = 'none';
10
+ }
11
+ </script>
12
+
13
+ <section id="create_user">
14
+ <span id="navigate"><a href="entity_list">Back to List</a> | <a href="test_database">Logout</a></span></p>
15
+ <form id="userFormID" class="userFormClass" name="userFormName" method="post" action="/create_user">
16
+ <p><label id="lbl_loginName" class="Fld" for="loginName">Login Name:</label><br />
17
+ <input id="loginName" name="loginName" class="Fld" size="40" type="text"/></p>
18
+
19
+ <p><label id="lbl_firstName" class="Fld" for="firstName">First Name:</label><br />
20
+ <input id="firstName" name="firstName" class="Fld" size="40" type="text"/></p>
21
+
22
+ <p><label id="lbl_lastName" class="Fld" for="lastName">Last Name:</label><br />
23
+ <input id="lastName" name="lastName" class="Fld" size="40" type="text"/></p>
24
+
25
+ <p><label id="lbl_level" class="Fld" for="level">Maximum Level:</label><br />
26
+ <select name="level" id="level" class="sel_list_class">
27
+ <option value="option1">Expert</option>
28
+ <option value="option2">Advanced</option>
29
+ <option value="option3">Basic</option>
30
+ </select>
31
+
32
+ <p id="SetPasswordLink"><a href="#" onclick="showPasswordFields();">Set Password</a></p>
33
+
34
+ <div id="password_area" style="display:none;">
35
+ <p><label id="lbl_password" class="Fld" for="password">Password:</label><br />
36
+ <input id="password" name="password" class="Fld" size="40" type="password"/></p>
37
+ <p><label id="lbl_confirmPassword" class="Fld" for="confirmPassword">Confirm Password:</label><br />
38
+ <input id="confirmPassword" name="confirmPassword" class="Fld" size="40" type="password"/></p>
39
+ </div>
40
+
41
+ <p id="RevealCapabilities"><a href="#" onclick="showCapabilities();">Save Current Information</a></p>
42
+
43
+ <div id="capabilities_area" style="display:none;">
44
+ <p><label id="lbl_role" class="Fld" for="role">Role:</label><br />
45
+ <select name="role" id="role" class="sel_list_class">
46
+ <option value="option1">Administrator</option>
47
+ <option value="option2">Clinical Administrator</option>
48
+ <option value="option3">Project Sponsor</option>
49
+ </select>
50
+
51
+ <p><strong>Additional Capabilities:</strong></p>
52
+ <input id="can_edit" name="can_edit" class="cb_class" type="checkbox" value="1"/> Can Edit Reports<br />
53
+ <input id="can_export" name="can_export" class="cb_class" type="checkbox" value="2"/> Can Export Report Data<br />
54
+ <input id="can_access_api" name="can_access_api" class="cb_class" type="checkbox" value="3"/> Can Access Web Services<br />
55
+ <input id="can_administrate" name="can_administrate" class="cb_class" type="checkbox" value="4"/> Can Administrate
56
+ </div>
57
+
58
+ <p><input id="btnSubmit" name="btnSubmit" class="btn" type="submit" value="Create User"></p>
59
+ </form>
60
+ </section>
@@ -0,0 +1,31 @@
1
+ <section id="plans">
2
+
3
+ <p><a href="create_plan">Add New Plan</a> <span id="navigate"><a href="entity_list">Back to List</a> | <a href="test_database">Logout</a></span></p>
4
+
5
+ <hr/>
6
+
7
+ <% if @plans.count > 0 %>
8
+ <table class="entity">
9
+ <caption>
10
+ <strong>Current Plans</strong>
11
+ </caption>
12
+ <thead>
13
+ <th id="planName">Plan Name</th>
14
+ <th id="planStudy">Associated Study</th>
15
+ <th id="planDescription">Plan Description</th>
16
+ </thead>
17
+ <tbody>
18
+ <% @plans.each do |plan| %>
19
+ <tr>
20
+ <td headers="planName"><%= plan.plan_name %></td>
21
+ <td headers="planStudy"><%= plan.study %></td>
22
+ <td headers="planDescription"><%= plan.plan_description %></td>
23
+ </tr>
24
+ <% end %>
25
+ </tbody>
26
+ </table>
27
+ <% else %>
28
+ <p>No plans in database.</p>
29
+ <% end %>
30
+
31
+ </section>
@@ -0,0 +1,29 @@
1
+ <section id="products">
2
+ <p><a href="create_product">Add New Product</a> <span id="navigate"><a href="entity_list">Back to List</a> | <a href="test_database">Logout</a></span></p>
3
+
4
+ <hr/>
5
+
6
+ <% if @products.length > 0 %>
7
+ <table class="entity">
8
+ <caption>
9
+ <strong>Current Products</strong>
10
+ </caption>
11
+ <thead>
12
+ <th id="productID">Product ID</th>
13
+ <th id="productName">Product Name</th>
14
+ <th id="productDescription">Product Description</th>
15
+ </thead>
16
+ <tbody>
17
+ <% @products.each do |product| %>
18
+ <tr>
19
+ <td headers="productID"><%= product.product_id %></td>
20
+ <td headers="productName"><%= product.name %></td>
21
+ <td headers="productDescription"><%= product.description %></td>
22
+ </tr>
23
+ <% end %>
24
+ </tbody>
25
+ </table>
26
+ <% else %>
27
+ <p>No products in database.</p>
28
+ <% end %>
29
+ </section>
@@ -0,0 +1,33 @@
1
+ <section id="studies">
2
+
3
+ <p><a href="create_study">Add New Study</a> <span id="navigate"><a href="entity_list">Back to List</a> | <a href="test_database">Logout</a></span></p>
4
+
5
+ <hr/>
6
+
7
+ <% if @studies.length > 0 %>
8
+ <table class="entity">
9
+ <caption>
10
+ <strong>Current Studies</strong>
11
+ </caption>
12
+ <thead>
13
+ <th id="studyName">Study Name</th>
14
+ <th id="studyProduct">Associated Product</th>
15
+ <th id="studyPhase">Study Phase</th>
16
+ <th id="studyProtocol">Study Protocol</th>
17
+ </thead>
18
+ <tbody>
19
+ <% @studies.each do |study| %>
20
+ <tr>
21
+ <td headers="studyName"><%= study.study_name %></td>
22
+ <td headers="studyProduct"><%= study.product %></td>
23
+ <td headers="studyPhase"><%= study.phase %></td>
24
+ <td headers="studyProtocol"><%= study.protocol %></td>
25
+ </tr>
26
+ <% end %>
27
+ </tbody>
28
+ </table>
29
+ <% else %>
30
+ <p>No studies in database.</p>
31
+ <% end %>
32
+
33
+ </section>
@@ -0,0 +1,23 @@
1
+ <section id="users">
2
+ <p><a href="create_user">Add New User</a> <span id="navigate"><a href="entity_list">Back to List</a> | <a href="test_database">Logout</a></span></p>
3
+
4
+ <hr />
5
+
6
+ <% if @users.count > 0 %>
7
+ <table class="entity">
8
+ <thead>
9
+ <th>Current Users</th>
10
+ </thead>
11
+ <tbody>
12
+ <% @users.each do |user| %>
13
+ <tr>
14
+ <td><%= user.firstname + " " + user.lastname %></td>
15
+ <td><%= user.loginname %></td>
16
+ </tr>
17
+ <% end %>
18
+ </tbody>
19
+ </table>
20
+ <% else %>
21
+ <p>No users in database.</p>
22
+ <% end %>
23
+ </section>
@@ -0,0 +1,10 @@
1
+ <section id="entity_list">
2
+ <p>Welcome <%= params["loginName"] %>. <span id="navigate"><a href="test_database">Logout</a></span></p>
3
+ <h2>Entity List</h2>
4
+ <% if params["loginName"] == "administrator" %>
5
+ <p><a id="users" href="db_users">Users</a></p>
6
+ <% end %>
7
+ <p><a id="products" href="db_products">Products</a></p>
8
+ <p><a id="studies" href="db_studies">Studies</a></p>
9
+ <p><a id="plans" href="db_plans">Plans</a></p>
10
+ </section>
@@ -0,0 +1,7 @@
1
+ <p>Choose the testing area to go to:</p>
2
+
3
+ <ul>
4
+ <li><a id="test_page" href="test_page">Simple Object Page</a></li>
5
+ <li><a id="test_events" href="test_events">Simple Events Page</a></li>
6
+ <li><a id="test_database" href="test_database">Simple Database Application</a></li>
7
+ </ul>
@@ -0,0 +1,39 @@
1
+ <!doctype html>
2
+ <html dir="ltr" lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title><%= @title + ' | Test Application' %></title>
6
+ <meta name="HandheldFriendly" content="True">
7
+ <meta name="MobileOptimized" content="320">
8
+ <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1">
9
+ <link href="http://localhost:4567/css/style.css" media="screen" rel="stylesheet">
10
+ <!--[if lt IE 9]>
11
+ <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
12
+ <![endif]-->
13
+ </head>
14
+ <body>
15
+
16
+ <header>
17
+ <hgroup>
18
+ <h1><a href="/">Testing Application</a></h1>
19
+ <h2>Minimal Testing Application</h2>
20
+ </hgroup>
21
+ </header>
22
+
23
+ <div id="main">
24
+ <% if flash[:notice] %>
25
+ <p class="notice"><%= flash[:notice] %></p>
26
+ <% end %>
27
+ <% if flash[:error] %>
28
+ <p class="error"><%= flash[:error] %>
29
+ <% end %>
30
+ <%= yield %>
31
+ </div>
32
+
33
+ <footer>
34
+ <p><small>An app for attaching the <a href="https://github.com/jnyman/symbiont">Symbiont</a> to.</small></p>
35
+ <p><small>Part of the <a href="https://github.com/jnyman/lucid">Lucid Framework</a>.</small></p>
36
+ </footer>
37
+
38
+ </body>
39
+ </html>
@@ -0,0 +1,17 @@
1
+ <section id="login">
2
+ <form id="loginFormID" class="loginFormClass" name="loginFormName" method="get" action="/entity_list" target="_top">
3
+ <p><label id="lbl_server" class="Fld" for="server">Server:</label><br />
4
+ <input id="serverID" name="serverName" class="Fld" size="40" type="text" value="Test"/></p>
5
+
6
+ <p><label id="lbl_clientCode" class="Fld" for="clientCode">Client ID:</label><br />
7
+ <input id="clientID" name="clientIDName" class="Fld" size="40" type="text"/></p>
8
+
9
+ <p><label id="lbl_loginName" class="Fld" for="loginName">Login Name:</label><br />
10
+ <input id="loginNameID" name="loginName" class="Fld" size="40" type="text"/></p>
11
+
12
+ <p><label id="lbl_password" class="Fld" for="password">Password:</label><br />
13
+ <input id="passwordID" name="passwordName" class="Fld" size="40" type="password"/></p>
14
+
15
+ <p><input id="btnSubmit" name="btnSubmit" class="btn" type="submit" value="Log In"></p>
16
+ </form>
17
+ </section>
@@ -0,0 +1,2 @@
1
+ <h1 class="title">Success</h1>
2
+ <p>This is the first success page.</p>
@@ -0,0 +1,2 @@
1
+ <h1 class="title">Success</h1>
2
+ <p>This is the second success page.</p>
@@ -0,0 +1,13 @@
1
+ <h1>Sample Database Application</h1>
2
+
3
+ <iframe style="float: left;" id="loginSection" name="loginSection" src="login_page" width="500" height="300">
4
+ </iframe>
5
+
6
+ <table>
7
+ <tr><td>&nbsp;</td>
8
+ <td>
9
+ <p>This is a sample login form that is within an iframe. You can sign in using any values.</p>
10
+ <p>Signing in as "administrator" will give you an extra option, which is something you can test for.</p>
11
+ </td>
12
+ </tr>
13
+ </table>
@@ -0,0 +1,44 @@
1
+ <script type="text/javascript">
2
+ function unhide() {
3
+ document.getElementById("conditional").style.display="block";
4
+ }
5
+
6
+ function hide() {
7
+ document.getElementById("conditional").style.display="none";
8
+ }
9
+
10
+ function addDiv() {
11
+ var button = document.createElement("input");
12
+ button.setAttribute("type", "button");
13
+ button.setAttribute("value", "Newly Created Button");
14
+ button.setAttribute("id", "new_button");
15
+ //document.body.appendChild(button);
16
+ var sectional = document.getElementById("created")
17
+ sectional.appendChild(button);
18
+ }
19
+
20
+ function removeDiv() {
21
+ var button = document.getElementById("new_button");
22
+ //document.body.removeChild(button);
23
+ var sectional = document.getElementById("created")
24
+ sectional.removeChild(button);
25
+ }
26
+ </script>
27
+
28
+ <section id="test_events">
29
+ <h2>Simple Events Page</h2>
30
+
31
+ <div class="group">
32
+ <input type="button" id="conditional" value="Conditional Button"/><br /><br />
33
+ <input type="button" onclick="setTimeout(function() {hide();}, 2000);" value="Hide Button"/>
34
+ <input type="button" onclick="setTimeout(function() {unhide();}, 2000);" value="Reveal Button"/>
35
+ </div>
36
+
37
+ <div class="group">
38
+ <input type="button" onclick="setTimeout(function() {addDiv();}, 2000);" value="Create Button"/>
39
+ <input type="button" onclick="setTimeout(function() {removeDiv();}, 2000);" value="Remove Button"/>
40
+
41
+ <div id="created">
42
+ </div>
43
+ </div>
44
+ </section>
@@ -0,0 +1,164 @@
1
+ <section id="test_page">
2
+ <h2>Simple Object Page</h2>
3
+
4
+ <p>Use this page to test out logic on common web objects.</p>
5
+
6
+ <h3>Links</h3>
7
+
8
+ <div class="indent">
9
+ <p>Here is a link with more than one way to identify it.</p>
10
+ <p><a href="success_1" id="avengersID" class="avengersClass" name="avengersName">Avengers Assemble</a></p>
11
+
12
+ <p>Here are two links that are identical for index (implicit) but not link location (explicit).</p>
13
+ <p><a href="success_1">Justice League Unite</a><br />
14
+ <a href="success_2">Justice League Unite</a></p>
15
+
16
+ <p>Here is a link that has no locators.</p>
17
+ <p><a href="success_1">&quot;in the brightest day; in the darkest night&quot;</a></p>
18
+ </div>
19
+
20
+ <h3>Standalone Form Elements</h3>
21
+
22
+ <div class="group">
23
+ <p>Below is a regular button and a disabled button. Both buttons have a series of possible locators.</p>
24
+
25
+ <form action="success_1" method="get">
26
+ <input id="clickmeID" class="clickmeClass" name="clickmeName" type="submit" value="Click Me">
27
+ <br/>
28
+ <input id="cantclickmeID" class="cantclickmeClass" name="cantclickmeName" disabled="disabled" type="submit" value="Can't Click Me">
29
+ </form>
30
+ </div>
31
+
32
+ <div class="group">
33
+ <p>Below is a group of related field elements. Of note, one of them is a hidden field for the ISBN.</p>
34
+
35
+ <label id="book_title"><strong>Book Title:</strong></label>
36
+ <br/>
37
+ <input id="bookTitleID" class="bookTitleClass" name="bookTitleName" size="40" type="text">
38
+ <br/>
39
+ <br/>
40
+ <label id=book_summary"><strong>Book Summary:</strong></label>
41
+ <br/>
42
+ <textarea id="bookSummaryID" class="bookSummaryClass" name="bookSummaryName" rows="2" cols="80"/></textarea>
43
+ <br/>
44
+ <input id="bookIsbnID" class="bookIsbnClass" name="bookIsbnName" size="40" type="hidden" value="0-85131-041-9">
45
+ <br/>
46
+ <label class="book_reference_id"><strong>Book Internal Reference ID (Read Only):</strong></label>
47
+ <br/>
48
+ <input id="bookRefID" class="bookRefClass" name="bookRefName" readonly="readonly" size="40" type="text" value="1123456:AF01" style="background-color: #000000; color: yellow;">
49
+ <br/>
50
+ <br/>
51
+ <label id="book_publisher_id"><strong>Book Internal Publisher ID (Disabled):</strong></label>
52
+ <br/>
53
+ <input id="bookPubID" class="bookPubClass" name="bookPubName" disabled="disabled" size="40" type="text" value="ESC:001678:FNC">
54
+ </div>
55
+
56
+ <div class="group">
57
+ <p>This grouping contains some common web objects that are placed on forms or pages to allow selections. Note that some are disabled.</p>
58
+
59
+ <p><strong>Choose Your Physics Concepts:</strong></p>
60
+ <select id="physicsConceptsID" class="physicsConceptsClass" name="physicsConceptsName">
61
+ <option value="option1">Quantum Entanglement</option>
62
+ <option value="option2">Tachyonic Antitravel</option>
63
+ <option value="option3">Bose-Einstein Condensates</option>
64
+ </select>
65
+
66
+ <p><strong>Your Favorite Sith Power (Disabled):</strong></p>
67
+ <select id="sithPowerID" class="sithPowerClass" name="sithPowerName" disabled="disabled">
68
+ <option value="option1">Force Lightning</option>
69
+ <option value="option2">Sundering Assault</option>
70
+ <option value="option3">Vicious Slash</option>
71
+ </select>
72
+
73
+ <p><strong>Choose Your Futuristic Technology:</strong></p>
74
+ <input id="camoArmorID" class="camoArmorClass" name="camoArmorName" type="checkbox" value="1">Chameleoflage Armor
75
+ <br/>
76
+ <input id="neuralShuntID" class="neuralShuntClass" name="neuralShuntName" type="checkbox" value="2">Neural Shunts
77
+ <br/>
78
+ <input id="kineticHarpoonID" class="kineticHarpoonClass" name="kineticHarpoonName" type="checkbox" value="3">Kinetic Harpoons
79
+ <br/>
80
+ <input id="organicCircuitryID" class="organicCircuitryClass" name="organicCircuitryName" type="checkbox" value="4">Organic Circuitry
81
+ <br/>
82
+ <input id="eigenstateID" class="eigenstateClass" name="eigenstateName" type="checkbox" value="5" disabled="disabled">Preferential Eigenstate Selector (Disabled)
83
+
84
+ <p><strong>Select Your Least Favorite Way To Vaporize:</strong>
85
+ <form>
86
+ <input id="mtcID" class="mtcClass" name="vaporize" type="radio" value="Multiphasic Temporal Convergence">Multiphasic Temporal Convergence
87
+ <br/>
88
+ <input id="upsID" class="upsClass" name="vaporize" type="radio" value="Unstable Phase Shift">Unstable Phase Shift
89
+ <br/>
90
+ <input id="wcbID" class="wcbClass" name="vaporize" type="radio" value="Warp Core Breach">Warp Core Breach
91
+ <br/>
92
+ <input id="cmeID" class="cmeClass" name="vaporize" type="radio" value="Coronal Mass Ejection" disabled="disabled">Coronal Mass Ejection (Disabled)
93
+ </form>
94
+ </div>
95
+
96
+ <h3>Tables</h3>
97
+
98
+ <div class="group">
99
+ <p>This first table is very simple, using just basic HTML constructs. It has only one way identify it.</p>
100
+
101
+ <table id="atomicTableID" border="1" width="400" cellpadding="3" cellspacing="3">
102
+ <tr>
103
+ <th>Element</th>
104
+ <th>Symbol</th>
105
+ <th>Atomic Number</th>
106
+ </tr>
107
+ <tr>
108
+ <td>Carbon</td>
109
+ <td>C</td>
110
+ <td>6</td>
111
+ </tr>
112
+ <tr>
113
+ <td>Molybdenum</td>
114
+ <td>Mo</td>
115
+ <td>42</td>
116
+ </tr>
117
+ <tr>
118
+ <td>Radon</td>
119
+ <td>Rn</td>
120
+ <td>86</td>
121
+ </tr>
122
+ <tr>
123
+ <td>Xenon</td>
124
+ <td>Xe</td>
125
+ <td>54</td>
126
+ </tr>
127
+ </table>
128
+
129
+ <p>This second table uses more HTML constructs. It has multiple ways to identify it.</p>
130
+
131
+ <table id="savingsTableID" name="savingsTableName" class="savingsTableClass" border='1'>
132
+ <thead>
133
+ <tr>
134
+ <th>Month</th>
135
+ <th>Savings</th>
136
+ </tr>
137
+ </thead>
138
+ <tfoot>
139
+ <tr>
140
+ <td>Sum</td>
141
+ <td>$180</td>
142
+ </tr>
143
+ </tfoot>
144
+ <tbody>
145
+ <tr>
146
+ <td>January</td>
147
+ <td id="jan_save" name="jan_save" class="cell_class">$100</td>
148
+ </tr>
149
+ <tr>
150
+ <td>February</td>
151
+ <td id="feb_save" name="feb_save" class="cell_class">$80</td>
152
+ </tr>
153
+ </tbody>
154
+ </table>
155
+ </div>
156
+
157
+ <h3>Sectional Elements (Div and Span)</h3>
158
+
159
+ <div class="group">
160
+ <div id="divTextID" name="divTextName" class="divTextClass">This text is within a div tag.</div>
161
+ <span id="spanTextID" name="spanTextName" class="spanTextClass">This text is within a span tag.</div>
162
+ </div>
163
+
164
+ </section>