cornucopia 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +51 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +16 -0
  6. data/LICENSE.TXT +22 -0
  7. data/README.md +341 -0
  8. data/Rakefile +18 -0
  9. data/cornucopia.gemspec +39 -0
  10. data/lib/cornucopia.rb +18 -0
  11. data/lib/cornucopia/capybara/finder_diagnostics.rb +536 -0
  12. data/lib/cornucopia/capybara/finder_extensions.rb +89 -0
  13. data/lib/cornucopia/capybara/install_finder_extensions.rb +105 -0
  14. data/lib/cornucopia/capybara/install_matcher_extensions.rb +39 -0
  15. data/lib/cornucopia/capybara/matcher_extensions.rb +83 -0
  16. data/lib/cornucopia/capybara/page_diagnostics.rb +228 -0
  17. data/lib/cornucopia/cucumber_hooks.rb +38 -0
  18. data/lib/cornucopia/factory_girl/dynamic_association.rb +14 -0
  19. data/lib/cornucopia/rspec_hooks.rb +37 -0
  20. data/lib/cornucopia/site_prism/element_extensions.rb +273 -0
  21. data/lib/cornucopia/site_prism/install_element_extensions.rb +23 -0
  22. data/lib/cornucopia/site_prism/page_application.rb +126 -0
  23. data/lib/cornucopia/source_files/collapse.gif +0 -0
  24. data/lib/cornucopia/source_files/cornucopia.css +162 -0
  25. data/lib/cornucopia/source_files/expand.gif +0 -0
  26. data/lib/cornucopia/source_files/index_base.html +10 -0
  27. data/lib/cornucopia/source_files/index_contents.html +2 -0
  28. data/lib/cornucopia/source_files/more_info.js +87 -0
  29. data/lib/cornucopia/source_files/report_base.html +10 -0
  30. data/lib/cornucopia/source_files/report_contents.html +3 -0
  31. data/lib/cornucopia/spinach_hooks.rb +51 -0
  32. data/lib/cornucopia/util/configuration.rb +493 -0
  33. data/lib/cornucopia/util/configured_report.rb +520 -0
  34. data/lib/cornucopia/util/file_asset.rb +46 -0
  35. data/lib/cornucopia/util/generic_settings.rb +37 -0
  36. data/lib/cornucopia/util/log_capture.rb +97 -0
  37. data/lib/cornucopia/util/pretty_formatter.rb +580 -0
  38. data/lib/cornucopia/util/report_builder.rb +474 -0
  39. data/lib/cornucopia/util/report_formatters.rb +11 -0
  40. data/lib/cornucopia/util/report_table.rb +195 -0
  41. data/lib/cornucopia/version.rb +3 -0
  42. data/lib/tasks/cornucopia_tasks.rake +4 -0
  43. data/spec/dummy/README.rdoc +28 -0
  44. data/spec/dummy/Rakefile +6 -0
  45. data/spec/dummy/app/assets/images/.keep +0 -0
  46. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  47. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  48. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  49. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  50. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  51. data/spec/dummy/app/mailers/.keep +0 -0
  52. data/spec/dummy/app/models/.keep +0 -0
  53. data/spec/dummy/app/models/concerns/.keep +0 -0
  54. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  55. data/spec/dummy/bin/bundle +3 -0
  56. data/spec/dummy/bin/rails +4 -0
  57. data/spec/dummy/bin/rake +4 -0
  58. data/spec/dummy/config.ru +4 -0
  59. data/spec/dummy/config/application.rb +27 -0
  60. data/spec/dummy/config/boot.rb +5 -0
  61. data/spec/dummy/config/cucumber.yml +8 -0
  62. data/spec/dummy/config/database.yml +37 -0
  63. data/spec/dummy/config/environment.rb +5 -0
  64. data/spec/dummy/config/environments/development.rb +29 -0
  65. data/spec/dummy/config/environments/production.rb +80 -0
  66. data/spec/dummy/config/environments/test.rb +36 -0
  67. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  68. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  69. data/spec/dummy/config/initializers/inflections.rb +16 -0
  70. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  71. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  72. data/spec/dummy/config/initializers/session_store.rb +3 -0
  73. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  74. data/spec/dummy/config/locales/en.yml +23 -0
  75. data/spec/dummy/config/routes.rb +56 -0
  76. data/spec/dummy/db/schema.rb +16 -0
  77. data/spec/dummy/features/support/env.rb +66 -0
  78. data/spec/dummy/lib/assets/.keep +0 -0
  79. data/spec/dummy/lib/tasks/cucumber.rake +65 -0
  80. data/spec/dummy/public/404.html +58 -0
  81. data/spec/dummy/public/422.html +58 -0
  82. data/spec/dummy/public/500.html +57 -0
  83. data/spec/dummy/public/favicon.ico +0 -0
  84. data/spec/dummy/script/cucumber +10 -0
  85. data/spec/fixtures/sample_page.html +150 -0
  86. data/spec/lib/capybara/finder_diagnostics_spec.rb +517 -0
  87. data/spec/lib/capybara/finder_extensions_spec.rb +328 -0
  88. data/spec/lib/capybara/page_diagnostics_spec.rb +277 -0
  89. data/spec/lib/site_prism/element_extensions_spec.rb +290 -0
  90. data/spec/lib/site_prism/page_application_spec.rb +81 -0
  91. data/spec/lib/util/configuration_spec.rb +254 -0
  92. data/spec/lib/util/configured_report_spec.rb +1058 -0
  93. data/spec/lib/util/file_asset_spec.rb +86 -0
  94. data/spec/lib/util/generic_settings_spec.rb +48 -0
  95. data/spec/lib/util/log_capture_spec.rb +151 -0
  96. data/spec/lib/util/pretty_formatter_spec.rb +694 -0
  97. data/spec/lib/util/report_builder_spec.rb +983 -0
  98. data/spec/lib/util/report_formatters_spec.rb +13 -0
  99. data/spec/lib/util/report_table_exception_spec.rb +21 -0
  100. data/spec/lib/util/report_table_spec.rb +319 -0
  101. data/spec/pages/cornucopia_report_app.rb +10 -0
  102. data/spec/pages/google/email_page.rb +22 -0
  103. data/spec/pages/google/login_page.rb +25 -0
  104. data/spec/rails_helper.rb +43 -0
  105. data/spec/sample_report.rb +45 -0
  106. data/spec/spec_helper.rb +81 -0
  107. metadata +410 -0
@@ -0,0 +1,58 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style>
6
+ body {
7
+ background-color: #EFEFEF;
8
+ color: #2E2F30;
9
+ text-align: center;
10
+ font-family: arial, sans-serif;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 25em;
15
+ margin: 4em auto 0 auto;
16
+ border: 1px solid #CCC;
17
+ border-right-color: #999;
18
+ border-left-color: #999;
19
+ border-bottom-color: #BBB;
20
+ border-top: #B00100 solid 4px;
21
+ border-top-left-radius: 9px;
22
+ border-top-right-radius: 9px;
23
+ background-color: white;
24
+ padding: 7px 4em 0 4em;
25
+ }
26
+
27
+ h1 {
28
+ font-size: 100%;
29
+ color: #730E15;
30
+ line-height: 1.5em;
31
+ }
32
+
33
+ body > p {
34
+ width: 33em;
35
+ margin: 0 auto 1em;
36
+ padding: 1em 0;
37
+ background-color: #F7F7F7;
38
+ border: 1px solid #CCC;
39
+ border-right-color: #999;
40
+ border-bottom-color: #999;
41
+ border-bottom-left-radius: 4px;
42
+ border-bottom-right-radius: 4px;
43
+ border-top-color: #DADADA;
44
+ color: #666;
45
+ box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
+ }
47
+ </style>
48
+ </head>
49
+
50
+ <body>
51
+ <!-- This file lives in public/422.html -->
52
+ <div class="dialog">
53
+ <h1>The change you wanted was rejected.</h1>
54
+ <p>Maybe you tried to change something you didn't have access to.</p>
55
+ </div>
56
+ <p>If you are the application owner check the logs for more information.</p>
57
+ </body>
58
+ </html>
@@ -0,0 +1,57 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style>
6
+ body {
7
+ background-color: #EFEFEF;
8
+ color: #2E2F30;
9
+ text-align: center;
10
+ font-family: arial, sans-serif;
11
+ }
12
+
13
+ div.dialog {
14
+ width: 25em;
15
+ margin: 4em auto 0 auto;
16
+ border: 1px solid #CCC;
17
+ border-right-color: #999;
18
+ border-left-color: #999;
19
+ border-bottom-color: #BBB;
20
+ border-top: #B00100 solid 4px;
21
+ border-top-left-radius: 9px;
22
+ border-top-right-radius: 9px;
23
+ background-color: white;
24
+ padding: 7px 4em 0 4em;
25
+ }
26
+
27
+ h1 {
28
+ font-size: 100%;
29
+ color: #730E15;
30
+ line-height: 1.5em;
31
+ }
32
+
33
+ body > p {
34
+ width: 33em;
35
+ margin: 0 auto 1em;
36
+ padding: 1em 0;
37
+ background-color: #F7F7F7;
38
+ border: 1px solid #CCC;
39
+ border-right-color: #999;
40
+ border-bottom-color: #999;
41
+ border-bottom-left-radius: 4px;
42
+ border-bottom-right-radius: 4px;
43
+ border-top-color: #DADADA;
44
+ color: #666;
45
+ box-shadow:0 3px 8px rgba(50, 50, 50, 0.17);
46
+ }
47
+ </style>
48
+ </head>
49
+
50
+ <body>
51
+ <!-- This file lives in public/500.html -->
52
+ <div class="dialog">
53
+ <h1>We're sorry, but something went wrong.</h1>
54
+ </div>
55
+ <p>If you are the application owner check the logs for more information.</p>
56
+ </body>
57
+ </html>
File without changes
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
4
+ if vendored_cucumber_bin
5
+ load File.expand_path(vendored_cucumber_bin)
6
+ else
7
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
8
+ require 'cucumber'
9
+ load Cucumber::BINARY
10
+ end
@@ -0,0 +1,150 @@
1
+ <html>
2
+ <head>
3
+ <title>This is a sample page</title>
4
+ </head>
5
+ <body>
6
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
7
+
8
+ <p>
9
+ There is a lot we could do in the body of a page.
10
+ </p>
11
+
12
+ <select id="select-box">
13
+ <option value="0">100</option>
14
+ <option value="1">101</option>
15
+ <option value="2">102</option>
16
+ <option value="3">103</option>
17
+ <option value="4">104</option>
18
+ <option value="5">105</option>
19
+ <option value="6">106</option>
20
+ <option value="7">107</option>
21
+ <option value="8">108</option>
22
+ <option value="9">109</option>
23
+ <option value="10">110</option>
24
+ <option value="11">111</option>
25
+ <option value="12">112</option>
26
+ <option value="13">113</option>
27
+ <option value="14">114</option>
28
+ <option value="15">115</option>
29
+ <option value="16">116</option>
30
+ <option value="17">117</option>
31
+ <option value="18">118</option>
32
+ <option value="19">119</option>
33
+ </select>
34
+
35
+ <select id="multi-select-box" multiple="true">
36
+ <option value="0">200</option>
37
+ <option value="1">201</option>
38
+ <option value="2">202</option>
39
+ <option value="3">203</option>
40
+ <option value="4">204</option>
41
+ <option value="5">205</option>
42
+ <option value="6">206</option>
43
+ <option value="7">207</option>
44
+ <option value="8">208</option>
45
+ <option value="9">209</option>
46
+ <option value="10">210</option>
47
+ <option value="11">211</option>
48
+ <option value="12">212</option>
49
+ <option value="13">213</option>
50
+ <option value="14">214</option>
51
+ <option value="15">215</option>
52
+ <option value="16">216</option>
53
+ <option value="17">217</option>
54
+ <option value="18">218</option>
55
+ <option value="19">219</option>
56
+ </select>
57
+
58
+ <div class="single-class">Single</div>
59
+ <div class="multi-class">Multiples 1</div>
60
+ <div class="multi-class">Multiples 2</div>
61
+ <div class="multi-class">Multiples 3</div>
62
+ <div class="multi-class">Multiples 4</div>
63
+
64
+ <div class="parent-class">
65
+ <div class="single-class">Single 1</div>
66
+ <div class="multi-class">Multiples 1-1</div>
67
+ <div class="multi-class">Multiples 1-2</div>
68
+ <div class="multi-class">Multiples 1-3</div>
69
+ <div class="multi-class">Multiples 1-4</div>
70
+ </div>
71
+
72
+ <div id="hidden-div" class="hidden" style="display: none;">
73
+ <div class="parent-class">
74
+ <div class="single-class">Single 2</div>
75
+ <div class="multi-class">Multiples 2-1</div>
76
+ <div class="multi-class">Multiples 2-2</div>
77
+ <div class="multi-class">Multiples 2-3</div>
78
+ <div class="multi-class">Multiples 2-4</div>
79
+ </div>
80
+
81
+ <a class="a-class b-class c-class" id="hidden-cool-link" href="#" onclick="alert('cool!');">Cool alert!</a>
82
+ <input class="a-class b-class c-class" id="hidden-cool-button" type="button" value="Still cool!" onclick="alert('still cool!');" />
83
+ <label>text box</label><input id="hidden-text-box" type="text" />
84
+
85
+ <div class="radio-container">
86
+ <input name="hidden-radio-group-1" id="hidden-radio-1" type="radio" value="1"> 1
87
+ <input name="hidden-radio-group-1" id="hidden-radio-2" type="radio" value="2"> 2
88
+ <input name="hidden-radio-group-1" id="hidden-radio-3" type="radio" value="3"> 3
89
+ <input name="hidden-radio-group-1" id="hidden-radio-4" type="radio" value="4"> 4
90
+ <input name="hidden-radio-group-1" id="hidden-radio-5" type="radio" value="5"> 5
91
+ <input name="hidden-radio-group-1" id="hidden-radio-6" type="radio" value="6"> 6
92
+ <input name="hidden-radio-group-1" id="hidden-radio-7" type="radio" value="7"> 7
93
+ <input name="hidden-radio-group-1" id="hidden-radio-8" type="radio" value="8"> 8
94
+ <input name="hidden-radio-group-1" id="hidden-radio-9" type="radio" value="9"> 9
95
+ <input name="hidden-radio-group-1" id="hidden-radio-10" type="radio" value="10"> 10
96
+ </div>
97
+
98
+ <div class="check-container">
99
+ <input id="hidden-check-1" type="checkbox" value="hidden-1"> 1
100
+ <input id="hidden-check-2" type="checkbox" value="hidden-2"> 2
101
+ <input id="hidden-check-3" type="checkbox" value="hidden-3"> 3
102
+ <input id="hidden-check-4" type="checkbox" value="hidden-4"> 4
103
+ <input id="hidden-check-5" type="checkbox" value="hidden-5"> 5
104
+ <input id="hidden-check-6" type="checkbox" value="hidden-6"> 6
105
+ <input id="hidden-check-7" type="checkbox" value="hidden-7"> 7
106
+ <input id="hidden-check-8" type="checkbox" value="hidden-8"> 8
107
+ <input id="hidden-check-9" type="checkbox" value="hidden-9"> 9
108
+ <input id="hidden-check-10" type="checkbox" value="hidden-10"> 10
109
+ </div>
110
+ </div>
111
+
112
+ <div class="parent-class">
113
+ <div class="single-class">Single 3</div>
114
+ <div class="multi-class">Multiples 3-1</div>
115
+ <div class="multi-class">Multiples 3-2</div>
116
+ <div class="multi-class">Multiples 3-3</div>
117
+ <div class="multi-class">Multiples 3-4</div>
118
+ </div>
119
+
120
+ <a id="cool-link" href="#" onclick="alert('cool!');">Cool alert!</a>
121
+ <input id="cool-button" type="button" value="Still cool!" onclick="alert('still cool!');" />
122
+ <label>text box</label><input id="text-box" type="text" />
123
+
124
+ <div class="radio-container">
125
+ <input name="radio-group-1" id="radio-1" type="radio" value="1"> 1
126
+ <input name="radio-group-1" id="radio-2" type="radio" value="2"> 2
127
+ <input name="radio-group-1" id="radio-3" type="radio" value="3"> 3
128
+ <input name="radio-group-1" id="radio-4" type="radio" value="4"> 4
129
+ <input name="radio-group-1" id="radio-5" type="radio" value="5"> 5
130
+ <input name="radio-group-1" id="radio-6" type="radio" value="6"> 6
131
+ <input name="radio-group-1" id="radio-7" type="radio" value="7"> 7
132
+ <input name="radio-group-1" id="radio-8" type="radio" value="8"> 8
133
+ <input name="radio-group-1" id="radio-9" type="radio" value="9"> 9
134
+ <input name="radio-group-1" id="radio-10" type="radio" value="10"> 10
135
+ </div>
136
+
137
+ <div class="check-container">
138
+ <input id="check-1" type="checkbox" value="1"> 1
139
+ <input id="check-2" type="checkbox" value="2"> 2
140
+ <input id="check-3" type="checkbox" value="3"> 3
141
+ <input id="check-4" type="checkbox" value="4"> 4
142
+ <input id="check-5" type="checkbox" value="5"> 5
143
+ <input id="check-6" type="checkbox" value="6"> 6
144
+ <input id="check-7" type="checkbox" value="7"> 7
145
+ <input id="check-8" type="checkbox" value="8"> 8
146
+ <input id="check-9" type="checkbox" value="9"> 9
147
+ <input id="check-10" type="checkbox" value="10"> 10
148
+ </div>
149
+ </body>
150
+ </html>
@@ -0,0 +1,517 @@
1
+ require "spec_helper"
2
+ require ::File.expand_path("../../../lib/cornucopia/util/report_builder", File.dirname(__FILE__))
3
+ require ::File.expand_path("../../../lib/cornucopia/capybara/page_diagnostics", File.dirname(__FILE__))
4
+ require ::File.expand_path("../../../lib/cornucopia/capybara/finder_diagnostics", File.dirname(__FILE__))
5
+
6
+ describe Cornucopia::Capybara::FinderDiagnostics, type: :feature do
7
+ # Make sure that all tests start clean and get cleaned up afterwards...
8
+ around(:example) do |example|
9
+ expect(File.directory?(Rails.root.join("cornucopia_report/"))).to be_falsey
10
+
11
+ begin
12
+ @file_name_1 = generate_report_file("report_1")
13
+
14
+ example.run
15
+ ensure
16
+ if (Cornucopia::Util::ReportBuilder.class_variable_get("@@current_report"))
17
+ Cornucopia::Util::ReportBuilder.current_report.close
18
+ end
19
+
20
+ ::Capybara.current_session.driver.window_handles.each do |handle|
21
+ if handle != ::Capybara.current_session.driver.current_window_handle
22
+ ::Capybara.current_session.driver.close_window(handle)
23
+ end
24
+ end
25
+
26
+ FileUtils.rm_rf Rails.root.join("cornucopia_report/")
27
+ FileUtils.rm_rf Rails.root.join("sample_report/")
28
+ end
29
+ end
30
+
31
+ before(:context) do
32
+ @file_name_1 = generate_report_file("report_1")
33
+ ::Capybara.app = Rack::File.new File.absolute_path(File.join(File.dirname(@file_name_1), "../.."))
34
+ end
35
+
36
+ it "does nothing if found" do
37
+ index_page = CornucopiaReportApp.index_page
38
+
39
+ index_page.load base_folder: "sample_report"
40
+
41
+ tester = Cornucopia::Capybara::FinderDiagnostics::FindAction.new(index_page, {}, {}, :find, "#base-contents")
42
+ expect(tester).not_to receive(:perform_analysis)
43
+
44
+ tester.run
45
+ end
46
+
47
+ it "runs a report if not found" do
48
+ index_page = CornucopiaReportApp.index_page
49
+
50
+ index_page.load base_folder: "sample_report"
51
+
52
+ index_page.contents do |contents_frame|
53
+ tester = Cornucopia::Capybara::FinderDiagnostics::FindAction.new(contents_frame, {}, {}, :find, "#base-contentss")
54
+ expect(tester).to receive(:perform_analysis).and_call_original
55
+
56
+ expect { tester.run }.to raise_error(Capybara::ElementNotFound)
57
+ end
58
+
59
+ Cornucopia::Util::ReportBuilder.current_report.close
60
+
61
+ report_page = CornucopiaReportApp.cornucopia_report_page
62
+ report_page.load(report_name: "cornucopia_report", base_folder: "cornucopia_report")
63
+ report_page.contents do |contents_frame|
64
+ expect(contents_frame.errors.length).to be == 1
65
+ expect(contents_frame.errors[0].name.text).to be == "An error occurred while processing \"find\":"
66
+ expect(contents_frame.errors[0].tables[0].rows.length).to be == 7
67
+ expect(contents_frame.errors[0].tables[0].rows[0].labels[0].text).to be == "function_name"
68
+ expect(contents_frame.errors[0].tables[0].rows[0].values[0].text).to be == ":find"
69
+ expect(contents_frame.errors[0].tables[0].rows[1].labels[0].text).to be == "args[0]"
70
+ expect(contents_frame.errors[0].tables[0].rows[1].values[0].text).to be == "#base-contentss"
71
+ expect(contents_frame.errors[0].tables[0].rows[2].labels[0].text).to be == "search_args"
72
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables.length).to be == 1
73
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows.length).to be == 2
74
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[0].labels[0].text).to be == "0"
75
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[0].values[0].text).to be == ":css"
76
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[1].labels[0].text).to be == "1"
77
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[1].values[0].text).to be == "#base-contentss"
78
+ expect(contents_frame.errors[0].tables[0].rows[5].labels[0].text).to be == "exception"
79
+ expect(contents_frame.errors[0].tables[0].rows[5].values[0].text).to be == "Unable to find css \"#base-contentss\""
80
+ expect(contents_frame.errors[0].tables[0].rows[6].labels[0].text).to be == "backtrace"
81
+ expect(contents_frame.errors[0].tables[0].rows[6].expands[0]).to be
82
+ expect(contents_frame.errors[0].tables[0].rows[6].mores[0]).to be
83
+ expect(contents_frame.errors[0].tables[0].rows[6].values[0].text.length).to be > 0
84
+
85
+ contents_frame.errors[0].more_details.show_hide.click
86
+ expect(contents_frame.errors[0].more_details.details.rows.length).to be == 10
87
+ expect(contents_frame.errors[0].more_details.details.rows[0].labels[0].text).to be == "name"
88
+ expect(contents_frame.errors[0].more_details.details.rows[0].values[0].text).to be == "Capybara::ElementNotFound"
89
+ expect(contents_frame.errors[0].more_details.details.rows[1].labels[0].text).to be == "support_options"
90
+ expect(contents_frame.errors[0].more_details.details.rows[1].values[0].text).to be == "{:__cornucopia_no_analysis=>true, :__cornucopia_retry_with_found=>nil}"
91
+ expect(contents_frame.errors[0].more_details.details.rows[2].labels[0].text).to be == "page_url"
92
+ expect(contents_frame.errors[0].more_details.details.rows[2].values[0].text).to match /report_contents\.html/
93
+ expect(contents_frame.errors[0].more_details.details.rows[3].labels[0].text).to be == "title"
94
+ expect(contents_frame.errors[0].more_details.details.rows[3].values[0].text).to be == "Diagnostics report list"
95
+ expect(contents_frame.errors[0].more_details.details.rows[4].labels[0].text).to be == "screen_shot"
96
+ expect(contents_frame.errors[0].more_details.details.rows[4].value_images[0][:src]).to match /\/screen_shot\.png/
97
+ expect(contents_frame.errors[0].more_details.details.rows[5].labels[0].text).to be == "html_file"
98
+ expect(contents_frame.errors[0].more_details.details.rows[5].value_links[0][:href]).
99
+ to match /html_save_file\/__cornucopia_save_page\.html/
100
+ expect(contents_frame.errors[0].more_details.details.rows[6].labels[0].text).to be == "html_frame"
101
+ expect(contents_frame.errors[0].more_details.details.rows[6].value_frames[0][:src]).
102
+ to match /page_dump\.html/
103
+ expect(contents_frame.errors[0].more_details.details.rows[7].labels[0].text).to be == "html_source"
104
+ expect(contents_frame.errors[0].more_details.details.rows[7].value_textareas[0].text).to be
105
+ expect(contents_frame.errors[0].more_details.details.rows[8].labels[0].text).to be == "page_height"
106
+ expect(contents_frame.errors[0].more_details.details.rows[8].values[0].text).to be
107
+ expect(contents_frame.errors[0].more_details.details.rows[9].labels[0].text).to be == "page_width"
108
+ expect(contents_frame.errors[0].more_details.details.rows[9].values[0].text).to be
109
+ end
110
+ end
111
+
112
+ it "runs a report if too many found" do
113
+ @file_name_1 = generate_report_file("report_1")
114
+
115
+ index_page = CornucopiaReportApp.index_page
116
+
117
+ index_page.load base_folder: "sample_report"
118
+
119
+ index_page.contents do |contents_frame|
120
+ tester = Cornucopia::Capybara::FinderDiagnostics::FindAction.new(contents_frame, {}, {}, :find, "a")
121
+ expect(tester).to receive(:perform_analysis).and_call_original
122
+
123
+ expect { tester.run }.to raise_error(Capybara::Ambiguous)
124
+ end
125
+
126
+ report_page = CornucopiaReportApp.cornucopia_report_page
127
+ report_page.load(report_name: "cornucopia_report", base_folder: "cornucopia_report")
128
+ report_page.contents do |contents_frame|
129
+ expect(contents_frame.errors.length).to be == 1
130
+ expect(contents_frame.errors[0].name.text).to be == "An error occurred while processing \"find\":"
131
+ expect(contents_frame.errors[0].tables[0].rows.length).to be == 7
132
+ expect(contents_frame.errors[0].tables[0].rows[0].labels[0].text).to be == "function_name"
133
+ expect(contents_frame.errors[0].tables[0].rows[0].values[0].text).to be == ":find"
134
+ expect(contents_frame.errors[0].tables[0].rows[1].labels[0].text).to be == "args[0]"
135
+ expect(contents_frame.errors[0].tables[0].rows[1].values[0].text).to be == "a"
136
+ expect(contents_frame.errors[0].tables[0].rows[2].labels[0].text).to be == "search_args"
137
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables.length).to be == 1
138
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows.length).to be == 2
139
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[0].labels[0].text).to be == "0"
140
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[0].values[0].text).to be == ":css"
141
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[1].labels[0].text).to be == "1"
142
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[1].values[0].text).to be == "a"
143
+ expect(contents_frame.errors[0].tables[0].rows[5].labels[0].text).to be == "exception"
144
+ expect(contents_frame.errors[0].tables[0].rows[5].values[0].text).to match /Ambiguous match, found .+ elements matching css "a"/
145
+ expect(contents_frame.errors[0].tables[0].rows[6].labels[0].text).to be == "backtrace"
146
+ expect(contents_frame.errors[0].tables[0].rows[6].expands[0]).to be
147
+ expect(contents_frame.errors[0].tables[0].rows[6].mores[0]).to be
148
+ expect(contents_frame.errors[0].tables[0].rows[6].values[0].text.length).to be > 0
149
+
150
+ contents_frame.errors[0].more_details.show_hide.click
151
+ num_rows = contents_frame.errors[0].more_details.details.rows[1].sub_tables[0].rows.length
152
+ expect(contents_frame.errors[0].more_details.details.rows.length).to be == 12 + num_rows
153
+ expect(contents_frame.errors[0].more_details.details.rows[0].labels[0].text).to be == "name"
154
+ expect(contents_frame.errors[0].more_details.details.rows[0].values[0].text).to be == "Capybara::Ambiguous"
155
+ expect(contents_frame.errors[0].more_details.details.rows[1].labels[0].text).to be == "all_elements"
156
+ expect(contents_frame.errors[0].more_details.details.rows[1].sub_tables.length).to be > 1
157
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 2].labels[0].text).to be == "guessed_types"
158
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 2].values[0].text).to be
159
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 3].labels[0].text).to be == "support_options"
160
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 3].values[0].text).to be == "{:__cornucopia_no_analysis=>true, :__cornucopia_retry_with_found=>nil}"
161
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 4].labels[0].text).to be == "page_url"
162
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 4].values[0].text).to match /report_contents\.html/
163
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 5].labels[0].text).to be == "title"
164
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 5].values[0].text).to be == "Diagnostics report list"
165
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 6].labels[0].text).to be == "screen_shot"
166
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 6].value_images[0][:src]).to match /\/screen_shot\.png/
167
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 7].labels[0].text).to be == "html_file"
168
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 7].value_links[0][:href]).
169
+ to match /html_save_file\/__cornucopia_save_page\.html/
170
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 8].labels[0].text).to be == "html_frame"
171
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 8].value_frames[0][:src]).
172
+ to match /page_dump\.html/
173
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 9].labels[0].text).to be == "html_source"
174
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 9].value_textareas[0].text).to be
175
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 10].labels[0].text).to be == "page_height"
176
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 10].values[0].text).to be
177
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 11].labels[0].text).to be == "page_width"
178
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 11].values[0].text).to be
179
+ end
180
+ end
181
+
182
+ it "runs the finder when test_finder is called" do
183
+ index_page = CornucopiaReportApp.index_page
184
+
185
+ index_page.load base_folder: "sample_report"
186
+
187
+ index_page.contents do |contents_frame|
188
+ diag = Cornucopia::Capybara::FinderDiagnostics::FindAction.new(contents_frame, {}, {}, :all, "a")
189
+ expect(Cornucopia::Capybara::FinderDiagnostics::FindAction).
190
+ to receive(:new).
191
+ with(contents_frame, {}, {}, :all, "a").
192
+ and_return(diag)
193
+ expect(diag).to receive(:run).and_call_original
194
+
195
+ find_all = contents_frame.all("a")
196
+ test_all = Cornucopia::Capybara::FinderDiagnostics.test_finder(contents_frame, :all, "a")
197
+
198
+ expect(find_all.length).to be == test_all.length
199
+ end
200
+ end
201
+
202
+ it "outputs an analysis when diagnose_finder is called" do
203
+ index_page = CornucopiaReportApp.index_page
204
+
205
+ index_page.load base_folder: "sample_report"
206
+
207
+ index_page.contents do |contents_frame|
208
+ diag = Cornucopia::Capybara::FinderDiagnostics::FindAction.
209
+ new(contents_frame, {}, {}, :all, :css, "a", visible: true)
210
+ expect(Cornucopia::Capybara::FinderDiagnostics::FindAction).
211
+ to receive(:new).
212
+ with(contents_frame, {}, {}, :all, :css, "a", visible: true).
213
+ and_return(diag)
214
+ expect(diag).to receive(:run).and_call_original
215
+ expect(diag).to receive(:generate_report).and_call_original
216
+
217
+ find_all = contents_frame.all("a")
218
+ test_all = Cornucopia::Capybara::FinderDiagnostics.
219
+ diagnose_finder(contents_frame, :all, :css, "a", visible: true)
220
+
221
+ expect(find_all.length).to be == test_all.length
222
+ end
223
+
224
+ report_page = CornucopiaReportApp.cornucopia_report_page
225
+ report_page.load(report_name: "cornucopia_report", base_folder: "cornucopia_report")
226
+ report_page.contents do |contents_frame|
227
+ expect(contents_frame.errors.length).to be == 1
228
+ expect(contents_frame.errors[0].name.text).to be == "Diagnostic report on \"all\":"
229
+ expect(contents_frame.errors[0].tables[0].rows.length).to be == 7
230
+ expect(contents_frame.errors[0].tables[0].rows[0].labels[0].text).to be == "function_name"
231
+ expect(contents_frame.errors[0].tables[0].rows[0].values[0].text).to be == ":all"
232
+ expect(contents_frame.errors[0].tables[0].rows[1].labels[0].text).to be == "args[0]"
233
+ expect(contents_frame.errors[0].tables[0].rows[1].values[0].text).to be == ":css"
234
+ expect(contents_frame.errors[0].tables[0].rows[2].labels[0].text).to be == "search_args"
235
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables.length).to be == 1
236
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows.length).to be == 2
237
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[0].labels[0].text).to be == "0"
238
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[0].values[0].text).to be == ":css"
239
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[1].labels[0].text).to be == "1"
240
+ expect(contents_frame.errors[0].tables[0].rows[2].sub_tables[0].rows[1].values[0].text).to be == "a"
241
+ expect(contents_frame.errors[0].tables[0].rows[5].labels[0].text).to be == "options"
242
+ expect(contents_frame.errors[0].tables[0].rows[5].sub_tables.length).to be == 1
243
+ expect(contents_frame.errors[0].tables[0].rows[5].sub_tables[0].rows.length).to be == 1
244
+ expect(contents_frame.errors[0].tables[0].rows[5].sub_tables[0].rows[0].labels[0].text).to be == "visible"
245
+ expect(contents_frame.errors[0].tables[0].rows[5].sub_tables[0].rows[0].values[0].text).to be == "true"
246
+
247
+ contents_frame.errors[0].more_details.show_hide.click
248
+ num_rows = contents_frame.errors[0].more_details.details.rows[0].sub_tables[0].rows.length
249
+ expect(contents_frame.errors[0].more_details.details.rows.length).to be == 13 + num_rows
250
+ expect(contents_frame.errors[0].more_details.details.rows[0].labels[0].text).to be == "all_elements"
251
+ expect(contents_frame.errors[0].more_details.details.rows[0].sub_tables.length).to be > 1
252
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 1].labels[0].text).to be == "args"
253
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 2].labels[0].text).to be == "1"
254
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 2].values[0].text).to be == "a"
255
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 3].labels[0].text).to be == "2"
256
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 3].values[0].text).to be == "{:visible=>true}"
257
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 4].labels[0].text).to be == "guessed_types"
258
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 4].values[0].text).to be
259
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 5].labels[0].text).to be == "page_url"
260
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 5].values[0].text).
261
+ to match /report_contents\.html/
262
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 6].labels[0].text).to be == "title"
263
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 6].values[0].text).
264
+ to be == "Diagnostics report list"
265
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 7].labels[0].text).to be == "screen_shot"
266
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 7].value_images[0][:src]).
267
+ to match /\/screen_shot\.png/
268
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 8].labels[0].text).to be == "html_file"
269
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 8].value_links[0][:href]).
270
+ to match /html_save_file\/__cornucopia_save_page\.html/
271
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 9].labels[0].text).to be == "html_frame"
272
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 9].value_frames[0][:src]).
273
+ to match /page_dump\.html/
274
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 10].labels[0].text).to be == "html_source"
275
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 10].value_textareas[0].text).to be
276
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 11].labels[0].text).to be == "page_height"
277
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 11].values[0].text).to be
278
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 12].labels[0].text).to be == "page_width"
279
+ expect(contents_frame.errors[0].more_details.details.rows[num_rows + 12].values[0].text).to be
280
+ end
281
+ end
282
+
283
+ context "with a sample test file" do
284
+ let(:base_folder) { File.absolute_path(File.join(File.dirname(@file_name_1), "../..")) }
285
+
286
+ before(:example) do
287
+ Cornucopia::Util::FileAsset.new("../../../spec/fixtures/sample_page.html").
288
+ create_file(File.join(base_folder, "sample_report/sample_file.html"))
289
+
290
+ ::Capybara.current_session.visit("/sample_report/sample_file.html")
291
+ end
292
+
293
+ it "finds hidden elements during analysis" do
294
+ base_object = ::Capybara.current_session.find(:css, "#hidden-div", visible: false)
295
+ expect { base_object.find("input[type=button]") }.to raise_error(Capybara::ElementNotFound)
296
+
297
+ report_page = CornucopiaReportApp.cornucopia_report_page
298
+ report_page.load(report_name: "cornucopia_report", base_folder: "cornucopia_report")
299
+ report_page.contents do |contents_frame|
300
+ expect(contents_frame.errors.length).to be == 1
301
+ contents_frame.errors[0].more_details.show_hide.click
302
+ expect(contents_frame.errors[0].more_details.details.row(2).labels[0].text).to be == "all_other_elements"
303
+
304
+ hidden_row_specs = contents_frame.errors[0].more_details.details.row(1).sub_tables[0].rows[0].sub_tables[0].rows
305
+ expect(hidden_row_specs[0].labels[0].text).to be == "elem_checked"
306
+ expect(hidden_row_specs[1].labels[0].text).to be == "elem_id"
307
+ expect(hidden_row_specs[1].values[0].text).to be == "hidden-cool-button"
308
+ expect(hidden_row_specs[2].labels[0].text).to be == "elem_location"
309
+ expect(hidden_row_specs[3].labels[0].text).to be == "x"
310
+ expect(hidden_row_specs[4].labels[0].text).to be == "y"
311
+ expect(hidden_row_specs[5].labels[0].text).to be == "elem_outerHTML"
312
+ expect(hidden_row_specs[6].labels[0].text).to be == "elem_selected"
313
+ expect(hidden_row_specs[7].labels[0].text).to be == "elem_tag_name"
314
+ expect(hidden_row_specs[8].labels[0].text).to be == "elem_value"
315
+ expect(hidden_row_specs[9].labels[0].text).to be == "elem_visible"
316
+ expect(hidden_row_specs[9].values[0].text).to be == "false"
317
+ expect(hidden_row_specs[10].labels[0].text).to be == "native_class"
318
+ expect(hidden_row_specs[11].labels[0].text).to be == "native_onclick"
319
+ expect(hidden_row_specs[12].labels[0].text).to be == "native_size"
320
+ expect(hidden_row_specs[13].labels[0].text).to be == "width"
321
+ expect(hidden_row_specs[14].labels[0].text).to be == "height"
322
+ expect(hidden_row_specs[15].labels[0].text).to be == "native_type"
323
+ expect(hidden_row_specs[15].values[0].text).to be == "button"
324
+ end
325
+ end
326
+
327
+ it "finds selection options using the from option" do
328
+ report = Cornucopia::Util::ReportBuilder.current_report
329
+
330
+ report.within_section("an existing section") do |section|
331
+ section.within_table do |table|
332
+ table.write_stats "something", "a value"
333
+ find_action = Cornucopia::Capybara::FinderDiagnostics::FindAction.
334
+ new ::Capybara.current_session,
335
+ { report: report,
336
+ table: table },
337
+ {},
338
+ :find,
339
+ "100",
340
+ from: "select-box"
341
+
342
+ allow(find_action).to receive(:guessed_types).and_return([])
343
+
344
+ find_action.generate_report("inside diagnostics") do |report, report_table|
345
+ report_table.write_stats("inside", "value")
346
+ end
347
+ end
348
+ end
349
+
350
+ report.close
351
+
352
+ report_page = CornucopiaReportApp.cornucopia_report_page
353
+ report_page.load(report_name: "cornucopia_report", base_folder: "cornucopia_report")
354
+ report_page.contents do |contents_frame|
355
+ expect(contents_frame.errors.length).to be == 1
356
+
357
+ the_row = contents_frame.errors[0].tables[0].row(0)
358
+ expect(the_row.labels[0].text).to be == "something"
359
+ expect(the_row.values[0].text).to be == "a value"
360
+
361
+ the_row = contents_frame.errors[0].tables[0].row(2)
362
+ expect(the_row.labels[0].text).to be == "function_name"
363
+ expect(the_row.values[0].text).to be == ":find"
364
+
365
+ the_row = contents_frame.errors[0].tables[0].rows.last
366
+ expect(the_row.labels[0].text).to be == "inside"
367
+ expect(the_row.values[0].text).to be == "value"
368
+ end
369
+ end
370
+
371
+ it "deals with it if the from isn't found" do
372
+ find_action = Cornucopia::Capybara::FinderDiagnostics::FindAction.
373
+ new ::Capybara.current_session,
374
+ {},
375
+ {},
376
+ :select,
377
+ "100",
378
+ from: "select-boxes"
379
+
380
+ find_action.generate_report("inside diagnostics")
381
+
382
+ report_page = CornucopiaReportApp.cornucopia_report_page
383
+ report_page.load(report_name: "cornucopia_report", base_folder: "cornucopia_report")
384
+ report_page.contents do |contents_frame|
385
+ expect(contents_frame.errors.length).to be == 1
386
+
387
+ the_row = contents_frame.errors[0].tables[4].row(0)
388
+ expect(the_row.labels[0].text).to be == "function_name"
389
+ expect(the_row.values[0].text).to be == ":select"
390
+ end
391
+ end
392
+
393
+ it "will retry with what it actually finds..." do
394
+ begin
395
+ Cornucopia::Util::Configuration.retry_with_found = true
396
+
397
+ base_object = ::Capybara.current_session.find(:css, "#hidden-div", visible: false)
398
+ button = base_object.all("input[type=button]", count: 1)
399
+
400
+ expect(button.length).to be == 1
401
+ expect(button[0].class).to be == ::Capybara::Node::Element
402
+
403
+ report_page = CornucopiaReportApp.cornucopia_report_page
404
+ report_page.load(report_name: "cornucopia_report", base_folder: "cornucopia_report")
405
+ report_page.contents do |contents_frame|
406
+ contents_frame.errors[0].more_details.show_hide.click
407
+ expect(contents_frame.errors.length).to be == 1
408
+ expect(contents_frame.errors[0].tables[0].rows.last.labels[0].text).not_to be == "Retrying action:"
409
+ expect(contents_frame.errors[0].more_details.details.rows.last.labels[0].text).to be == "Retrying action:"
410
+ expect(contents_frame.errors[0].more_details.details.rows.last.values[0].text).to be == "Success"
411
+ end
412
+ ensure
413
+ Cornucopia::Util::Configuration.retry_with_found = false
414
+ end
415
+ end
416
+
417
+ describe "#retry_action_with_found_element" do
418
+ it "find and it will appropriately handle the driver not supporting evaluate_script" do
419
+ begin
420
+ Cornucopia::Util::Configuration.retry_with_found = true
421
+
422
+ base_object = ::Capybara.current_session.find(:css, "#hidden-div", visible: false)
423
+ button = base_object.find("input[type=button]")
424
+
425
+ expect(button.class).to be == ::Capybara::Node::Element
426
+
427
+ report_page = CornucopiaReportApp.cornucopia_report_page
428
+ report_page.load(report_name: "cornucopia_report", base_folder: "cornucopia_report")
429
+ report_page.contents do |contents_frame|
430
+ contents_frame.errors[0].more_details.show_hide.click
431
+ expect(contents_frame.errors.length).to be == 1
432
+ expect(contents_frame.errors[0].tables[0].rows.last.labels[0].text).not_to be == "Retrying action:"
433
+ expect(contents_frame.errors[0].more_details.details.rows.last.labels[0].text).to be == "Retrying action:"
434
+ expect(contents_frame.errors[0].more_details.details.rows.last.values[0].text).to be == "Success"
435
+ end
436
+ ensure
437
+ Cornucopia::Util::Configuration.retry_with_found = false
438
+ end
439
+ end
440
+
441
+ it "first" do
442
+ begin
443
+ Cornucopia::Util::Configuration.retry_with_found = true
444
+
445
+ allow_any_instance_of(::Capybara::Node::Element).to receive(:outerHTML).and_return(nil)
446
+
447
+ expect(::Capybara.current_session).
448
+ to receive(:evaluate_script).at_least(1).times.and_raise(::Capybara::NotSupportedByDriverError)
449
+ expect_any_instance_of(::Selenium::WebDriver::Driver).
450
+ to receive(:execute_script).at_least(1).times.and_raise(::Capybara::NotSupportedByDriverError)
451
+
452
+ base_object = ::Capybara.current_session.find(:css, "#hidden-div", visible: false)
453
+ button = base_object.first("Still cool!", count: 1)
454
+
455
+ expect(button.class).to be == ::Capybara::Node::Element
456
+
457
+ report_page = CornucopiaReportApp.cornucopia_report_page
458
+ report_page.load(report_name: "cornucopia_report", base_folder: "cornucopia_report")
459
+ report_page.contents do |contents_frame|
460
+ contents_frame.errors[0].more_details.show_hide.click
461
+ expect(contents_frame.errors.length).to be == 1
462
+ expect(contents_frame.errors[0].tables[0].rows.last.labels[0].text).not_to be == "Retrying action:"
463
+ expect(contents_frame.errors[0].more_details.details.rows.last.labels[0].text).to be == "Retrying action:"
464
+ expect(contents_frame.errors[0].more_details.details.rows.last.values[0].text).to be == "Success"
465
+ end
466
+ ensure
467
+ Cornucopia::Util::Configuration.retry_with_found = false
468
+ end
469
+ end
470
+
471
+ it "finds selection options using the from option" do
472
+ report = Cornucopia::Util::ReportBuilder.current_report
473
+
474
+ module Cornucopia
475
+ module Capybara
476
+ class FinderDiagnostics
477
+ def self.test_finder_stupid
478
+ found_1 = FindAction::FoundElement.new(::Capybara.page.find("#select-box"))
479
+ found_2 = FindAction::FoundElement.new(::Capybara.page.find("#select-box"))
480
+
481
+ found_1 == found_2
482
+ end
483
+
484
+ def self.test_not_finder_stupid
485
+ found_1 = FindAction::FoundElement.new(::Capybara.page.find("#select-box"))
486
+ found_2 = FindAction::FoundElement.new(::Capybara.page.find("#multi-select-box"))
487
+
488
+ found_1 == found_2
489
+ end
490
+ end
491
+ end
492
+ end
493
+
494
+ expect(Cornucopia::Capybara::FinderDiagnostics.test_finder_stupid).to be_truthy
495
+ expect(Cornucopia::Capybara::FinderDiagnostics.test_not_finder_stupid).to be_falsey
496
+ end
497
+ end
498
+ end
499
+
500
+ describe "FindAction" do
501
+ it "returns perform_analysis's result" do
502
+ index_page = CornucopiaReportApp.index_page
503
+
504
+ index_page.load base_folder: "sample_report"
505
+
506
+ index_page.contents do |contents_frame|
507
+ tester = Cornucopia::Capybara::FinderDiagnostics::FindAction.new(contents_frame, {}, {}, :find, "#base-contentss")
508
+ test_value = [nil, true, false, Faker::Lorem.sentence].sample
509
+
510
+ expect(tester).to receive(:perform_analysis).and_return true
511
+ tester.instance_variable_set(:@return_value, test_value)
512
+
513
+ expect(tester.run).to eq test_value
514
+ end
515
+ end
516
+ end
517
+ end