page_object_wrapper 0.0.1 → 0.0.2

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.
@@ -0,0 +1,43 @@
1
+ class Distribution
2
+ attr_accessor :total_object_number
3
+ # distribution types
4
+ RANDOM=0 #(default)
5
+ SEQUENTAL=1
6
+ def initialize(dist_hash) # {status_name => status_probability (in percents)}
7
+ @distribution=dist_hash
8
+ @type=RANDOM
9
+ @sequental_increment=1
10
+ @sequental_index=@sequental_increment
11
+ # check for consistency
12
+ raise "Distribution init error > summ of percents must be 100" if @distribution.values.inject{|sum,x| sum + x }!=100
13
+ end
14
+
15
+ def type(type,total_object_number=nil)
16
+ raise "Unknown type: #{type}. Possible types are Distribution::RANDOM, Distribution::SEQUENTAL" if not (type==RANDOM or type==SEQUENTAL)
17
+ @type=type
18
+ if @type==SEQUENTAL
19
+ raise "SEQUENTAL type requires the total number of objects that will be generated (>0)" if (total_object_number==nil or total_object_number==0)
20
+ @sequental_increment=(100/total_object_number).floor
21
+ @sequental_index=@sequental_increment
22
+ end
23
+ end
24
+
25
+ def generate
26
+ r=(@type==RANDOM)? rand(100) : @sequental_index
27
+ @sequental_index=(@sequental_index<100)? @sequental_index+@sequental_increment : @sequental_increment
28
+ dist_ary=@distribution.values
29
+ dist_ary_normalized=[]
30
+ dist_ary_normalized << dist_ary.first
31
+ for i in 1..dist_ary.length-1
32
+ dist_ary_normalized[i]=dist_ary_normalized[i-1]+dist_ary[i]
33
+ end
34
+ ind=(dist_ary_normalized << r).sort!.index(r)
35
+ return @distribution.keys[ind]
36
+ end
37
+ end
38
+
39
+ #d=Distribution.new('new'=>10,'old'=>30,'very_old'=>60)
40
+ #d.type(Distribution::SEQUENTAL,10)
41
+ #10.times do
42
+ # puts d.generate
43
+ #end
@@ -0,0 +1,31 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'Exceptions'
3
+ class DynamicClass
4
+
5
+ def metaclass
6
+ class << self
7
+ self
8
+ end
9
+ end
10
+
11
+ @@objects=[]
12
+ def initialize(xml_hash)
13
+ raise DynamicClassError.new('parameter is not a hash','new',xml_hash) if not xml_hash.is_a?(Hash)
14
+ xml_hash.each_pair {|attr, value|
15
+ metaclass.send :attr_accessor, attr
16
+ send "#{attr}=".to_sym, value
17
+ }
18
+ @@objects << self
19
+ end
20
+
21
+ def self.find(attr,value)
22
+ ind=@@objects.collect(&attr.to_sym).index(value)
23
+ @@objects[ind]
24
+ end
25
+ def self.each
26
+ @@objects.each{|object|
27
+ yield object
28
+ }
29
+ end
30
+ end
31
+
@@ -0,0 +1,13 @@
1
+ class Editable
2
+ attr_accessor :watir_element, :label, :default, :required
3
+ def initialize(watir_element,label,default,required)
4
+ @watir_element = watir_element
5
+ @label=label.to_sym
6
+ @default=default
7
+ @required=required
8
+ end
9
+
10
+ def required?
11
+ required
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ class PageError < StandardError
2
+ attr_accessor :page_url, :page_name
3
+ def initialize(msg,page_name,page_url)
4
+ @page_url=page_url
5
+ @page_name=page_name
6
+ super "PROBLEM: #{(msg.nil?)? '??' : msg}, PAGE: #{page_name}, URL: #{page_url}"
7
+ end
8
+
9
+ end
10
+
11
+ class ParameterError < StandardError
12
+ attr_accessor :method, :params
13
+ def initialize(msg,method,*params)
14
+ @method=method
15
+ @params=params
16
+ super "PROBLEM: #{(msg.nil?)? '??' : msg}, METHOD: #{method}, PARAMS: #{params.join('; ').to_s}"
17
+ end
18
+ end
19
+
20
+ class TableError < ParameterError; end
21
+ class FormError < ParameterError; end
22
+ class DynamicClassError < ParameterError; end
@@ -0,0 +1,116 @@
1
+ require 'Editable'
2
+ require 'Exceptions'
3
+ require 'Submitter'
4
+ class Form < Watir::Form
5
+ def initialize(current_page,target_page,accessor,*args)
6
+ super(accessor,extract_selector(args).merge(:tag_name => "form"))
7
+ @elements=[]
8
+ @accessor=accessor
9
+ @current_page=current_page
10
+ @target_page=target_page
11
+ @submit_element = nil
12
+ end
13
+
14
+ def editable(type,how_find_hash,label=type,default='Field data',required=false)
15
+ watir_element = @accessor.send(type.to_sym,how_find_hash)
16
+ raise FormError.new('Element not found', 'editable', "TYPE=#{type.inspect}, HOW_FIND=#{how_find_hash.inspect}, PAGE=#{@current_page.class.name}") if not element.exists?
17
+ Form.send :define_method, label do
18
+ watir_element
19
+ end
20
+ @elements << Editable.new(watir_element,label,default,required)
21
+ end
22
+
23
+ def submitter(type,how_find_hash,how_click_method = :click,*click_params)
24
+ # find submitter
25
+ @submit_element = Submitter.new(how_click_method,click_params)
26
+ @submit_element.watir_element = @accessor.send(type.to_sym,how_find_hash)
27
+ raise FormError.new('Element not found', 'submitter', "TYPE=#{type.inspect}, HOW_FIND=#{how_find_hash.inspect}") if not @submit_element.watir_element.exists?
28
+ end
29
+
30
+ def submit(correct_submission_flag)
31
+ return_page = (correct_submission_flag==true)? @target_page : @current_page
32
+ if @submit_element.nil?
33
+ # submitter is not defined, applying regular form submission
34
+ super()
35
+ return return_page.new
36
+ else
37
+ # submitter defined, applying its submission method
38
+ begin
39
+ @submit_element.watir_element.send(@submit_element.how_click_method.to_sym,*@submit_element.click_params)
40
+ rescue Exception => e
41
+ puts "ORIGINAL ERROR: #{e.message}"
42
+ raise FormError.new('Submitter not clickable', "SUBMITTER: TYPE=#{@submit_element.type}, HOW_FIND=#{@submit_element.how_find_hash}", "CLICK_METHOD: #{@submit_element.how_click_mehtod}, CLICK_PARAMS: #{@submit_element.click_params}")
43
+ end
44
+ return return_page.new
45
+ end
46
+ end
47
+
48
+ def default(label)
49
+ find_input(label).default
50
+ end
51
+
52
+ def each
53
+ @elements.each{|e|
54
+ yield e
55
+ }
56
+ end
57
+
58
+ def each_required
59
+ @elements.select{|f| f.required}.each{|e|
60
+ yield e
61
+ }
62
+ end
63
+
64
+ def fill_only(data_hash)
65
+ if data_hash.nil?
66
+ raise FormError.new('Invalid parameter','fill_only',data_hash)
67
+ else
68
+ data_hash.each_key{|label|
69
+ f=find_input(label)
70
+ f.watir_element.set(data_hash[label])
71
+ }
72
+ end
73
+ self
74
+ end
75
+
76
+ def fill_all(except_hash=nil)
77
+ fill_elements(@elements,except_hash)
78
+ self
79
+ end
80
+
81
+ def fill_required(except_hash=nil)
82
+ fill_elements(@elements.select{|f| f.required},except_hash)
83
+ self
84
+ end
85
+
86
+
87
+ private
88
+ def find_input(label)
89
+ label = label.to_sym
90
+ index=@elements.collect(&:label).index(label)
91
+ raise FormError.new('label not found','find_input',label) if index.nil?
92
+ @elements[index]
93
+ end
94
+ def fill_elements(elements,except_hash)
95
+ elements = @elements.clone
96
+ if not except_hash.nil?
97
+ if not except_hash.has_key?(:except)
98
+ raise FormError.new('Invalid parameter, must be :except=>"label or [label1,label2,...]"',"fill_elements",elements.inspect,except_hash.inspect)
99
+ else
100
+ if except_hash[:except].is_a?(String) or except_hash[:except].is_a?(Symbol)
101
+ elements.delete(find_input(except_hash[:except]))
102
+ elsif except_hash[:except].is_a?(Array)
103
+ except_hash[:except].each{|label|
104
+ elements.delete(find_input(label))
105
+ }
106
+ else
107
+ raise FormError.new('Invalid parameter',"fill_elements",elements.inspect,except_hash.inspect)
108
+ end
109
+ end
110
+ end
111
+ elements.each{|field|
112
+ field.watir_element.when_present.set(field.default)
113
+ }
114
+ end
115
+ end
116
+
@@ -0,0 +1,59 @@
1
+ require 'Exceptions'
2
+
3
+ class Pagination
4
+
5
+ def initialize(page_object,pagination_div_args)
6
+ page_numbers=[]
7
+ link_pattern=''
8
+ @pagination_links=[]
9
+ @page_object=page_object
10
+ @accessor=@page_object.class.accessor
11
+ @base_url=@page_object.class.url
12
+ if @accessor.div(pagination_div_args).exists?
13
+ raise ArgumentError.new("Cant find ul list inside div #{pagination_div_args.inspect} on page #{@accessor.url}") if not @accessor.div(pagination_div_args).ul.exists?
14
+ raise ArgumentError.new("Pagination link not found inside div #{pagination_div_args.inspect} on page #{@accessor.url}") if @accessor.div(pagination_div_args).ul.links.to_a.empty?
15
+ @accessor.div(pagination_div_args).ul.links.each{|l|
16
+ if l.text=~/\d/
17
+ page_numbers << l.text.to_i
18
+ @link_pattern=l.href
19
+ end
20
+ }
21
+ page_numbers.collect(&:to_i).sort!
22
+ for i in page_numbers.first..page_numbers.last do
23
+ @pagination_links << @link_pattern.gsub(/=\d+/,"="+i.to_s)
24
+ end
25
+ else
26
+ # assuming that page has no pagination links
27
+ @pagination_links << @base_url
28
+ @link_pattern=@base_url
29
+ end
30
+ end
31
+
32
+ def number(n)
33
+ raise ArgumentError.new("Cant find pagination page number #{n} on Page #{@accessor.url}") if not @pagination_links.include?(@link_pattern.gsub(/=\d+/,"="+(n).to_s))
34
+ change_page(@pagination_links[n-1])
35
+ end
36
+
37
+ def first
38
+ change_page(@pagination_links.first)
39
+ end
40
+ def last
41
+ change_page(@pagination_links.last)
42
+ end
43
+ def reset
44
+ change_page(@base_url)
45
+ end
46
+ def each
47
+ @pagination_links.each{|link|
48
+ p=change_page(link)
49
+ yield p
50
+ }
51
+ end
52
+
53
+
54
+ private
55
+ def change_page(link)
56
+ @page_object.class.url=link
57
+ @page_object.class.new(true)
58
+ end
59
+ end
@@ -0,0 +1,8 @@
1
+ class Submitter
2
+ attr_accessor :how_click_method, :click_params, :watir_element
3
+ def initialize(how_click_method=:click,click_params=nil)
4
+ @how_click_method=how_click_method
5
+ @click_params=click_params
6
+ @watir_element = nil
7
+ end
8
+ end
@@ -0,0 +1,50 @@
1
+ require 'Exceptions'
2
+
3
+ class Table < Watir::Table
4
+ def initialize(accessor,*args)
5
+ super(accessor, extract_selector(args).merge(:tag_name => "table"))
6
+ @cells=[]
7
+ self.rows.each{|row|
8
+ row.cells.each{|cell|
9
+ @cells << cell
10
+ }
11
+ }
12
+ end
13
+
14
+ def has_cell?(text)
15
+ @cells.collect(&:text).include?(text)
16
+ end
17
+ def cells
18
+ @cells
19
+ end
20
+ def select(column_name,where_hash)
21
+ ######## TABLE ##############
22
+ # HEADER r0,c0 r0,c1,...,r0cN
23
+ # ROW r1,c0,r1,c1,...,r1cN
24
+ return_column,find_by_column_name,find_by_column_value=nil
25
+ begin
26
+ return_column=Regexp.new(column_name)
27
+ find_by_column_name=Regexp.new(where_hash[:where].keys.first)
28
+ find_by_column_value=where_hash[:where].values.first
29
+ rescue
30
+ raise TableError.new('invalid parameters, check column names and parameters (must be Table#select(column_name_regexp,:where=>{column_name_regexp=>value_or_:any}))','select',column_name,where_hash) if not find_attrs_valid?(column_name,where_hash)
31
+ end
32
+ index=0
33
+ return_index=nil
34
+ find_by_index=nil
35
+ self.rows[0].cells.each{|header_cell|
36
+ return_index=index if return_column===header_cell.text
37
+ find_by_index=index if find_by_column_name===header_cell.text
38
+ index+=1
39
+ }
40
+ raise TableError.new("column not found",'select',column_name) if return_index.nil?
41
+ raise TableError.new("column not found",'select',where_hash) if find_by_index.nil?
42
+ return self.rows[1].cells[return_index] if find_by_column_value==:any
43
+ found=nil
44
+ self.rows.each{|row|
45
+ found=row.cells[return_index] if row.cells[find_by_index].text==find_by_column_value
46
+ }
47
+ raise TableError.new("value #{find_by_column_value} not found in column #{find_by_column_name}",'select',column_name,where_hash) if found.nil?
48
+ found
49
+ end
50
+ end
@@ -1,3 +1,3 @@
1
1
  module PageObjectWrapper
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -12,10 +12,11 @@ Gem::Specification.new do |gem|
12
12
  gem.summary = %q{Wraps watir-webdriver with convenient testing interface.}
13
13
  gem.homepage = "https://github.com/evgeniy-khatko/page_object_wrapper"
14
14
  gem.add_dependency "watir-webdriver"
15
+ gem.add_development_dependency "rspec", ">= 2.0.0"
15
16
 
16
17
 
17
18
  gem.files = `git ls-files`.split($/)
18
19
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
19
20
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
- gem.require_paths = ["lib"]
21
+ gem.require_paths = ["lib","lib/page_object_wrapper"]
21
22
  end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Overall usage" do
4
+ describe "Test Google for long search query" do
5
+ let(:precondition){"Open google.com page"}
6
+ let(:step1){"Enter long search query into the search field"}
7
+ let(:step2){"Press search button"}
8
+ let(:expected_result){"The requested URL /... is too large to process"}
9
+
10
+ describe "Defining two page objects: GoogleSearchPage, GoogleErrorPage and performing test" do
11
+ let(:pages_definition){
12
+ class GoogleSearchPage < PageObjectWrapper::Page
13
+ attr_accessor :find_form
14
+ @url="/"
15
+ expected_element :text_field, :name => 'q'
16
+ def initialize visit=false
17
+ super visit
18
+ @find_form = form(GoogleErrorPage, {:action => '/search'})
19
+ @find_form.editable(:text_field, {:name => 'q'}, :seach_what, '@find_form default value', true)
20
+ end
21
+ end
22
+
23
+ class GoogleErrorPage < PageObjectWrapper::Page
24
+ @url="really does not matter, because navigating to this page done through search query submission"
25
+ #expected_element :ins, {:text => "That\’s an error."}
26
+ end
27
+ {:gsearch_page_class => GoogleSearchPage, :gerror_page => GoogleErrorPage}
28
+ }
29
+
30
+ it "performing test" do
31
+ puts precondition
32
+ google_page = pages_definition[:gsearch_page_class].new(true)
33
+ puts step1
34
+ long_query = 'q '*1000
35
+ google_page.find_form.fill_only(:seach_what => long_query)
36
+ puts step2
37
+ google_error_page = google_page.find_form.submit(true)
38
+ google_error_page.should have_text(expected_result)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,176 @@
1
+ # -*- encoding : utf-8 -*-
2
+ require 'spec_helper'
3
+
4
+ describe "Form wrapper" do
5
+ describe "form definition", :code => 6..30 do
6
+ let(:page_objects){
7
+ class GoogleAdvancedSearchPage < PageObjectWrapper::Page
8
+ attr_accessor :as_form
9
+ @url="/advanced_search"
10
+ expected_element :text_field, :name => 'as_q'
11
+ def initialize visit=false
12
+ super visit
13
+ @as_form = form(GoogleResultsPage, {:name => 'f'})
14
+ @as_form.editable(:text_field, {:name => 'as_q'}, :with_words, 'with_words default value', true)
15
+ @as_form.editable(:text_field, {:name => 'as_epq'}, :with_phrase, 'with_phrase default value', true)
16
+ @as_form.editable(:text_field, {:name => 'as_oq'}, :with_any_word, 'with_any_word default value', false)
17
+ @as_form.submitter(:input, {:type => 'submit'})
18
+ end
19
+ end
20
+ class GoogleResultsPage < PageObjectWrapper::Page
21
+ @url="/"
22
+ expected_element :button, :name => 'btnG'
23
+ def initialize visit=false
24
+ super visit
25
+ @find_form = form(GoogleResultsPage, {:action => '/search'})
26
+ @find_form.editable(:text_field, {:name => 'q'}, :seach_what, '@find_form default value', true)
27
+ end
28
+ end
29
+ {:gresults_page_class => GoogleResultsPage, :gadv_page_class => GoogleAdvancedSearchPage}
30
+ }
31
+
32
+
33
+ it "is defined as #form(TargetPage, how_find_hash)", :code => [13,25] do
34
+ page_objects[:gadv_page_class].new(true).as_form.class.should eq(Form)
35
+ end
36
+
37
+ it "has #editable(:field_type, how_find_hash, :label, default_value, required?) method to set form's fields
38
+ :field_type sets corresponding watir element type
39
+ how_find_hash is used to locate corresponding watir element on the page
40
+ :label is used to reffer to the form field after definition
41
+ default_value is used to populate fields with default test data
42
+ required = true | false and indicates if the field is required
43
+ ", :code => 14..16 do
44
+ gadv_page = page_objects[:gadv_page_class].new(true)
45
+ gadv_page.as_form.with_words.tag_name.should eq('input')
46
+ gadv_page.as_form.with_words.name.should eq('as_q')
47
+ gadv_page.as_form.with_words.should be_a(Watir::TextField)
48
+ end
49
+
50
+ it "has #submitter(:field_type, how_find_hash, how_click_mehtod, click_params) method to set form's submitter
51
+ :field_type sets corresponding watir element type
52
+ how_find_hash is used to locate corresponding watir element on the page
53
+ how_click_mehtod is used to tell Waitr the method which should be applied to click the submitter
54
+ click_params set parameters for the how_click_mehtod
55
+ ", :code => 17 do
56
+ end
57
+ end
58
+ describe "form usage", :code => 59..84 do
59
+ let(:page_objects){
60
+ class GoogleAdvancedSearchPage < PageObjectWrapper::Page
61
+ attr_accessor :as_form
62
+ @url="/advanced_search"
63
+ expected_element :text_field, :name => 'as_q'
64
+ def initialize visit=false
65
+ super visit
66
+ @as_form = form(GoogleSearchPage, {:name => 'f'})
67
+ @as_form.editable(:text_field, {:name => 'as_q'}, :with_words, 'with_words default value', true)
68
+ @as_form.editable(:text_field, {:name => 'as_epq'}, :with_phrase, 'with_phrase default value', true)
69
+ @as_form.editable(:text_field, {:name => 'as_oq'}, :with_any_word, 'with_any_word default value', false)
70
+ @as_form.submitter(:input, {:type => 'submit'})
71
+ end
72
+ end
73
+ class GoogleSearchPage < PageObjectWrapper::Page
74
+ attr_accessor :find_form
75
+ @url="/"
76
+ expected_element :text_field, :name => 'q' # tells Watir that we expect this element which identifies the page in a uniq way
77
+ def initialize visit=false
78
+ super visit
79
+ @find_form = form(GoogleSearchPage, {:action => '/search'})
80
+ @find_form.editable(:text_field, {:name => 'q'}, :search_what, '@find_form default value', true)
81
+ end
82
+ end
83
+ {:gsearch_page_class => GoogleSearchPage, :gadv_page_class => GoogleAdvancedSearchPage}
84
+ }
85
+
86
+ it "has #submit(flag) method which submits form
87
+ if flag = true than TargetPage instance is returned
88
+ if flag = false than CurrentPage instance is returned
89
+ if submitter is defined, than it's used to submit the form, otherwise standart Watir::Form submit is used
90
+ ", :code => 91..95 do
91
+ gadv_page = page_objects[:gadv_page_class].new(true)
92
+ gsearch_page = gadv_page.as_form.submit(true)
93
+ gsearch_page.should be_a(GoogleSearchPage)
94
+ gsearch_page_reloaded = gsearch_page.find_form.submit(false)
95
+ gsearch_page_reloaded.should be_a(GoogleSearchPage)
96
+ end
97
+
98
+ it "field's watir elements can be accessed by labels", :code => 99..100 do
99
+ gsearch_page = page_objects[:gsearch_page_class].new(true)
100
+ gsearch_page.find_form.search_what.should be_a(Watir::TextField)
101
+ end
102
+
103
+ it "fields default values set during form definition can be retrieved with #default(:label) method", :code => 104..105 do
104
+ gsearch_page = page_objects[:gsearch_page_class].new(true)
105
+ gsearch_page.find_form.default(:search_what).should eq('@find_form default value')
106
+ end
107
+
108
+ it "has #each method which allows navigating between form fields", :code => 110..112 do
109
+ gadv_page = page_objects[:gadv_page_class].new(true)
110
+ gadv_page.as_form.each{|form_field|
111
+ form_field.should be_a(Editable)
112
+ form_field.watir_element.should be_a(Watir::TextField)
113
+ }
114
+ end
115
+
116
+ it "has #each_required method which allows navigating between form required fields", :code => 118..122 do
117
+ gadv_page = page_objects[:gadv_page_class].new(true)
118
+ gadv_page.as_form.each_required{|form_field|
119
+ form_field.should be_a(Editable)
120
+ form_field.watir_element.should be_a(Watir::TextField)
121
+ form_field.should be_required
122
+ }
123
+ end
124
+
125
+ it "has #fill_only(:label => value) method which populated form's :label field with \'value\'
126
+ method returns form object
127
+ ", :code => 129..130 do
128
+ gadv_page = page_objects[:gadv_page_class].new(true)
129
+ form = gadv_page.as_form.fill_only(:with_words => 'some value')
130
+ gadv_page.as_form.with_words.value.should eq('some value')
131
+ form.should be_a(Form)
132
+ end
133
+
134
+ it "has #fill_all(:except => labels_array | label) method which populated all form's fields with default values
135
+ if except_hash is not nil than provided fields are not populated
136
+ method returns form object
137
+ ", :code => 139..142 do
138
+ gadv_page = page_objects[:gadv_page_class].new(true)
139
+ form = gadv_page.as_form.fill_all
140
+ gadv_page.as_form.each{|field|
141
+ field.watir_element.value.should eq(gadv_page.as_form.default(field.label))
142
+ }
143
+ gadv_page = page_objects[:gadv_page_class].new(true)
144
+ gadv_page.as_form.fill_all(:except => :with_words)
145
+ gadv_page.as_form.each{|field|
146
+ if field.label==:with_words
147
+ field.watir_element.value.should eq ''
148
+ else
149
+ field.watir_element.value.should eq(gadv_page.as_form.default(field.label))
150
+ end
151
+ }
152
+ form.should be_a(Form)
153
+ end
154
+
155
+ it "has #fill_required(:except => labels_array | label) method which populated all required form's fields with default values
156
+ if except_hash is not nil than provided fields are not populated
157
+ method returns form object
158
+ ", :code => 165..172 do
159
+ gadv_page = page_objects[:gadv_page_class].new(true)
160
+ form = gadv_page.as_form.fill_required
161
+ gadv_page.as_form.each_required{|field|
162
+ field.watir_element.value.should eq(gadv_page.as_form.default(field.label))
163
+ }
164
+ gadv_page = page_objects[:gadv_page_class].new(true)
165
+ gadv_page.as_form.fill_required(:except => :with_words)
166
+ gadv_page.as_form.each_required{|field|
167
+ if field.label==:with_words
168
+ field.watir_element.value.should eq ''
169
+ else
170
+ field.watir_element.value.should eq(gadv_page.as_form.default(field.label))
171
+ end
172
+ }
173
+ form.should be_a(Form)
174
+ end
175
+ end
176
+ end