watir 6.19.1 → 7.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/.github/actions/install-chrome/action.yml +1 -0
  3. data/.github/actions/setup-linux/action.yml +8 -0
  4. data/.github/workflows/tests.yml +100 -0
  5. data/CHANGES.md +7 -0
  6. data/README.md +1 -4
  7. data/Rakefile +1 -1
  8. data/lib/watir.rb +1 -45
  9. data/lib/watir/alert.rb +3 -8
  10. data/lib/watir/capabilities.rb +54 -230
  11. data/lib/watir/cell_container.rb +4 -4
  12. data/lib/watir/container.rb +4 -26
  13. data/lib/watir/elements/checkbox.rb +4 -4
  14. data/lib/watir/elements/date_field.rb +4 -4
  15. data/lib/watir/elements/date_time_field.rb +4 -4
  16. data/lib/watir/elements/element.rb +12 -49
  17. data/lib/watir/elements/file_field.rb +4 -4
  18. data/lib/watir/elements/font.rb +4 -4
  19. data/lib/watir/elements/hidden.rb +4 -4
  20. data/lib/watir/elements/html_elements.rb +444 -445
  21. data/lib/watir/elements/iframe.rb +4 -4
  22. data/lib/watir/elements/radio.rb +4 -4
  23. data/lib/watir/elements/select.rb +12 -78
  24. data/lib/watir/elements/svg_elements.rb +96 -96
  25. data/lib/watir/elements/text_field.rb +4 -4
  26. data/lib/watir/generator/base/generator.rb +4 -4
  27. data/lib/watir/generator/base/visitor.rb +0 -29
  28. data/lib/watir/generator/html/generator.rb +2 -1
  29. data/lib/watir/has_window.rb +4 -4
  30. data/lib/watir/http_client.rb +0 -8
  31. data/lib/watir/locators.rb +1 -5
  32. data/lib/watir/locators/button/matcher.rb +0 -23
  33. data/lib/watir/locators/button/selector_builder/xpath.rb +4 -15
  34. data/lib/watir/locators/element/matcher.rb +4 -19
  35. data/lib/watir/locators/element/selector_builder.rb +2 -37
  36. data/lib/watir/locators/element/selector_builder/xpath.rb +26 -41
  37. data/lib/watir/radio_set.rb +2 -2
  38. data/lib/watir/row_container.rb +4 -4
  39. data/lib/watir/version.rb +1 -1
  40. data/lib/watir/wait.rb +4 -74
  41. data/lib/watir/window.rb +6 -22
  42. data/lib/watir/window_collection.rb +5 -49
  43. data/lib/watirspec/implementation.rb +4 -0
  44. data/spec/spec_helper.rb +2 -7
  45. data/spec/unit/capabilities_spec.rb +196 -929
  46. data/spec/unit/match_elements/button_spec.rb +0 -13
  47. data/spec/unit/match_elements/element_spec.rb +38 -47
  48. data/spec/unit/match_elements/text_field_spec.rb +6 -6
  49. data/spec/unit/selector_builder/element_spec.rb +6 -23
  50. data/spec/unit/selector_builder/text_field_spec.rb +6 -7
  51. data/spec/watirspec/alert_spec.rb +4 -21
  52. data/spec/watirspec/browser_spec.rb +2 -2
  53. data/spec/watirspec/cookies_spec.rb +1 -1
  54. data/spec/watirspec/elements/button_spec.rb +0 -10
  55. data/spec/watirspec/elements/checkbox_spec.rb +10 -22
  56. data/spec/watirspec/elements/div_spec.rb +4 -34
  57. data/spec/watirspec/elements/divs_spec.rb +2 -2
  58. data/spec/watirspec/elements/element_spec.rb +38 -84
  59. data/spec/watirspec/elements/form_spec.rb +2 -4
  60. data/spec/watirspec/elements/links_spec.rb +4 -4
  61. data/spec/watirspec/elements/select_list_spec.rb +7 -108
  62. data/spec/watirspec/elements/span_spec.rb +2 -2
  63. data/spec/watirspec/elements/spans_spec.rb +1 -1
  64. data/spec/watirspec/elements/strong_spec.rb +1 -1
  65. data/spec/watirspec/html/non_control_elements.html +8 -3
  66. data/spec/watirspec/support/rspec_matchers.rb +1 -32
  67. data/spec/watirspec/window_switching_spec.rb +2 -49
  68. data/spec/watirspec_helper.rb +6 -1
  69. data/watir.gemspec +3 -4
  70. metadata +11 -32
  71. data/.github/workflows/linux.yml +0 -61
  72. data/.github/workflows/mac.yml +0 -55
  73. data/.github/workflows/unit.yml +0 -37
  74. data/.github/workflows/windows.yml +0 -39
  75. data/lib/watir/legacy_wait.rb +0 -123
  76. data/spec/unit/container_spec.rb +0 -35
  77. data/spec/watirspec/legacy_wait_spec.rb +0 -216
@@ -19,6 +19,9 @@ describe 'Div' do
19
19
  expect(browser.div(xpath: "//div[@id='header']")).to exist
20
20
  expect(browser.div(custom_attribute: 'custom')).to exist
21
21
  expect(browser.div(custom_attribute: /custom/)).to exist
22
+ expect(browser.div(text: /some visible/)).to exist
23
+ expect(browser.div(text: /some (visible|Jeff)/)).to exist
24
+ expect(browser.div(text: /none visible/)).to exist
22
25
  end
23
26
 
24
27
  it 'returns the first div if given no args' do
@@ -34,6 +37,7 @@ describe 'Div' do
34
37
  expect(browser.div(text: /no_such_text/)).to_not exist
35
38
  expect(browser.div(class: 'no_such_class')).to_not exist
36
39
  expect(browser.div(class: /no_such_class/)).to_not exist
40
+ expect(browser.div(text: /some visible some hidden/)).to exist
37
41
  expect(browser.div(index: 1337)).to_not exist
38
42
  expect(browser.div(xpath: "//div[@id='no_such_id']")).to_not exist
39
43
  end
@@ -126,40 +130,6 @@ describe 'Div' do
126
130
  end
127
131
  end
128
132
 
129
- describe 'Deprecation Warnings' do
130
- describe 'text locator with RegExp values' do
131
- it 'does not throw deprecation when still matched by text content' do
132
- expect { browser.div(text: /some visible/).locate }.not_to have_deprecated_text_regexp
133
- end
134
-
135
- it 'does not throw deprecation with complex regexp matched by text content' do
136
- expect { browser.div(text: /some (in|)visible/).locate }.not_to have_deprecated_text_regexp
137
- end
138
-
139
- not_compliant_on :watigiri do
140
- bug 'Safari is not filtering out hidden text', :safari do
141
- it 'throws deprecation when no longer matched by text content' do
142
- expect { browser.div(text: /some visible$/).locate }.to have_deprecated_text_regexp
143
- end
144
- end
145
- end
146
-
147
- not_compliant_on :watigiri do
148
- it 'does not throw deprecation when element does not exist' do
149
- expect { browser.div(text: /definitely not there/).locate }.not_to have_deprecated_text_regexp
150
- end
151
- end
152
-
153
- not_compliant_on :watigiri do
154
- bug 'Safari is not filtering out hidden text', :safari do
155
- it 'does not locate entire content with regular expressions' do
156
- expect(browser.div(text: /some visible some hidden/)).to_not exist
157
- end
158
- end
159
- end
160
- end
161
- end
162
-
163
133
  # Manipulation methods
164
134
  describe '#click' do
165
135
  it 'fires events when clicked' do
@@ -13,7 +13,7 @@ describe 'Divs' do
13
13
 
14
14
  describe '#length' do
15
15
  it 'returns the number of divs' do
16
- expect(browser.divs.length).to eq 16
16
+ expect(browser.divs.length).to eq 20
17
17
  end
18
18
  end
19
19
 
@@ -29,7 +29,7 @@ describe 'Divs' do
29
29
  end
30
30
 
31
31
  it 'returns an array of divs with a given range including negative values' do
32
- divs = browser.divs[11..-3]
32
+ divs = browser.divs[11..-7]
33
33
  ids = divs.map(&:id)
34
34
  expect(ids).to eq %w[messages ins_tag_test del_tag_test]
35
35
  end
@@ -20,12 +20,6 @@ describe 'Element' do
20
20
  expect { Watir::Element.new(container, 1, 2, 3, 4) }.to raise_error(ArgumentError)
21
21
  expect { Watir::Element.new(container, 'foo') }.to raise_error(ArgumentError)
22
22
  end
23
-
24
- it 'throws deprecation warning when combining element locator with other locators' do
25
- element = double Selenium::WebDriver::Element
26
- allow(element).to receive(:enabled?).and_return(true)
27
- expect { browser.text_field(class_name: 'name', index: 1, element: element) }.to have_deprecated_element_cache
28
- end
29
23
  end
30
24
 
31
25
  describe '#element_call' do
@@ -40,13 +34,11 @@ describe 'Element' do
40
34
  expect { element.text }.to_not raise_error
41
35
  end
42
36
 
43
- compliant_on :relaxed_locate do
44
- it 'relocates stale element when taking an action on it' do
45
- browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
46
- element = browser.text_field(id: 'new_user_first_name').locate
47
- browser.refresh
48
- expect { element.click }.not_to raise_exception
49
- end
37
+ it 'relocates stale element when taking an action on it' do
38
+ browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
39
+ element = browser.text_field(id: 'new_user_first_name').locate
40
+ browser.refresh
41
+ expect { element.click }.not_to raise_exception
50
42
  end
51
43
  end
52
44
 
@@ -229,56 +221,6 @@ describe 'Element' do
229
221
  end
230
222
  end
231
223
 
232
- describe '#visible?' do
233
- it 'returns true if the element is visible' do
234
- msg = /WARN Watir \["visible_element"\]/
235
- expect {
236
- expect(browser.text_field(id: 'new_user_email')).to be_visible
237
- }.to output(msg).to_stdout_from_any_process
238
- end
239
-
240
- it 'raises UnknownObjectException exception if the element does not exist' do
241
- msg = /WARN Watir \["visible_element"\]/
242
- expect {
243
- expect { browser.text_field(id: 'no_such_id').visible? }.to raise_unknown_object_exception
244
- }.to output(msg).to_stdout_from_any_process
245
- end
246
-
247
- it 'handles staleness' do
248
- element = browser.text_field(id: 'new_user_email').locate
249
-
250
- allow(element).to receive(:stale?).and_return(true)
251
-
252
- expect(element).to be_visible
253
- end
254
-
255
- it "returns true if the element has style='visibility: visible' even if parent has style='visibility: hidden'" do
256
- msg = /WARN Watir \["visible_element"\]/
257
- expect {
258
- expect(browser.div(id: 'visible_child')).to be_visible
259
- }.to output(msg).to_stdout_from_any_process
260
- end
261
-
262
- it "returns false if the element is input element where type eq 'hidden'" do
263
- expect(browser.hidden(id: 'new_user_interests_dolls')).to_not be_visible
264
- end
265
-
266
- it "returns false if the element has style='display: none;'" do
267
- msg = /WARN Watir \["visible_element"\]/
268
- expect {
269
- expect(browser.div(id: 'changed_language')).to_not be_visible
270
- }.to output(msg).to_stdout_from_any_process
271
- end
272
-
273
- it "returns false if the element has style='visibility: hidden;" do
274
- expect { expect(browser.div(id: 'wants_newsletter')).to_not be_visible }
275
- end
276
-
277
- it 'returns false if one of the parent elements is hidden' do
278
- expect { expect(browser.div(id: 'hidden_parent')).to_not be_visible }
279
- end
280
- end
281
-
282
224
  describe '#cache=' do
283
225
  it 'bypasses selector location' do
284
226
  browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
@@ -307,14 +249,36 @@ describe 'Element' do
307
249
  browser.goto WatirSpec.url_for('removed_element.html')
308
250
  end
309
251
 
310
- it 'handles staleness in a collection' do
252
+ it 'element from a collection is re-looked up after it becomes stale' do
311
253
  element = browser.divs(id: 'text').first.locate
312
254
 
313
- allow(element).to receive(:stale?).and_return(true)
255
+ browser.refresh
314
256
 
257
+ expect(element).to be_stale
315
258
  expect(element).to exist
316
259
  end
317
260
 
261
+ it 'element from a selenium element throws an exception when relocated' do
262
+ div = browser.div.locate
263
+ element = browser.element(element: div.wd)
264
+
265
+ browser.refresh
266
+ expect(element).to be_stale
267
+
268
+ msg = 'Can not relocate a Watir element initialized by a Selenium element'
269
+ expect { element.exists? }.to raise_exception(Watir::Exception::LocatorException, msg)
270
+ end
271
+
272
+ it 'element from a selenium element with other locators throws an exception' do
273
+ div = browser.div.locate
274
+ element = browser.element(element: div.wd, id: 'foo')
275
+
276
+ browser.refresh
277
+
278
+ msg = 'Can not relocate a Watir element initialized by a Selenium element'
279
+ expect { element.exists? }.to raise_exception(Watir::Exception::LocatorException, msg)
280
+ end
281
+
318
282
  it 'returns false when tag name does not match id' do
319
283
  watir_element = browser.span(id: 'text')
320
284
  expect(watir_element).to_not exist
@@ -374,6 +338,15 @@ describe 'Element' do
374
338
  expect(element).to be_stale
375
339
  end
376
340
 
341
+ it 'returns true the second time if the element is stale' do
342
+ element = browser.div.locate
343
+
344
+ browser.refresh
345
+
346
+ expect(element).to be_stale
347
+ expect(element).to be_stale
348
+ end
349
+
377
350
  it 'returns false if the element is not stale' do
378
351
  element = browser.button(name: 'new_user_submit_disabled').locate
379
352
 
@@ -677,25 +650,6 @@ describe 'Element' do
677
650
  end
678
651
  end
679
652
 
680
- describe '#scroll_into_view' do
681
- it 'scrolls element into view' do
682
- initial_size = browser.window.size
683
- browser.window.resize_to(initial_size.width, 800)
684
-
685
- el = browser.button(name: 'new_user_image')
686
- element_center = el.center['y']
687
-
688
- bottom_viewport_script = 'return window.pageYOffset + window.innerHeight'
689
- expect(browser.execute_script(bottom_viewport_script)).to be < element_center
690
-
691
- expect {
692
- expect(el.scroll_into_view).to be_a Selenium::WebDriver::Point
693
- }.to have_deprecated_scroll_into_view
694
-
695
- expect(browser.execute_script(bottom_viewport_script)).to be > element_center
696
- end
697
- end
698
-
699
653
  describe '#location' do
700
654
  it 'returns coordinates for element location' do
701
655
  location = browser.button(name: 'new_user_image').location
@@ -59,10 +59,8 @@ describe 'Form' do
59
59
  expect(messages[0]).to eq 'submit'
60
60
  end
61
61
 
62
- compliant_on :relaxed_locate do
63
- it 'times out when submitting an element that is not displayed' do
64
- expect { browser.form(name: 'no').submit }.to raise_unknown_object_exception
65
- end
62
+ it 'times out when submitting an element that is not displayed' do
63
+ expect { browser.form(name: 'no').submit }.to raise_unknown_object_exception
66
64
  end
67
65
  end
68
66
  end
@@ -43,7 +43,7 @@ describe 'Links' do
43
43
  describe 'visible text' do
44
44
  it 'finds links by visible text' do
45
45
  browser.goto WatirSpec.url_for('non_control_elements.html')
46
- container = browser.div(id: 'visible_text')
46
+ container = browser.div(id: 'visible_link')
47
47
  expect(container.links(visible_text: 'all visible').count).to eq(1)
48
48
  expect(container.links(visible_text: /all visible/).count).to eq(1)
49
49
  expect(container.links(visible_text: /some visible/).count).to eq(1)
@@ -54,9 +54,9 @@ describe 'Links' do
54
54
  browser.goto WatirSpec.url_for('non_control_elements.html')
55
55
  container = browser.div(id: 'visible_text')
56
56
 
57
- expect(container.links(visible_text: 'some visible').count).to eq(1)
58
- expect(container.links(visible_text: 'none visible').count).to eq(0)
59
- expect(container.links(visible_text: /none visible/).count).to eq(0)
57
+ expect(container.divs(visible_text: 'some visible').count).to eq(1)
58
+ expect(container.divs(visible_text: 'none visible').count).to eq(0)
59
+ expect(container.divs(visible_text: /none visible/).count).to eq(0)
60
60
  end
61
61
  end
62
62
  end
@@ -254,10 +254,8 @@ describe 'SelectList' do
254
254
 
255
255
  it 'selects an option with a Regexp' do
256
256
  browser.select_list(name: 'new_user_languages').clear
257
- expect {
258
- browser.select_list(name: 'new_user_languages').select(/1|3/)
259
- }.to have_deprecated_select_by
260
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq %w[Danish NO]
257
+ browser.select_list(name: 'new_user_languages').select(/2|3/)
258
+ expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq %w[EN]
261
259
  end
262
260
  end
263
261
 
@@ -329,13 +327,11 @@ describe 'SelectList' do
329
327
  browser.select_list(id: 'single-quote').select("'foo'")
330
328
  end
331
329
 
332
- compliant_on :relaxed_locate do
333
- it 'waits to select an option' do
334
- browser.goto WatirSpec.url_for('wait.html')
335
- browser.a(id: 'add_select').click
336
- select_list = browser.select_list(id: 'languages')
337
- expect { select_list.select('No') }.to wait_and_raise_no_value_found_exception
338
- end
330
+ it 'waits to select an option' do
331
+ browser.goto WatirSpec.url_for('wait.html')
332
+ browser.a(id: 'add_select').click
333
+ select_list = browser.select_list(id: 'languages')
334
+ expect { select_list.select('No') }.to wait_and_raise_no_value_found_exception
339
335
  end
340
336
 
341
337
  it "raises NoValueFoundException if the option doesn't exist" do
@@ -554,101 +550,4 @@ describe 'SelectList' do
554
550
  end
555
551
  end
556
552
  end
557
-
558
- describe '#select_all' do
559
- it 'selects multiple options based on text' do
560
- browser.select_list(name: 'new_user_languages').clear
561
- expect {
562
- browser.select_list(name: 'new_user_languages').select_all(/ish/)
563
- }.to have_deprecated_select_all
564
- list = %w[Danish EN Swedish]
565
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq list
566
- end
567
-
568
- it 'selects multiple options based on labels' do
569
- browser.select_list(name: 'new_user_languages').clear
570
- expect {
571
- browser.select_list(name: 'new_user_languages').select_all(/NO|EN/)
572
- }.to have_deprecated_select_all
573
- list = %w[EN NO]
574
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq list
575
- end
576
-
577
- it 'selects all options in an Array' do
578
- browser.select_list(name: 'new_user_languages').clear
579
- expect {
580
- browser.select_list(name: 'new_user_languages').select_all([/ish/, /Latin/])
581
- }.to have_deprecated_select_all
582
- list = ['Danish', 'EN', 'Swedish', 'Azeri - Latin', 'Latin']
583
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq list
584
- end
585
-
586
- it 'selects all options in a parameter list' do
587
- browser.select_list(name: 'new_user_languages').clear
588
- expect {
589
- browser.select_list(name: 'new_user_languages').select_all(/ish/, /Latin/)
590
- }.to have_deprecated_select_all
591
- list = ['Danish', 'EN', 'Swedish', 'Azeri - Latin', 'Latin']
592
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq list
593
- end
594
-
595
- it 'returns the first matching value if there are multiple matches' do
596
- expect {
597
- expect(browser.select_list(name: 'new_user_languages').select_all(/ish/)).to eq 'Danish'
598
- }.to have_deprecated_select_all
599
- end
600
- end
601
-
602
- describe '#select_all!' do
603
- it 'selects multiple options based on value' do
604
- browser.select_list(name: 'new_user_languages').clear
605
- expect {
606
- browser.select_list(name: 'new_user_languages').select_all!(/\d+/)
607
- }.to have_deprecated_select_all
608
- list = %w[Danish EN NO Russian]
609
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq list
610
- end
611
-
612
- it 'selects multiple options based on text' do
613
- browser.select_list(name: 'new_user_languages').clear
614
- expect {
615
- browser.select_list(name: 'new_user_languages').select_all!(/ish/)
616
- }.to have_deprecated_select_all
617
- list = %w[Danish EN Swedish]
618
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq list
619
- end
620
-
621
- it 'selects multiple options based on labels' do
622
- browser.select_list(name: 'new_user_languages').clear
623
- expect {
624
- browser.select_list(name: 'new_user_languages').select_all!(/NO|EN/)
625
- }.to have_deprecated_select_all
626
- list = %w[EN NO]
627
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq list
628
- end
629
-
630
- it 'selects all options in an Array' do
631
- browser.select_list(name: 'new_user_languages').clear
632
- expect {
633
- browser.select_list(name: 'new_user_languages').select_all!([/ish/, /Latin/])
634
- }.to have_deprecated_select_all
635
- list = ['Danish', 'EN', 'Swedish', 'Azeri - Latin', 'Latin']
636
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq list
637
- end
638
-
639
- it 'selects all options in a parameter list' do
640
- browser.select_list(name: 'new_user_languages').clear
641
- expect {
642
- browser.select_list(name: 'new_user_languages').select_all!(/ish/, /Latin/)
643
- }.to have_deprecated_select_all
644
- list = ['Danish', 'EN', 'Swedish', 'Azeri - Latin', 'Latin']
645
- expect(browser.select_list(name: 'new_user_languages').selected_options.map(&:text)).to eq list
646
- end
647
-
648
- it 'returns the first matching value if there are multiple matches' do
649
- expect {
650
- expect(browser.select_list(name: 'new_user_languages').select_all!(/ish/)).to eq 'Danish'
651
- }.to have_deprecated_select_all
652
- end
653
- end
654
553
  end
@@ -17,8 +17,8 @@ describe 'Span' do
17
17
  expect(browser.span(xpath: "//span[@id='lead']")).to exist
18
18
  end
19
19
 
20
- it 'visible text is found by regular expression with text locator' do
21
- expect(browser.span(text: /Dubito, ergo cogito, ergo sum/)).to exist
20
+ it 'visible text is found by regular expression with visible text locator' do
21
+ expect(browser.span(visible_text: /Dubito, ergo cogito, ergo sum/)).to exist
22
22
  end
23
23
 
24
24
  it 'returns the first span if given no args' do
@@ -13,7 +13,7 @@ describe 'Spans' do
13
13
 
14
14
  describe '#length' do
15
15
  it 'returns the number of spans' do
16
- expect(browser.spans.length).to eq 7
16
+ expect(browser.spans.length).to eq 8
17
17
  end
18
18
  end
19
19
 
@@ -18,7 +18,7 @@ describe 'Strong' do
18
18
  end
19
19
 
20
20
  it 'visible text is found by regular expression with text locator' do
21
- expect(browser.strong(text: /Dubito, ergo cogito, ergo sum/)).to exist
21
+ expect(browser.strong(visible_text: /Dubito, ergo cogito, ergo sum/)).to exist
22
22
  end
23
23
 
24
24
  it 'returns the first strong if given no args' do
@@ -131,10 +131,15 @@
131
131
  <del class="footer" onclick="this.innerHTML = 'This is a del with text set by Javascript.'">This is a del.</del>
132
132
  </div>
133
133
  <div custom-attribute=custom>Custom</div>
134
+ <div id="visible_link">
135
+ <a id="all_visible_link">all visible</a>
136
+ <a id="some_visible_link">some visible<span style="display:none;"> some hidden</span></a>
137
+ <a id="no_visible_link" style="display:none;">none visible</a>
138
+ </div>
134
139
  <div id="visible_text">
135
- <a id="all_visible_text">all visible</a>
136
- <a id="some_visible_text">some visible<span style="display:none;"> some hidden</span></a>
137
- <a id="no_visible_text" style="display:none;">none visible</a>
140
+ <div id="all_visible_text">all visible</div>
141
+ <div id="some_visible_text">some visible<span style="display:none;"> some hidden</span></div>
142
+ <div id="no_visible_text" style="display:none;">none visible</div>
138
143
  </div>
139
144
  </body>
140
145
  </html>