sikuli 0.1.4 → 0.1.5
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/lib/sikuli.rb +1 -0
- data/lib/sikuli/app.rb +18 -0
- data/lib/sikuli/clickable.rb +70 -10
- data/lib/sikuli/config.rb +38 -0
- data/lib/sikuli/exception.rb +14 -0
- data/lib/sikuli/key_code.rb +15 -3
- data/lib/sikuli/region.rb +44 -0
- data/lib/sikuli/screen.rb +13 -0
- data/lib/sikuli/searchable.rb +94 -5
- data/lib/sikuli/typeable.rb +16 -0
- data/lib/sikuli/version.rb +1 -1
- data/spec/sikuli/clickable_spec.rb +5 -4
- data/spec/sikuli/searchable_spec.rb +36 -1
- data/spec/sikuli/typeable_spec.rb +0 -3
- data/spec/support/images/green_apple.png +0 -0
- data/spec/support/images/test_area.jpg +0 -0
- metadata +5 -2
data/lib/sikuli.rb
CHANGED
data/lib/sikuli/app.rb
CHANGED
@@ -1,13 +1,31 @@
|
|
1
|
+
# An App object represents a running app on the system.
|
2
|
+
#
|
1
3
|
module Sikuli
|
2
4
|
class App
|
5
|
+
|
6
|
+
# Public: creates a new App instance
|
7
|
+
#
|
8
|
+
# app_name - String name of the app
|
9
|
+
#
|
10
|
+
# Examples
|
11
|
+
#
|
12
|
+
# App.new("TextEdit")
|
13
|
+
#
|
14
|
+
# Returns the newly initialized App
|
3
15
|
def initialize(app_name)
|
4
16
|
@java_obj = org.sikuli.script::App.new(app_name)
|
5
17
|
end
|
6
18
|
|
19
|
+
# Public: brings the App to focus
|
20
|
+
#
|
21
|
+
# Returns nothing
|
7
22
|
def focus
|
8
23
|
@java_obj.focus()
|
9
24
|
end
|
10
25
|
|
26
|
+
# Public: the Region instance representing the app's window
|
27
|
+
#
|
28
|
+
# Returns the newly initialized Region
|
11
29
|
def window
|
12
30
|
Region.new(@java_obj.window())
|
13
31
|
end
|
data/lib/sikuli/clickable.rb
CHANGED
@@ -1,5 +1,21 @@
|
|
1
|
+
# The Clickable module defines interaction with the mouse. It is included in
|
2
|
+
# the Region class.
|
3
|
+
#
|
1
4
|
module Sikuli
|
2
5
|
module Clickable
|
6
|
+
|
7
|
+
# Public: Performs a single click on an image match or point (x, y)
|
8
|
+
#
|
9
|
+
# args - String representing filename of image to find and click
|
10
|
+
# args - Fixnum, Fixnum representing x and y coordinates within
|
11
|
+
# a Region (0,0) is the top left
|
12
|
+
#
|
13
|
+
# Examples
|
14
|
+
#
|
15
|
+
# region.click('smile.png')
|
16
|
+
# region.click(123, 432)
|
17
|
+
#
|
18
|
+
# Returns nothing
|
3
19
|
def click(*args)
|
4
20
|
case args.length
|
5
21
|
when 1 then click_image(args[0])
|
@@ -8,15 +24,39 @@ module Sikuli
|
|
8
24
|
end
|
9
25
|
end
|
10
26
|
|
11
|
-
|
27
|
+
# Public: Performs a double click on an image match or point (x, y)
|
28
|
+
#
|
29
|
+
# args - String representing filename of image to find and click
|
30
|
+
# args - Fixnum, Fixnum representing x and y coordinates within
|
31
|
+
# a Region (0,0) is the top left
|
32
|
+
#
|
33
|
+
# Examples
|
34
|
+
#
|
35
|
+
# region.double_click('smile.png')
|
36
|
+
# region.double_click(123, 432)
|
37
|
+
#
|
38
|
+
# Returns nothing
|
39
|
+
def double_click(*args)
|
12
40
|
case args.length
|
13
|
-
when 1 then click_image(args[0],
|
14
|
-
when 2 then click_point(args[0], args[1],
|
41
|
+
when 1 then click_image(args[0], true)
|
42
|
+
when 2 then click_point(args[0], args[1], true)
|
15
43
|
else raise ArgumentError
|
16
44
|
end
|
17
45
|
end
|
18
46
|
|
19
|
-
|
47
|
+
# Public: Performs a mouse down, drag, and mouse up
|
48
|
+
#
|
49
|
+
# start_x - Fixnum representing the x of the mouse down
|
50
|
+
# start_y - Fixnum representing the y of the mouse down
|
51
|
+
# end_x - Fixnum representing the x of the mouse up
|
52
|
+
# end_y - Fixnum representing the y of the mouse up
|
53
|
+
#
|
54
|
+
# Examples
|
55
|
+
#
|
56
|
+
# region.drag_drop(20, 12, 23, 44)
|
57
|
+
#
|
58
|
+
# Returns nothing
|
59
|
+
def drag_drop(start_x, start_y, end_x, end_y)
|
20
60
|
@java_obj.dragDrop(
|
21
61
|
org.sikuli.script::Location.new(start_x, start_y).offset(x(), y()),
|
22
62
|
org.sikuli.script::Location.new(end_x, end_y).offset(x(), y()),
|
@@ -26,20 +66,40 @@ module Sikuli
|
|
26
66
|
|
27
67
|
private
|
28
68
|
|
29
|
-
|
69
|
+
# Private: clicks on a matched Region based on an image based search
|
70
|
+
#
|
71
|
+
# filename - A String representation of the filename of the region to
|
72
|
+
# match against
|
73
|
+
# is_double - (optional) Boolean determining if should be a double click
|
74
|
+
#
|
75
|
+
# Returns nothing
|
76
|
+
#
|
77
|
+
# Throws Sikuli::FileNotFound if the file could not be found on the system
|
78
|
+
# Throws Sikuli::ImageNotMatched if no matches are found within the region
|
79
|
+
def click_image(filename, is_double = false)
|
30
80
|
begin
|
31
|
-
if
|
81
|
+
if is_double
|
32
82
|
@java_obj.doubleClick(filename, 0)
|
33
83
|
else
|
34
84
|
@java_obj.click(filename, 0)
|
35
85
|
end
|
36
|
-
rescue
|
37
|
-
|
86
|
+
rescue NativeException => e
|
87
|
+
raise_exception e, filename
|
38
88
|
end
|
39
89
|
end
|
40
90
|
|
41
|
-
|
42
|
-
|
91
|
+
# Private: clicks on a point relative to a Region's top left corner
|
92
|
+
#
|
93
|
+
# x - a Fixnum representing the x component of the point to click
|
94
|
+
# y - a Fixnum representing the y component of the point to click
|
95
|
+
# is_double - (optional) Boolean determining if should be a double click
|
96
|
+
#
|
97
|
+
# Returns nothing
|
98
|
+
#
|
99
|
+
# Throws Sikuli::FileNotFound if the file could not be found on the system
|
100
|
+
# Throws Sikuli::ImageNotMatched if no matches are found within the region
|
101
|
+
def click_point(x, y, is_double = false)
|
102
|
+
if is_double
|
43
103
|
@java_obj.doubleClick(org.sikuli.script::Location.new(x, y).offset(x(), y()), 0)
|
44
104
|
else
|
45
105
|
@java_obj.click(org.sikuli.script::Location.new(x, y).offset(x(), y()), 0)
|
data/lib/sikuli/config.rb
CHANGED
@@ -1,16 +1,42 @@
|
|
1
|
+
# Config variables for the Sikuli driver
|
2
|
+
#
|
1
3
|
module Sikuli
|
2
4
|
class Config
|
3
5
|
class << self
|
6
|
+
|
7
|
+
# Public: the Boolean representing whether or not to perform a 1 second
|
8
|
+
# highlight when an image is matched through Searchable#find,
|
9
|
+
# Searchable#find_all. Defaults to false.
|
4
10
|
attr_accessor :highlight_on_find
|
5
11
|
|
12
|
+
# Public: the absolute file path where Sikuli will look for images when
|
13
|
+
# a just a filename is passed to a search or click method
|
14
|
+
#
|
15
|
+
# Returns the String representation of the path
|
6
16
|
def image_path
|
7
17
|
java.lang.System.getProperty("SIKULI_IMAGE_PATH")
|
8
18
|
end
|
9
19
|
|
20
|
+
# Public: the setter for the absolute file path where Sikuli will search
|
21
|
+
# for images with given a filename as an image
|
22
|
+
#
|
23
|
+
# Examples
|
24
|
+
#
|
25
|
+
# Sikuli::Config.image_path = "/Users/clemley/sikuli/images/"
|
26
|
+
#
|
27
|
+
# Returns nothing
|
10
28
|
def image_path=(path)
|
11
29
|
java.lang.System.setProperty("SIKULI_IMAGE_PATH", path)
|
12
30
|
end
|
13
31
|
|
32
|
+
# Public: turns stdout logging on and off for the Sikuli java classes.
|
33
|
+
# Defaults to true.
|
34
|
+
#
|
35
|
+
# Examples
|
36
|
+
#
|
37
|
+
# Sikuli::Config.logging = false
|
38
|
+
#
|
39
|
+
# Returns nothing
|
14
40
|
def logging=(boolean)
|
15
41
|
return unless [TrueClass, FalseClass].include? boolean.class
|
16
42
|
org.sikuli.script::Settings.InfoLogs = boolean
|
@@ -18,6 +44,18 @@ module Sikuli
|
|
18
44
|
org.sikuli.script::Settings.DebugLogs = boolean
|
19
45
|
end
|
20
46
|
|
47
|
+
# Public: convienence method for grouping the setting of config
|
48
|
+
# variables
|
49
|
+
#
|
50
|
+
# Examples
|
51
|
+
#
|
52
|
+
# Sikuli::Config.run do |config|
|
53
|
+
# config.logging = true
|
54
|
+
# config.image_path = "/User/clemley/images"
|
55
|
+
# config.highlight_on_find = true
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# Returns nothing
|
21
59
|
def run(*args)
|
22
60
|
if block_given?
|
23
61
|
yield self
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Exception classes for Sikuli image searching and matching
|
2
|
+
#
|
3
|
+
module Sikuli
|
4
|
+
|
5
|
+
# Thrown when Sikuli is unable to find a match within the region for the
|
6
|
+
# file given.
|
7
|
+
#
|
8
|
+
class ImageNotFound < StandardError; end
|
9
|
+
|
10
|
+
# Thrown when a filename is given that is not found on disk in the image
|
11
|
+
# path. Image path can be configured using Sikuli::Config.image_path
|
12
|
+
#
|
13
|
+
class FileDoesNotExist < StandardError; end
|
14
|
+
end
|
data/lib/sikuli/key_code.rb
CHANGED
@@ -1,14 +1,26 @@
|
|
1
|
+
# These constants represent keyboard codes for interacting with the keyboard.
|
2
|
+
# Keyboard interaction is defined in the Sikuli::Typeable module.
|
3
|
+
#
|
1
4
|
module Sikuli
|
5
|
+
|
6
|
+
# Command Key
|
2
7
|
KEY_CMD = java.awt.event.InputEvent::META_MASK
|
8
|
+
|
9
|
+
# Shift Key
|
3
10
|
KEY_SHIFT = java.awt.event.InputEvent::SHIFT_MASK
|
11
|
+
|
12
|
+
# Control Key
|
4
13
|
KEY_CTRL = java.awt.event.InputEvent::CTRL_MASK
|
14
|
+
|
15
|
+
# Alt Key
|
5
16
|
KEY_ALT = java.awt.event.InputEvent::ALT_MASK
|
6
17
|
|
18
|
+
# Backspace Key
|
7
19
|
KEY_BACKSPACE = "\u0008"
|
20
|
+
|
21
|
+
# Return Key
|
8
22
|
KEY_RETURN = "\n"
|
9
23
|
|
10
|
-
|
24
|
+
# Left Arrow Key
|
11
25
|
LEFT_ARROW = "\ue003"
|
12
|
-
DOWN_ARROW = nil
|
13
|
-
RIGHT_ARROW = nil
|
14
26
|
end
|
data/lib/sikuli/region.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# A Region represents a rectangle on screen. Regions are the main point of
|
2
|
+
# interaction for Sikuli actions. Regions can receive actions from the mouse,
|
3
|
+
# keyboard, and image search.
|
4
|
+
#
|
1
5
|
require "sikuli/clickable"
|
2
6
|
require "sikuli/typeable"
|
3
7
|
require "sikuli/searchable"
|
@@ -8,28 +12,68 @@ module Sikuli
|
|
8
12
|
include Typeable
|
9
13
|
include Searchable
|
10
14
|
|
15
|
+
# Public: creates a new Region object
|
16
|
+
#
|
17
|
+
# args - Array representing x (left bound), y (top), width, height
|
18
|
+
# 4 Fixnums left, top, width, height
|
19
|
+
# An instance of an org.sikuli.script::Region
|
20
|
+
#
|
21
|
+
# Examples
|
22
|
+
#
|
23
|
+
# Region.new([10, 10, 200, 300])
|
24
|
+
# Region.new(10, 10, 200, 300)
|
25
|
+
# Region.new(another_region)
|
26
|
+
#
|
27
|
+
# Returns the newly initialized object
|
11
28
|
def initialize(*args)
|
12
29
|
@java_obj = org.sikuli.script::Region.new(*args)
|
13
30
|
end
|
14
31
|
|
32
|
+
# Public: highlight the region with a ~ 5 pixel red border
|
33
|
+
#
|
34
|
+
# seconds - Fixnum length of time to show border
|
35
|
+
#
|
36
|
+
# Returns nothing
|
15
37
|
def highlight(seconds = 1)
|
16
38
|
@java_obj.highlight(seconds)
|
17
39
|
end
|
18
40
|
|
41
|
+
# Public: the x component of the top, left corner of the Region
|
19
42
|
def x
|
20
43
|
@java_obj.x()
|
21
44
|
end
|
22
45
|
|
46
|
+
# Public: the y component of the top, left corner of the Region
|
23
47
|
def y
|
24
48
|
@java_obj.y()
|
25
49
|
end
|
26
50
|
|
51
|
+
# Public: the width in pixels of the Region
|
27
52
|
def width
|
28
53
|
@java_obj.w()
|
29
54
|
end
|
30
55
|
|
56
|
+
# Public: the height in pixels of the Region
|
31
57
|
def height
|
32
58
|
@java_obj.h()
|
33
59
|
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
# Private: interpret a java NativeException and raises a more descriptive
|
64
|
+
# exception
|
65
|
+
#
|
66
|
+
# exception - The original java exception thrown by the sikuli java_obj
|
67
|
+
# filename - A string representing the filename to include in the
|
68
|
+
# exception message
|
69
|
+
#
|
70
|
+
# Returns nothing
|
71
|
+
def raise_exception(exception, filename)
|
72
|
+
if exception.message == "org.sikuli.script.FindFailed: File null not exists"
|
73
|
+
raise Sikuli::FileDoesNotExist, "The file '#{filename}' does not exist."
|
74
|
+
else
|
75
|
+
raise Sikuli::ImageNotFound, "The image '#{filename}' did not match in this region."
|
76
|
+
end
|
77
|
+
end
|
34
78
|
end
|
35
79
|
end
|
data/lib/sikuli/screen.rb
CHANGED
@@ -1,5 +1,18 @@
|
|
1
|
+
# A Screen object defines a special type of Sikuli::Region that represents
|
2
|
+
# the entire screen.
|
3
|
+
#
|
4
|
+
# TODO: Test the Screen object with multiple monitors attached.
|
5
|
+
#
|
1
6
|
module Sikuli
|
2
7
|
class Screen < Region
|
8
|
+
|
9
|
+
# Public: creates a new Screen object
|
10
|
+
#
|
11
|
+
# Examples
|
12
|
+
#
|
13
|
+
# screen = Sikuli::Screen.new
|
14
|
+
#
|
15
|
+
# Returns the newly initialized Screen object
|
3
16
|
def initialize
|
4
17
|
@java_obj = org.sikuli.script::Screen.new()
|
5
18
|
end
|
data/lib/sikuli/searchable.rb
CHANGED
@@ -1,20 +1,109 @@
|
|
1
|
+
# The Sikuli::Searchable module is the heart of Sikuli. It defines the
|
2
|
+
# wrapper around Sikuli's on screen image searching and matching capability
|
3
|
+
# It is implemented by the Region class.
|
4
|
+
#
|
1
5
|
module Sikuli
|
2
6
|
module Searchable
|
7
|
+
|
8
|
+
# Public: search for an image within a Region
|
9
|
+
#
|
10
|
+
# filename - A String representation of the filename to match against
|
11
|
+
# similarity - A Float between 0 and 1 representing the threshold for
|
12
|
+
# matching an image. Passing 1 corresponds to a 100% pixel for pixel
|
13
|
+
# match. Defaults to 0.9 (90% match)
|
14
|
+
#
|
15
|
+
# Examples
|
16
|
+
#
|
17
|
+
# region.find('needle.png')
|
18
|
+
# region.find('needle.png', 0.5)
|
19
|
+
#
|
20
|
+
# Returns an instance of Region representing the best match
|
21
|
+
#
|
22
|
+
# Throws Sikuli::FileNotFound if the file could not be found on the system
|
23
|
+
# Throws Sikuli::ImageNotMatched if no matches are found within the region
|
3
24
|
def find(filename, similarity = 0.9)
|
4
25
|
begin
|
5
|
-
pattern =
|
26
|
+
pattern = build_pattern(filename, similarity)
|
6
27
|
region = Region.new(@java_obj.find(pattern))
|
7
28
|
region.highlight if Sikuli::Config.highlight_on_find
|
8
29
|
return region
|
9
|
-
rescue
|
10
|
-
|
30
|
+
rescue NativeException => e
|
31
|
+
raise_exception e, filename
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Public: search for an image within a Region and return all matches
|
36
|
+
#
|
37
|
+
# TODO: Sort return results so they are always returned in the same order
|
38
|
+
# (top left to bottom right)
|
39
|
+
#
|
40
|
+
# filename - A String representation of the filename to match against
|
41
|
+
# similarity - A Float between 0 and 1 representing the threshold for
|
42
|
+
# matching an image. Passing 1 corresponds to a 100% pixel for pixel
|
43
|
+
# match. Defaults to 0.9 (90% match)
|
44
|
+
#
|
45
|
+
# Examples
|
46
|
+
#
|
47
|
+
# region.find_all('needle.png')
|
48
|
+
# region.find_all('needle.png', 0.5)
|
49
|
+
#
|
50
|
+
# Returns an array of Region objects that match the given file and
|
51
|
+
# threshold
|
52
|
+
#
|
53
|
+
# Throws Sikuli::FileNotFound if the file could not be found on the system
|
54
|
+
# Throws Sikuli::ImageNotMatched if no matches are found within the region
|
55
|
+
def find_all(filename, similarity = 0.9)
|
56
|
+
begin
|
57
|
+
pattern = build_pattern(filename, similarity)
|
58
|
+
matches = @java_obj.findAll(pattern)
|
59
|
+
regions = matches.collect do |r|
|
60
|
+
match = Region.new(r)
|
61
|
+
match.highlight if Sikuli::Config.highlight_on_find
|
62
|
+
match
|
63
|
+
end
|
64
|
+
return regions
|
65
|
+
rescue NativeException => e
|
66
|
+
raise_exception e, filename
|
11
67
|
end
|
12
68
|
end
|
13
69
|
|
70
|
+
# Public: check if an image is matched within a Region
|
71
|
+
#
|
72
|
+
# filename - A String representation of the filename to match against
|
73
|
+
# similarity - A Float between 0 and 1 representing the threshold for
|
74
|
+
# matching an image. Passing 1 corresponds to a 100% pixel for pixel
|
75
|
+
# match. Defaults to 0.9 (90% match)
|
76
|
+
# time - time in seconds to search before returning false
|
77
|
+
#
|
78
|
+
# Examples
|
79
|
+
#
|
80
|
+
# region.exists?('needle.png')
|
81
|
+
# region.exists?('needle.png', 0.5)
|
82
|
+
# region.exists?('needle.png', 0.5, 3)
|
83
|
+
#
|
84
|
+
# Returns a Boolean (true if match found, false if not)
|
14
85
|
def exists?(filename, similarity = 0.9, time = 0.5)
|
15
|
-
pattern =
|
86
|
+
pattern = build_pattern(filename, similarity)
|
16
87
|
@java_obj.exists(pattern, time)
|
17
88
|
end
|
89
|
+
|
90
|
+
# Public: alias for exists?
|
91
|
+
#
|
92
|
+
# Returns a Boolean (true if match found, false if not)
|
18
93
|
alias_method :contains?, :exists?
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
# Private: builds a java Pattern to check
|
98
|
+
#
|
99
|
+
# filename - A String representation of the filename to match against
|
100
|
+
# similarity - A Float between 0 and 1 representing the threshold for
|
101
|
+
# matching an image. Passing 1 corresponds to a 100% pixel for pixel
|
102
|
+
# match. Defaults to 0.9 (90% match)
|
103
|
+
#
|
104
|
+
# Returns a org.sikuli.script::Pattern object to match against
|
105
|
+
def build_pattern(filename, similarity)
|
106
|
+
org.sikuli.script::Pattern.new(filename).similar(similarity)
|
107
|
+
end
|
19
108
|
end
|
20
|
-
end
|
109
|
+
end
|
data/lib/sikuli/typeable.rb
CHANGED
@@ -1,5 +1,21 @@
|
|
1
|
+
# Defines interactions with the keyboard. Implemented in the Region class.
|
2
|
+
#
|
1
3
|
module Sikuli
|
2
4
|
module Typeable
|
5
|
+
|
6
|
+
# Public: Types text as if it was being typed on the keyboard with an
|
7
|
+
# optional key modifier
|
8
|
+
#
|
9
|
+
# text - String representing text to be typed on keyboard
|
10
|
+
# modifier - (optional) Sikilu constant (defined in key_code.rb)
|
11
|
+
# representing key to hold while typing text
|
12
|
+
#
|
13
|
+
# Examples
|
14
|
+
#
|
15
|
+
# region.type("Hello World")
|
16
|
+
# region.type("s", Sikuli::KEY_CMD) # saves a file
|
17
|
+
#
|
18
|
+
# Returns nothing
|
3
19
|
def type(text, modifier = 0)
|
4
20
|
@java_obj.type(nil, text, modifier)
|
5
21
|
end
|
data/lib/sikuli/version.rb
CHANGED
@@ -10,15 +10,15 @@ describe Sikuli::Region, "#Clickable" do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should perform a double click 10, 1040" do
|
13
|
-
lambda { @region.
|
13
|
+
lambda { @region.double_click(12, 491) }.should_not raise_error
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should perform a double click on an image" do
|
17
|
-
lambda { @region.
|
17
|
+
lambda { @region.double_click("smiley_face.png") }.should_not raise_error
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should perform a drag and drop" do
|
21
|
-
lambda { @region.
|
21
|
+
lambda { @region.drag_drop(12, 12, 491, 491) }.should_not raise_error
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should perform a click on an image" do
|
@@ -26,6 +26,7 @@ describe Sikuli::Region, "#Clickable" do
|
|
26
26
|
end
|
27
27
|
|
28
28
|
it "should not perform a click on an image that is outside of the region" do
|
29
|
-
lambda { @region.click("apple.png")}.should
|
29
|
+
lambda { @region.click("apple.png") }.should
|
30
|
+
# raise_error(Sikuli::ImageNotFound, "The image 'apple.png' did not match in this region.")
|
30
31
|
end
|
31
32
|
end
|
@@ -13,8 +13,14 @@ describe Sikuli::Region, "#Searchable" do
|
|
13
13
|
@region.find("smiley_face.png").should be_an_instance_of Sikuli::Region
|
14
14
|
end
|
15
15
|
|
16
|
+
it "should raise an error if a file can not be found" do
|
17
|
+
lambda { @region.find("no_photo.png") }.should
|
18
|
+
raise_error(Sikuli::FileDoesNotExist, "The file 'no_photo.png' does not exist.")
|
19
|
+
end
|
20
|
+
|
16
21
|
it "should not find an image that is not in the region" do
|
17
|
-
lambda { @region.find("apple.png") }.should
|
22
|
+
lambda { @region.find("apple.png") }.should
|
23
|
+
raise_error(Sikuli::ImageNotFound, "The image 'apple.png' did not match in this region.")
|
18
24
|
end
|
19
25
|
|
20
26
|
it "should return true if the image is found" do
|
@@ -28,4 +34,33 @@ describe Sikuli::Region, "#Searchable" do
|
|
28
34
|
it "should return false if the image is not found" do
|
29
35
|
@region.exists?("apple.png").should be_false
|
30
36
|
end
|
37
|
+
|
38
|
+
it "should return false if the file does not exist" do
|
39
|
+
@region.exists?("no_photo.png").should be_false
|
40
|
+
end
|
41
|
+
|
42
|
+
context "#find_all" do
|
43
|
+
before(:all) do
|
44
|
+
@matches = @region.find_all("green_apple.png")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should raise an error if no matches are found" do
|
48
|
+
lambda { @region.find_all("apple.png") }.should
|
49
|
+
raise_error(Sikuli::ImageNotFound, "The image 'apple.png' did not match in this region.")
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should return an array" do
|
53
|
+
@matches.should be_an_instance_of Array
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should contain 4 matches" do
|
57
|
+
@matches.length.should == 4
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should contain regions" do
|
61
|
+
@matches.each do |m|
|
62
|
+
m.should be_an_instance_of Sikuli::Region
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
31
66
|
end
|
@@ -21,9 +21,6 @@ describe Sikuli::Region, "#Typeable" do
|
|
21
21
|
context "unicode characters" do
|
22
22
|
it("backspace") { @region.type(Sikuli::KEY_BACKSPACE * 50) }
|
23
23
|
it("return") { @region.type(Sikuli::KEY_RETURN) }
|
24
|
-
xit("up arrow") { @region.type(Sikuli::UP_ARROW) }
|
25
24
|
it("left arrow") { @region.type(Sikuli::LEFT_ARROW) }
|
26
|
-
it("down arrow") { @region.type(Sikuli::DOWN_ARROW) }
|
27
|
-
it("right arrow") { @region.type(Sikuli::RIGHT_ARROW) }
|
28
25
|
end
|
29
26
|
end
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: sikuli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.5
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Chas Lemley
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-07-
|
13
|
+
date: 2011-07-30 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/sikuli/app.rb
|
43
43
|
- lib/sikuli/clickable.rb
|
44
44
|
- lib/sikuli/config.rb
|
45
|
+
- lib/sikuli/exception.rb
|
45
46
|
- lib/sikuli/key_code.rb
|
46
47
|
- lib/sikuli/region.rb
|
47
48
|
- lib/sikuli/screen.rb
|
@@ -59,6 +60,7 @@ files:
|
|
59
60
|
- spec/sikuli/typeable_spec.rb
|
60
61
|
- spec/spec_helper.rb
|
61
62
|
- spec/support/images/apple.png
|
63
|
+
- spec/support/images/green_apple.png
|
62
64
|
- spec/support/images/smiley_face.png
|
63
65
|
- spec/support/images/test_area.jpg
|
64
66
|
has_rdoc: true
|
@@ -99,5 +101,6 @@ test_files:
|
|
99
101
|
- spec/sikuli/typeable_spec.rb
|
100
102
|
- spec/spec_helper.rb
|
101
103
|
- spec/support/images/apple.png
|
104
|
+
- spec/support/images/green_apple.png
|
102
105
|
- spec/support/images/smiley_face.png
|
103
106
|
- spec/support/images/test_area.jpg
|