selenium_fury 0.6.2 → 0.6.3
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.
- data/.rvmrc +1 -7
- data/Rakefile +4 -8
- data/features/step_definitions/validate_page_object_steps.rb +6 -2
- data/lib/selenium_fury/selenium_web_driver/page_object_components.rb +21 -10
- data/lib/selenium_fury/version.rb +1 -1
- data/selenium_fury.gemspec +2 -2
- data/spec/selenium_web_driver/page_object_spec.rb +29 -41
- data/spec/selenium_web_driver/page_validator_spec.rb +1 -1
- data/spec/test_page/test_page.html +5 -0
- data/spec/test_page/test_page.rb +2 -0
- metadata +15 -14
- data/features/custom_generator.feature +0 -21
- data/features/step_definitions/custom_generator_steps.rb +0 -114
data/.rvmrc
CHANGED
@@ -1,9 +1,3 @@
|
|
1
|
-
rvm use 1.9.3@selenium_fury --create
|
2
|
-
# Ensure that Bundler is installed, install it if it is not.
|
3
|
-
if ! command -v bundle ; then
|
4
|
-
printf "The rubygem 'bundler' is not installed, installing it now.\n"
|
5
|
-
gem install bundler
|
6
|
-
fi
|
7
|
-
|
1
|
+
rvm use ruby-1.9.3-p362@selenium_fury --create
|
8
2
|
|
9
3
|
|
data/Rakefile
CHANGED
@@ -6,19 +6,15 @@ require 'rspec'
|
|
6
6
|
require 'rspec/core/rake_task'
|
7
7
|
require 'cucumber'
|
8
8
|
require 'cucumber/rake/task'
|
9
|
-
|
10
|
-
require 'yard/rake/yardoc_task'
|
9
|
+
|
11
10
|
require "bundler/gem_tasks"
|
12
11
|
|
13
12
|
RSpec::Core::RakeTask.new(:spec)
|
14
13
|
Cucumber::Rake::Task.new(:feature)
|
15
|
-
YARD::Rake::YardocTask.new do |t|
|
16
|
-
t.files = ['lib/**/*.rb']
|
17
|
-
end
|
18
14
|
|
19
|
-
task :default
|
20
|
-
|
21
|
-
|
15
|
+
task :default => :spec
|
16
|
+
|
17
|
+
|
22
18
|
|
23
19
|
#desc 'Push gem to gem server'
|
24
20
|
# task 'release' => ['gem:build', 'gem:git:release'] do
|
@@ -4,8 +4,12 @@ end
|
|
4
4
|
Then /^the test page object locators will be checked$/ do
|
5
5
|
end
|
6
6
|
When /^I run the validator with missing locators$/ do
|
7
|
-
|
7
|
+
class MissingElement < PageObject
|
8
|
+
element :not_a_element1, {:id => "not a element1"}
|
9
|
+
element :not_a_element2, {:id => "not a element2"}
|
10
|
+
end
|
11
|
+
expect { web_driver_validate(MissingElement) }.to raise_exception RuntimeError, "Found Missing Elements: [:not_a_element1, :not_a_element2]"
|
8
12
|
end
|
9
13
|
Then /^there will be missing locators found$/ do
|
10
|
-
|
14
|
+
|
11
15
|
end
|
@@ -22,22 +22,22 @@ module SeleniumFury
|
|
22
22
|
end
|
23
23
|
|
24
24
|
module ClassMethods
|
25
|
-
|
26
|
-
#@method element(element_sym, element_hash, opts={})
|
27
|
-
# @param element_sym [:Symbol]
|
28
|
-
# @param element_hash [Hash]
|
29
|
-
# @param opts [Hash]
|
30
|
-
# @return [Selenium::WebDriver::Element]
|
25
|
+
|
31
26
|
def elements
|
32
27
|
@elements ||= []
|
33
28
|
end
|
34
29
|
|
35
|
-
|
30
|
+
# this is a method on the class now
|
31
|
+
# @method element(element_sym, element_hash, opts={})
|
32
|
+
# @param element_sym [:Symbol]
|
33
|
+
# @param element_hash [Hash]
|
34
|
+
# @param opts [Hash]
|
35
|
+
# @return [Selenium::WebDriver::Element]
|
36
36
|
def element(element_sym, element_hash, opts={})
|
37
37
|
#@transient_elements ||= []
|
38
38
|
# define a new method with the name of the symbol after locator that returns the value
|
39
39
|
send :define_method, element_sym do
|
40
|
-
wait = Selenium::WebDriver::Wait.new(:timeout =>
|
40
|
+
wait = Selenium::WebDriver::Wait.new(:timeout => 0.5) # seconds
|
41
41
|
begin
|
42
42
|
wait.until { driver.find_element element_hash }
|
43
43
|
rescue Selenium::WebDriver::Error::TimeOutError
|
@@ -48,10 +48,21 @@ module SeleniumFury
|
|
48
48
|
# keep a running track of all elements and transient elements
|
49
49
|
elements << element_sym
|
50
50
|
#@transient_elements << element_hash if opts[:transient]
|
51
|
-
|
52
51
|
end
|
53
52
|
|
54
|
-
|
53
|
+
def element_list(element_sym, element_hash, opts={})
|
54
|
+
send :define_method, element_sym do
|
55
|
+
wait = Selenium::WebDriver::Wait.new(timeout: 0.5)
|
56
|
+
begin
|
57
|
+
wait.until { !driver.find_elements(element_hash).empty? }
|
58
|
+
driver.find_elements(element_hash)
|
59
|
+
rescue Selenium::WebDriver::Error::TimeOutError
|
60
|
+
raise "Could not find any elements like #{element_sym}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [PageObject]
|
55
66
|
def page(page_sym, page_class)
|
56
67
|
send :define_method, page_sym do
|
57
68
|
raise "#{page_class.to_s} does not inherit from PageObject" unless page_class.superclass == PageObject
|
data/selenium_fury.gemspec
CHANGED
@@ -15,8 +15,8 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.version = SeleniumFury::VERSION
|
16
16
|
gem.add_dependency('selenium-webdriver')
|
17
17
|
gem.add_dependency('nokogiri')
|
18
|
-
gem.add_development_dependency('rspec')
|
18
|
+
gem.add_development_dependency('rspec','~>2.12')
|
19
19
|
gem.add_development_dependency('cucumber')
|
20
|
-
gem.add_development_dependency('yard')
|
21
20
|
gem.add_development_dependency('redcarpet')
|
21
|
+
gem.add_development_dependency('rake')
|
22
22
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
describe SeleniumFury::SeleniumWebDriver::CreateSeleniumWebDriver do
|
3
|
-
it "should go to page using launch_web_driver" do
|
3
|
+
it "should go to a page using launch_web_driver" do
|
4
4
|
launch_web_driver TEST_PAGE_URL
|
5
5
|
driver.current_url.should include "/spec/test_page/test_page.html"
|
6
6
|
driver.title.should == "SeleniumFury Test Page"
|
@@ -8,14 +8,16 @@ describe SeleniumFury::SeleniumWebDriver::CreateSeleniumWebDriver do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
describe PageObject do
|
11
|
-
|
12
|
-
|
11
|
+
after(:each) do
|
12
|
+
Object.instance_eval { remove_const :TestPage } if Object.const_defined? :TestPage
|
13
|
+
end
|
14
|
+
specify "has Selenium::WebDriver::Elements defined with the element method" do
|
13
15
|
launch_web_driver TEST_PAGE_URL
|
14
16
|
test_page = TestPage.new(driver)
|
15
17
|
test_page.should_not be_nil
|
16
18
|
test_page.textarea.should be_a(Selenium::WebDriver::Element)
|
17
19
|
end
|
18
|
-
|
20
|
+
specify "allows a page object class can be linked to another page object class using the page method for sub pages" do
|
19
21
|
class ComponentPage < PageObject
|
20
22
|
|
21
23
|
end
|
@@ -23,12 +25,12 @@ describe PageObject do
|
|
23
25
|
TestPage.new().component_page.should be_a(ComponentPage)
|
24
26
|
end
|
25
27
|
|
26
|
-
it "should have an error if a non page object class is passed to page method" do
|
28
|
+
it "should have an error if a non page object class is passed to the page method" do
|
27
29
|
TestPage.page(:not_a_page, String)
|
28
30
|
expect { TestPage.new().not_a_page }.to(raise_exception(RuntimeError, "String does not inherit from PageObject"))
|
29
31
|
end
|
30
32
|
|
31
|
-
it "should
|
33
|
+
it "should call methods on Selenium::WebDriver::Elements defined in the TestPage class" do
|
32
34
|
launch_web_driver TEST_PAGE_URL
|
33
35
|
test_page = TestPage.new(driver)
|
34
36
|
test_page.input_message.send_keys "this is awesome"
|
@@ -36,50 +38,36 @@ describe PageObject do
|
|
36
38
|
driver.find_element(:id => "message").text.should == "this is awesome"
|
37
39
|
end
|
38
40
|
|
39
|
-
|
41
|
+
specify "PageObject provides a method to return all Selenium::WebDriver::Element defined in the class" do
|
40
42
|
launch_web_driver TEST_PAGE_URL
|
41
43
|
test_page = TestPage.new(driver)
|
42
|
-
test_page.click_check_box
|
43
|
-
driver.find_element(:id => "input_checkbox").selected?.should be_true
|
44
|
-
end
|
45
|
-
end
|
46
|
-
# OK, so here's some great info about the "magic" behind ruby.
|
47
|
-
# When ruby spins up, an Object class is created, and everything runs "inside" it
|
48
|
-
# When you do code like this: TestPage.new() an instance of TestPage is added as a constant
|
49
|
-
# to the instance of this "global" Object class
|
50
|
-
# Therefore, since rspec is running "inside" this Object Class, an instance of TestPage is
|
51
|
-
# instantiated and shared from test to test, BUT when you do get_page_object, an instance
|
52
|
-
# of the page object must be created and added as a constant, but if it already exists,
|
53
|
-
# you're gonna have bad time. Therefore, for testing sake, we must check for this,
|
54
|
-
# and handle it appropriately.
|
55
|
-
#
|
56
|
-
# It should also be noted that get_page_object only adds page elements to the class
|
57
|
-
# and currently doesn't look for a pre-defined page object in the project
|
58
|
-
|
59
|
-
describe "PageObjectElements" do
|
60
|
-
before(:each) do
|
61
|
-
Object.instance_eval { remove_const :TestPage } if Object.const_defined? :TestPage
|
62
|
-
end
|
63
|
-
after(:each) do
|
64
|
-
Object.instance_eval { remove_const :TestPage }
|
65
|
-
end
|
66
|
-
it "should have elements" do
|
67
|
-
launch_web_driver TEST_PAGE_URL
|
68
|
-
test_page = get_page_object(driver, 'TestPage')
|
69
44
|
test_page.class.elements.should_not be_nil
|
70
45
|
test_page.class.elements.should have(15).elements
|
71
46
|
test_page.method(test_page.class.elements[0]).call.class.should == Selenium::WebDriver::Element
|
72
47
|
end
|
73
|
-
it "should return a web_driver element when an attribute is accessed" do
|
74
|
-
launch_web_driver TEST_PAGE_URL
|
75
|
-
test_page = get_page_object(driver, 'TestPage')
|
76
|
-
test_page.textarea.class.should == Selenium::WebDriver::Element
|
77
|
-
end
|
78
48
|
|
79
49
|
it "should raise an exception when the element can't be found'" do
|
80
50
|
launch_web_driver TEST_PAGE_URL
|
81
|
-
test_page =
|
51
|
+
test_page = TestPage.new(driver)
|
82
52
|
TestPage.element :not_a_element, {:id => "not a element"}
|
83
53
|
expect { test_page.not_a_element }.to raise_exception RuntimeError, "Could not find element not_a_element"
|
84
54
|
end
|
85
|
-
|
55
|
+
|
56
|
+
describe "#element_list" do
|
57
|
+
context 'when there are elements found' do
|
58
|
+
it "should return an array of Selenium::WebDriver::Elements" do
|
59
|
+
launch_web_driver TEST_PAGE_URL
|
60
|
+
test_page = TestPage.new(driver)
|
61
|
+
test_page.listings.should be_an Array
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context 'when there are not elements found' do
|
65
|
+
it "should i dunno" do
|
66
|
+
launch_web_driver TEST_PAGE_URL
|
67
|
+
test_page = TestPage.new(driver)
|
68
|
+
TestPage.element_list :cats, { id: 'meow' }
|
69
|
+
expect { test_page.cats }.to raise_error RuntimeError
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -7,7 +7,7 @@ describe SeleniumFury::SeleniumWebDriver::PageValidator do
|
|
7
7
|
element :not_a_element2, {:id => "not a element2"}
|
8
8
|
end
|
9
9
|
launch_web_driver TEST_PAGE_URL
|
10
|
-
expect {
|
10
|
+
expect { validate(MissingElement) }.to raise_exception RuntimeError, "Found Missing Elements: [:not_a_element1, :not_a_element2]"
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should validate elements" do
|
@@ -13,6 +13,11 @@
|
|
13
13
|
|
14
14
|
<div id="message"></div>
|
15
15
|
|
16
|
+
<ul id="element_list">
|
17
|
+
<li class="listing">Herpa</li>
|
18
|
+
<li class="listing">Derpa</li>
|
19
|
+
</ul>
|
20
|
+
|
16
21
|
<form id="form" name="form">
|
17
22
|
<label for="textarea">Textarea</label>
|
18
23
|
<textarea id="textarea">This is a textarea field.
|
data/spec/test_page/test_page.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selenium_fury
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-03-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: selenium-webdriver
|
@@ -48,17 +48,17 @@ dependencies:
|
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
49
49
|
none: false
|
50
50
|
requirements:
|
51
|
-
- -
|
51
|
+
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '2.12'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '2.12'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: cucumber
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
79
|
+
name: redcarpet
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
@@ -92,7 +92,7 @@ dependencies:
|
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
|
-
name:
|
95
|
+
name: rake
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
97
97
|
none: false
|
98
98
|
requirements:
|
@@ -122,9 +122,7 @@ files:
|
|
122
122
|
- LICENSE
|
123
123
|
- README.md
|
124
124
|
- Rakefile
|
125
|
-
- features/custom_generator.feature
|
126
125
|
- features/generate_page_object.feature
|
127
|
-
- features/step_definitions/custom_generator_steps.rb
|
128
126
|
- features/step_definitions/generate_page_object_steps.rb
|
129
127
|
- features/step_definitions/validate_page_object_steps.rb
|
130
128
|
- features/support/env.rb
|
@@ -163,22 +161,26 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
163
161
|
- - ! '>='
|
164
162
|
- !ruby/object:Gem::Version
|
165
163
|
version: '0'
|
164
|
+
segments:
|
165
|
+
- 0
|
166
|
+
hash: 2135389141801828284
|
166
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
167
168
|
none: false
|
168
169
|
requirements:
|
169
170
|
- - ! '>='
|
170
171
|
- !ruby/object:Gem::Version
|
171
172
|
version: '0'
|
173
|
+
segments:
|
174
|
+
- 0
|
175
|
+
hash: 2135389141801828284
|
172
176
|
requirements: []
|
173
177
|
rubyforge_project:
|
174
|
-
rubygems_version: 1.8.
|
178
|
+
rubygems_version: 1.8.25
|
175
179
|
signing_key:
|
176
180
|
specification_version: 3
|
177
181
|
summary: Generate Selenium Page Objects
|
178
182
|
test_files:
|
179
|
-
- features/custom_generator.feature
|
180
183
|
- features/generate_page_object.feature
|
181
|
-
- features/step_definitions/custom_generator_steps.rb
|
182
184
|
- features/step_definitions/generate_page_object_steps.rb
|
183
185
|
- features/step_definitions/validate_page_object_steps.rb
|
184
186
|
- features/support/env.rb
|
@@ -194,4 +196,3 @@ test_files:
|
|
194
196
|
- spec/test_page/test_page.html
|
195
197
|
- spec/test_page/test_page.rb
|
196
198
|
- spec/test_page/test_page_custom_generator_configuration.rb
|
197
|
-
has_rdoc:
|
@@ -1,21 +0,0 @@
|
|
1
|
-
Feature: Custom Generator
|
2
|
-
As an automated tester I want to create a page object with variable names that reflect business terms so the our test will reflect ubiquitous language.
|
3
|
-
|
4
|
-
Scenario: Use a custom generator configuration object to specify how to name our variables from another source than the id
|
5
|
-
Given I am on the test page
|
6
|
-
When I have a custom generator configuration class
|
7
|
-
And I run the custom generator
|
8
|
-
Then I will have a ruby class produced that I can use as a page object
|
9
|
-
|
10
|
-
|
11
|
-
Scenario: I can specify a locator that I can pass to nokogiri to get a nokogiri node set that contains data that I want to use as an attribute name and locator value
|
12
|
-
Given I have a custom generator configuration class
|
13
|
-
When I specify a selector attribute
|
14
|
-
And I create a nokogiri document for the test page
|
15
|
-
Then I should get a nokogiri node set that I can iterate over to find a name and value for my page object locators
|
16
|
-
When I call the name method on the custom generator configuration class
|
17
|
-
Then I should get the raw string to name my page object attribute
|
18
|
-
When I call the value method on the custom generator configuration class
|
19
|
-
Then I should get a value that I can use as a selenium locator
|
20
|
-
|
21
|
-
|
@@ -1,114 +0,0 @@
|
|
1
|
-
When /^I have a custom generator configuration class$/ do
|
2
|
-
@test_page_custom_generator_configuration = TestPageCustomGeneratorConfiguration.new()
|
3
|
-
@test_page_custom_generator_configuration.should_not be_nil
|
4
|
-
end
|
5
|
-
When /^I run the custom generator$/ do
|
6
|
-
pending
|
7
|
-
end
|
8
|
-
When /^I specify a selector attribute$/ do
|
9
|
-
@test_page_custom_generator_configuration.selector.should_not be_nil
|
10
|
-
|
11
|
-
end
|
12
|
-
When /^I create a nokogiri document for the test page$/ do
|
13
|
-
@doc = Nokogiri::HTML(ADVANCED_SEARCH_HTML)
|
14
|
-
@doc.should_not be_nil
|
15
|
-
@doc.class.to_s.should == "Nokogiri::HTML::Document"
|
16
|
-
end
|
17
|
-
|
18
|
-
Then /^I should get a nokogiri node set that I can iterate over to find a name and value for my page object locators$/ do
|
19
|
-
@check_box_nokogiri_elements = @doc.css(@test_page_custom_generator_configuration.selector)
|
20
|
-
@check_box_nokogiri_elements.class.to_s.should == "Nokogiri::XML::NodeSet"
|
21
|
-
@check_box_nokogiri_elements.each do |nokogiri_element|
|
22
|
-
nokogiri_element.class.to_s.should == "Nokogiri::XML::Element"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
When /^I call the name method on the custom generator configuration class$/ do
|
26
|
-
@test_page_custom_generator_configuration.nokogiri_element=@check_box_nokogiri_elements.last
|
27
|
-
@test_page_custom_generator_configuration.nokogiri_element=@check_box_nokogiri_elements.last
|
28
|
-
@locator_name = @test_page_custom_generator_configuration.name
|
29
|
-
end
|
30
|
-
Then /^I should get the raw string to name my page object attribute$/ do
|
31
|
-
@locator_name.should_not be_nil
|
32
|
-
@locator_name.should == "Link 3"
|
33
|
-
end
|
34
|
-
When /^I call the value method on the custom generator configuration class$/ do
|
35
|
-
@locator_value = @test_page_custom_generator_configuration.value
|
36
|
-
end
|
37
|
-
Then /^I should get a value that I can use as a selenium locator$/ do
|
38
|
-
@locator_value.should_not be_nil
|
39
|
-
@locator_value.should == "link333333"
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
|
-
ADVANCED_SEARCH_HTML=<<EOF
|
44
|
-
<!doctype html>
|
45
|
-
<html lang="en">
|
46
|
-
<head>
|
47
|
-
<meta charset="utf-8">
|
48
|
-
<title>SeleniumFury Test Page</title>
|
49
|
-
<script type="text/javascript">
|
50
|
-
function displayMessage() {
|
51
|
-
document.getElementById('message').innerHTML = document.form.msgtext.value
|
52
|
-
}
|
53
|
-
</script>
|
54
|
-
</head>
|
55
|
-
<body>
|
56
|
-
|
57
|
-
<div id="message"></div>
|
58
|
-
|
59
|
-
<form id="form" name="form">
|
60
|
-
<label for="textarea">Textarea</label>
|
61
|
-
<textarea id="textarea">This is a textarea field.
|
62
|
-
</textarea>
|
63
|
-
<br/>
|
64
|
-
<label for="select">Select</label>
|
65
|
-
<select id="select">
|
66
|
-
<option value="volvo">Volvo</option>
|
67
|
-
<option value="saab">Saab</option>
|
68
|
-
<option value="mercedes">Mercedes</option>
|
69
|
-
<option value="audi">Audi</option>
|
70
|
-
</select>
|
71
|
-
<br/>
|
72
|
-
<label for="input_button">Button</label>
|
73
|
-
<input id="input_button" type="button" value="Click me"/>
|
74
|
-
<br/>
|
75
|
-
<label for="input_checkbox">Checkbox</label>
|
76
|
-
<input id="input_checkbox" type="checkbox"/>
|
77
|
-
<br/>
|
78
|
-
<label for="input_file">File</label>
|
79
|
-
<input id="input_file" type="file"/>
|
80
|
-
<br/>
|
81
|
-
<input id="input_hidden" type="hidden"/>
|
82
|
-
<br/>
|
83
|
-
<label for="input_image">Image</label>
|
84
|
-
<input id="input_image" type="image" alt="input image"/>
|
85
|
-
<br/>
|
86
|
-
<label for="input_password">Password</label>
|
87
|
-
<input id="input_password" type="password"/>
|
88
|
-
<br/>
|
89
|
-
<label for="input_radio">Radio</label>
|
90
|
-
<input id="input_radio" type="radio"/>
|
91
|
-
<br/>
|
92
|
-
<label for="input_reset">Reset</label>
|
93
|
-
<input id="input_reset" type="reset"/>
|
94
|
-
<br/>
|
95
|
-
<label for="input_submit">Submit</label>
|
96
|
-
<input id="input_submit" type="submit"/>
|
97
|
-
<br/>
|
98
|
-
<label for="input_text">Text</label>
|
99
|
-
<input id="input_text" type="text"/>
|
100
|
-
<br/>
|
101
|
-
<fieldset>
|
102
|
-
<legend>Input test:</legend>
|
103
|
-
<label for="input_message">Message Text:</label>
|
104
|
-
<input id="input_message" name="msgtext" type="text" />
|
105
|
-
<br/>
|
106
|
-
<input id="input_msg_button" type="button" value="Click me" onClick="displayMessage()"/>
|
107
|
-
</fieldset>
|
108
|
-
</form>
|
109
|
-
<a id="link111111" href="http://news.ycombinator.com/">Link 1</a>
|
110
|
-
<a id="link222222" href="http://yahoo.com">Link 2</a>
|
111
|
-
<a id="link333333" href="http://google.com">Link 3</a>
|
112
|
-
</body>
|
113
|
-
</html>
|
114
|
-
EOF
|