prickle 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc CHANGED
@@ -4,7 +4,7 @@
4
4
  # development environment upon cd'ing into the directory
5
5
 
6
6
  # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
7
- environment_id="ruby-1.9.2-p180@prickle"
7
+ environment_id="ruby-1.9.3-p0@prickle"
8
8
 
9
9
  #
10
10
  # Uncomment following line if you want options to be set only for given project.
data/README.md CHANGED
@@ -12,7 +12,7 @@ To install prickle execute
12
12
  gem install prickle
13
13
  ```
14
14
 
15
- and to configure update your *features/support/env.rb* to include the following:
15
+ Configure by updating the *features/support/env.rb* to include the following:
16
16
 
17
17
  ```ruby
18
18
  require 'prickle/capybara' # require
@@ -65,6 +65,7 @@ element(:input, :name => "blue")
65
65
  element(:name => "flower").exists?
66
66
  element(:name => "flower").click
67
67
  element(:name => "flower").contains_text? "Roses"
68
+ element(:name => "flower").has_text? "Anemone" # exact match
68
69
  ```
69
70
 
70
71
  ## Alternative syntax
@@ -101,6 +102,12 @@ popup_message_contains? "<text>"
101
102
 
102
103
  ## Capturing screenshots
103
104
 
105
+ Configure the directory where you want the screenshots to be saved
106
+
107
+ ```ruby
108
+ Prickle::Capybara.image_dir = File.dirname(__FILE__) + "/screenshots/"
109
+ ```
110
+
104
111
  ```ruby
105
112
  capture_screen
106
113
  capture_screen "<file>"
@@ -8,6 +8,13 @@ module Prickle
8
8
 
9
9
  def contains_text? text
10
10
  @text = text
11
+ @identifier[:"text()".like] = text
12
+ find_element
13
+ end
14
+
15
+ def has_text? text
16
+ @text = text
17
+ @identifier[:"text()"] = text
11
18
  find_element
12
19
  end
13
20
 
@@ -1,4 +1,5 @@
1
1
  require 'capybara/dsl'
2
+ require_relative 'xpath'
2
3
  require_relative 'actions'
3
4
 
4
5
  module Prickle
@@ -21,20 +22,10 @@ module Prickle
21
22
  end
22
23
 
23
24
  def identifier
24
- @identifier.each_pair.inject([]) do |xpath_str, (key, value)|
25
- xpath_str << convert_to_xpath(key, value)
26
- end.join " and "
25
+ @identifier
27
26
  end
28
27
 
29
- def convert_to_xpath key, value
30
- if key.to_s.include? "<value>"
31
- key.sub "<value>", value
32
- else
33
- "@#{key}='#{value}'"
34
- end
35
- end
36
-
37
- def type
28
+ def type_as_tag
38
29
  CONVERTED_TYPES[@type.to_sym] || @type
39
30
  end
40
31
 
@@ -42,18 +33,16 @@ module Prickle
42
33
  handle_exception { find_element_by_xpath }
43
34
  end
44
35
 
45
- def xpath
46
- xpath = "//#{type}[#{identifier}"
47
- xpath << " and contains(text(), '#{@text}')" if @text
48
- xpath << "]"
49
- end
50
-
51
36
  def find_element_by_xpath
52
- wait_until(Prickle::Capybara.wait_time) do
37
+ wait_until(Capybara.wait_time) do
53
38
  find(:xpath, xpath).visible?
54
- end unless Prickle::Capybara.wait_time.nil?
39
+ end unless Capybara.wait_time.nil?
40
+
41
+ find :xpath, xpath
42
+ end
55
43
 
56
- find(:xpath, xpath)
44
+ def xpath
45
+ XPath::for_element_with type_as_tag, identifier
57
46
  end
58
47
 
59
48
  def handle_exception &block
@@ -0,0 +1,61 @@
1
+ module Prickle
2
+ module Capybara
3
+ module XPath
4
+
5
+ class Expression
6
+ CONTAINS = ".like"
7
+ TEXT_IDENTIFIER = "text()"
8
+ SEPARATOR = " and "
9
+
10
+ def initialize identifier, value
11
+ @identifier = identifier
12
+ @value = value
13
+ end
14
+
15
+ def to_s
16
+ find_exact_match? ? MatchesValue.new(@identifier, @value).to_s : ContainsValue.new(@identifier, @value).to_s
17
+ end
18
+
19
+ private
20
+
21
+ def find_exact_match?
22
+ !identifier.include? CONTAINS
23
+ end
24
+
25
+ def identifier
26
+ @identifier.to_s
27
+ end
28
+
29
+ def attribute
30
+ return identifier if identifier.eql? TEXT_IDENTIFIER
31
+ "@#{identifier}"
32
+ end
33
+ end
34
+
35
+
36
+ class ContainsValue < XPath::Expression
37
+
38
+ def to_s
39
+ "contains(#{attribute}, '#{@value}')"
40
+ end
41
+
42
+ private
43
+
44
+ def identifier
45
+ @identifier.chomp CONTAINS
46
+ end
47
+ end
48
+
49
+
50
+ class MatchesValue < XPath::Expression
51
+
52
+ def to_s
53
+ "#{attribute}='#{@value}'"
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+ end
61
+
@@ -0,0 +1,33 @@
1
+ require_relative 'xpath/expression'
2
+ module Prickle
3
+ module Capybara
4
+ module XPath
5
+
6
+ def self.for_element_with type, identifier
7
+ XPath::Element.new(type,identifier).to_s
8
+ end
9
+
10
+ private
11
+
12
+ class Element
13
+
14
+ def initialize type, identifier
15
+ @type = type
16
+ @identifier = identifier
17
+ end
18
+
19
+ def to_s
20
+ "//#{@type}[#{identifier}]"
21
+ end
22
+
23
+ def identifier
24
+ return @identifier.each_pair.inject([]) do | xpath, (identifier, value) |
25
+ xpath << XPath::Expression.new(identifier, value).to_s
26
+ end.join Expression::SEPARATOR
27
+ end
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+
@@ -10,10 +10,6 @@ module Prickle
10
10
 
11
11
  end
12
12
 
13
- def capture_screen name=screenshot_name
14
- page.driver.browser.save_screenshot Capybara.image_dir + name + ".jpg"
15
- end
16
-
17
13
  def click_by_name name
18
14
  find_by_name(name).click
19
15
  end
@@ -42,6 +38,10 @@ module Prickle
42
38
  raise Exceptions::MessageNotContainedInPopup.new(message) unless popup_message.eql? message
43
39
  end
44
40
 
41
+ def capture_screen name=screenshot_name
42
+ page.driver.browser.save_screenshot Capybara.image_dir + name + ".jpg"
43
+ end
44
+
45
45
  private
46
46
 
47
47
  TIME_FORMATTER = "%Y%m%d-%H.%M.%s"
@@ -61,7 +61,5 @@ module Prickle
61
61
  def screenshot_name
62
62
  Time.now.strftime(TIME_FORMATTER)
63
63
  end
64
-
65
64
  end
66
-
67
65
  end
@@ -1,6 +1,6 @@
1
1
  class Symbol
2
2
 
3
3
  def like
4
- "contains(@#{self.to_s}, '<value>')"
4
+ "#{self}.like"
5
5
  end
6
6
  end
@@ -1,3 +1,3 @@
1
1
  module Prickle
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
data/spec/element_spec.rb CHANGED
@@ -11,40 +11,59 @@ describe Prickle::Capybara::Element do
11
11
  prickly.element(:name => 'blue').class.to_s.should == "Prickle::Capybara::Element"
12
12
  end
13
13
 
14
- it 'can find an element by a string contained in its identifier' do
15
- prickly.element(:name.like => 'purpli').contains_text? "erm"
16
- end
14
+ context "Matchers" do
17
15
 
18
- it 'can find an element by a contained and an exact match in its identifier' do
19
- prickly.element(:name.like => 'purpli', :id => 'one').contains_text? "erm"
20
- end
16
+ it 'can match text in an element' do
17
+ prickly.element(:name => 'yellow').contains_text? "Hello!"
18
+ end
21
19
 
22
- it 'can match text in an element' do
23
- prickly.element(:name => 'yellow').contains_text? "Hello!"
24
- end
20
+ it 'can match on link type elements' do
21
+ prickly.element(:link, :name => 'orangey').contains_text? "Me too!"
22
+ end
25
23
 
26
- it 'can match text in specific elements' do
27
- prickly.element(:li, :name => 'purple').contains_text? "Im not purple!"
28
- end
24
+ it 'can find and click on element by type and identifier' do
25
+ prickly.element(:link, :href => 'http://google.com').exists?
26
+ end
27
+
28
+ it 'can find an element by multiple identifiers' do
29
+ prickly.element(:name => 'orangey', :class => 'pink').contains_text? "Blue hippos"
30
+ end
31
+
32
+ it 'can find an element by a string contained in its identifier' do
33
+ prickly.element(:name.like => 'purpli').contains_text? "erm"
34
+ end
35
+
36
+ it 'can find an element by a contained and an exact match in its identifier' do
37
+ prickly.element(:name.like => 'purpli', :id => 'one').contains_text? "erm"
38
+ end
29
39
 
30
- it 'can match on link type elements' do
31
- prickly.element(:link, :name => 'orangey').contains_text? "Me too!"
32
40
  end
33
41
 
34
- it 'can click specific element types by name' do
35
- prickly.element(:paragraph, :name => 'yellow').click
42
+ context "#click" do
43
+
44
+ it 'can click specific element types by name' do
45
+ prickly.element(:paragraph, :name => 'yellow').click
46
+ end
36
47
  end
37
48
 
38
- it 'can find an element by type and identifier' do
39
- prickly.element(:paragraph, :id => 'coffee').exists?
49
+ context "#contains_text" do
50
+
51
+ it 'can check if text is included in an element' do
52
+ prickly.element(:li, :name => 'purple').contains_text? "Im not purple!"
53
+ end
40
54
  end
41
55
 
42
- it 'can find and click on element by type and identifier' do
43
- prickly.element(:link, :href => 'http://google.com').click
56
+ context "#has_text?" do
57
+
58
+ it "can match the text in an element" do
59
+ prickly.element(:name => 'gum').has_text? "bubblegum"
60
+ end
44
61
  end
45
62
 
46
- it 'can find an element by multiple identifiers' do
47
- prickly.element(:name => 'orangey', :class => 'pink').contains_text? "Blue hippos"
63
+ context "#exists?" do
64
+
65
+ it 'can find an element by type and identifier' do
66
+ prickly.element(:paragraph, :id => 'coffee').exists?
67
+ end
48
68
  end
49
69
  end
50
-
data/spec/stub/index.html CHANGED
@@ -23,7 +23,8 @@
23
23
  <button name="popups" onclick="alert('Hello');">erm</button>
24
24
 
25
25
  <button name="confirm_box" onclick="if(!confirm('Click yes to continue'))alert('Aborting.');">erm</button>
26
- <button name="purplish" id="one" >erm</button>
26
+ <button name="purplish" id="one">erms</button>
27
+ <p name="gum">bubblegum</p>
27
28
 
28
29
  <script>
29
30
  $(document).ready(function() {
metadata CHANGED
@@ -1,93 +1,88 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: prickle
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
4
5
  prerelease:
5
- version: 0.0.4
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Despo Pentara
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2012-02-12 00:00:00 +00:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2012-02-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: capybara
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70174028443700 !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
24
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
25
22
  type: :runtime
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: capybara
29
23
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70174028443700
25
+ - !ruby/object:Gem::Dependency
26
+ name: capybara
27
+ requirement: &70174028443100 !ruby/object:Gem::Requirement
31
28
  none: false
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
36
33
  type: :development
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
39
- name: rspec
40
34
  prerelease: false
41
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *70174028443100
36
+ - !ruby/object:Gem::Dependency
37
+ name: rspec
38
+ requirement: &70174028442480 !ruby/object:Gem::Requirement
42
39
  none: false
43
- requirements:
40
+ requirements:
44
41
  - - ~>
45
- - !ruby/object:Gem::Version
42
+ - !ruby/object:Gem::Version
46
43
  version: 2.8.0
47
44
  type: :development
48
- version_requirements: *id003
49
- - !ruby/object:Gem::Dependency
50
- name: sinatra
51
45
  prerelease: false
52
- requirement: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *70174028442480
47
+ - !ruby/object:Gem::Dependency
48
+ name: sinatra
49
+ requirement: &70174028441920 !ruby/object:Gem::Requirement
53
50
  none: false
54
- requirements:
51
+ requirements:
55
52
  - - ~>
56
- - !ruby/object:Gem::Version
53
+ - !ruby/object:Gem::Version
57
54
  version: 1.3.2
58
55
  type: :development
59
- version_requirements: *id004
60
- - !ruby/object:Gem::Dependency
61
- name: rake
62
56
  prerelease: false
63
- requirement: &id005 !ruby/object:Gem::Requirement
57
+ version_requirements: *70174028441920
58
+ - !ruby/object:Gem::Dependency
59
+ name: rake
60
+ requirement: &70174028441480 !ruby/object:Gem::Requirement
64
61
  none: false
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: "0"
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
69
66
  type: :development
70
- version_requirements: *id005
71
- - !ruby/object:Gem::Dependency
72
- name: reek
73
67
  prerelease: false
74
- requirement: &id006 !ruby/object:Gem::Requirement
68
+ version_requirements: *70174028441480
69
+ - !ruby/object:Gem::Dependency
70
+ name: reek
71
+ requirement: &70174028440740 !ruby/object:Gem::Requirement
75
72
  none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- version: "0"
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
80
77
  type: :development
81
- version_requirements: *id006
78
+ prerelease: false
79
+ version_requirements: *70174028440740
82
80
  description: A simple DSL extending Capybara.
83
81
  email: despo@extractmethod.com
84
82
  executables: []
85
-
86
83
  extensions: []
87
-
88
84
  extra_rdoc_files: []
89
-
90
- files:
85
+ files:
91
86
  - .gitignore
92
87
  - .rspec
93
88
  - .rvmrc
@@ -98,6 +93,8 @@ files:
98
93
  - lib/prickle/capybara.rb
99
94
  - lib/prickle/capybara/actions.rb
100
95
  - lib/prickle/capybara/element.rb
96
+ - lib/prickle/capybara/xpath.rb
97
+ - lib/prickle/capybara/xpath/expression.rb
101
98
  - lib/prickle/core_ext/symbol.rb
102
99
  - lib/prickle/exceptions.rb
103
100
  - lib/prickle/exceptions/messages.rb
@@ -112,33 +109,29 @@ files:
112
109
  - spec/stub/app.rb
113
110
  - spec/stub/index.html
114
111
  - spec/tmp/.keep_me
115
- has_rdoc: true
116
112
  homepage: https://github.com/ExtractMethod/prickle
117
- licenses:
113
+ licenses:
118
114
  - MIT
119
115
  post_install_message:
120
116
  rdoc_options: []
121
-
122
- require_paths:
117
+ require_paths:
123
118
  - lib
124
- required_ruby_version: !ruby/object:Gem::Requirement
119
+ required_ruby_version: !ruby/object:Gem::Requirement
125
120
  none: false
126
- requirements:
127
- - - ">="
128
- - !ruby/object:Gem::Version
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
129
124
  version: 1.9.2
130
- required_rubygems_version: !ruby/object:Gem::Requirement
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
131
126
  none: false
132
- requirements:
133
- - - ">="
134
- - !ruby/object:Gem::Version
135
- version: "0"
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
136
131
  requirements: []
137
-
138
132
  rubyforge_project:
139
- rubygems_version: 1.5.2
133
+ rubygems_version: 1.8.10
140
134
  signing_key:
141
135
  specification_version: 3
142
136
  summary: A simple DSL extending Capybara.
143
137
  test_files: []
144
-