Slide 1

Slide 1 text

(^o^)

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Automatin interface testin with JRuby e Sikuli UI (^o^) ( bјct ab 3)

Slide 4

Slide 4 text

@caffo http://rodri ofranco.com/ @caffo

Slide 5

Slide 5 text

i apolo ize

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

no spanish, just brazilian portu uese :-)

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

slow down, dammit!

Slide 15

Slide 15 text

What is an interface test?

Slide 16

Slide 16 text

“interface testin is the process of testin a product's user interface to ensure it meets its written specifications.” http://en.wikipedia.or /wiki/Graphical_user_interface_testin

Slide 17

Slide 17 text

- unit testin - inte ration testin

Slide 18

Slide 18 text

TestUnit rSpec Cucumber - unit testin - inte ration testin

Slide 19

Slide 19 text

interfaces are complex

Slide 20

Slide 20 text

Capybara Web Form DSL

Slide 21

Slide 21 text

Selenium / Watir WebDriver

Slide 22

Slide 22 text

interface testin == manual

Slide 23

Slide 23 text

be able to see

Slide 24

Slide 24 text

Project Sikuli http://sikuli.or

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

.rb ?

Slide 29

Slide 29 text

.rb ? .applescript ?

Slide 30

Slide 30 text

.rb ? .applescript ? .brainf#ck ?

Slide 31

Slide 31 text

Empty the ***** trashcan!

Slide 32

Slide 32 text

Project Sikuli http://sikuli.or

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

et back to the topic, shall we?

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

http://jruby.or

Slide 41

Slide 41 text

Creatin a Diablo 3 bot and pwnin your friends by showin off your superior intelect and amazin codin skills

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

banned :(

Slide 44

Slide 44 text

Diablo Runs

Slide 45

Slide 45 text

Cellar Run

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

No content

Slide 58

Slide 58 text

slow down, dammit!

Slide 59

Slide 59 text

in sum

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

exit

Slide 66

Slide 66 text

(^o^)/

Slide 67

Slide 67 text

1 - initializin the bot 2 - clickin at fixed points 3 - auto-movement 4 - findin the cellar 5 - restartin the run 6 - creatin lo s 7 - enterin the cellar 8 - attackin the demons 9 - ettin the old today’s menu

Slide 68

Slide 68 text

initializin the bot step 1 of 9

Slide 69

Slide 69 text

require 'rubygems' require 'java'

Slide 70

Slide 70 text

$CLASSPATH << "~/Sikuli-IDE.app/Contents/Resources/Java/" install packa e available at http://sikuli.or

Slide 71

Slide 71 text

require "sikuli-script.jar"

Slide 72

Slide 72 text

java_import 'org.sikuli.script.Region' java_import 'org.sikuli.script.Screen' java_import 'org.sikuli.script.Settings' java_import 'org.sikuli.script.SikuliEvent' java_import 'org.sikuli.script.SikuliScript'

Slide 73

Slide 73 text

include Java

Slide 74

Slide 74 text

class DiabloBot attr_accessor :screen, :image_path, :sikuli def initialize screen = Screen.new sikuli = SikuliScript.new image_path = File.dirname( File.expand_path($0) ) end end

Slide 75

Slide 75 text

clickin at fixed points step 2 of 9

Slide 76

Slide 76 text

@screen.click(Sikuli::Location.new(370,300))

Slide 77

Slide 77 text

@screen.click(Sikuli::Location.new(370,300)) [about the coordinates]

Slide 78

Slide 78 text

@sikuli.switch_app("Diablo III")

Slide 79

Slide 79 text

def cellar_run @sikuli.switch_app("Diablo III") @screen.click(Sikuli::Location.new(370,300)) end

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

auto-movement step 3 of 9

Slide 82

Slide 82 text

- define X key for auto-move - press X -> walk - press X -> stop auto-movement

Slide 83

Slide 83 text

def move(delay = 0.5) @screen.key_down("x") sleep(delay) @screen.key_up("x") end

Slide 84

Slide 84 text

def mm(times = 5) times.downto(0).each { move } end

Slide 85

Slide 85 text

def cellar_run @sikuli.switch_app("Diablo III") @screen.click(Sikuli::Location.new(370,300)) mm(7) end

Slide 86

Slide 86 text

No content

Slide 87

Slide 87 text

slow down, dammit!

Slide 88

Slide 88 text

@screen.click(Sikuli::Location.new(720,493)) mm(3) (aÝ t t tה Î r_ n t d) leavin it in a better spot

Slide 89

Slide 89 text

No content

Slide 90

Slide 90 text

d-(*o*)-b

Slide 91

Slide 91 text

findin the cellar step 4 of 9

Slide 92

Slide 92 text

def cellar_opened? @screen.find("#{self.image_path}/cellar_opened.png") end

Slide 93

Slide 93 text

def cellar_closed? @screen.find("#{self.image_path}/cellar_closed.png") end

Slide 94

Slide 94 text

if cellar_opened? enter_cellar else restart_run end

Slide 95

Slide 95 text

ima e files (screenshots) ( вd tה sc pt c )

Slide 96

Slide 96 text

restartin a run step 5 of 9

Slide 97

Slide 97 text

exemple: manual execution

Slide 98

Slide 98 text

No content

Slide 99

Slide 99 text

- press ESC - click at ‘Leave Game’ - wait - click at ‘Resume Game’ - wait a bit more

Slide 100

Slide 100 text

def restart press(Sikuli::Key::ESC) click_coord(800,570) sleep(13) click("resume") sleep(6) cellar_run end

Slide 101

Slide 101 text

def restart press(Sikuli::Key::ESC) click_coord(800,570) sleep(13) click("resume") sleep(6) cellar_run end ? ? ?

Slide 102

Slide 102 text

def press(key, delay = 0.5) @screen.key_down(key) sleep(delay) @screen.key_up(key) end

Slide 103

Slide 103 text

def click_coord(x, y) @screen.click(Sikuli::Location.new(x,y)) end

Slide 104

Slide 104 text

def click(pattern) @screen.wait("#{image_path}/#{pattern}.png") @screen.click("#{image_path}/#{pattern}.png",0) end

Slide 105

Slide 105 text

lo in the execution step 6 of 9

Slide 106

Slide 106 text

require 'ostruct'

Slide 107

Slide 107 text

stats = OpenStruct.new( :runs => 0, :closed => 0, :opened => 0, :not_found => 0 )

Slide 108

Slide 108 text

if cellar_opened? stats.opened += 1 enter_cellar elsif cellar_closed? stats.closed += 1 restart else stats.not_found += 1 restart end

Slide 109

Slide 109 text

Slide 110

Slide 110 text

enterin the cellar step 7 of 9

Slide 111

Slide 111 text

No content

Slide 112

Slide 112 text

def enter_cellar click_coord(600,450) sleep(2) if @screen.find("#{self.image_path}/inside_cellar.png") stats.entered += 1 else restart end end

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

x click_coord(340,820) sleep(5)

Slide 115

Slide 115 text

No content

Slide 116

Slide 116 text

attackin the demons step 8 of 9

Slide 117

Slide 117 text

No content

Slide 118

Slide 118 text

- position the character - activate ran ed attack - wait enou h time - deactivate the attack - collect the money! $$$

Slide 119

Slide 119 text

def attack_enemies @screen.key_down(Sikuli::Key::SHIFT) @screen.mouse_down(Sikuli::Button.LEFT) sleep(20) @screen.key_up(Sikuli::Key::SHIFT) sleep(2) @screen.mouse_up(Sikuli::Button.LEFT) end

Slide 120

Slide 120 text

collectin the old step 9 of 9

Slide 121

Slide 121 text

def any_gold? press(Sikuli::Key::ALT) @screen.find("#{self.image_path}/gold.png") end

Slide 122

Slide 122 text

def get_all_gold if any_gold? click("gold") get_all_gold else puts "all got acquired" restart end end

Slide 123

Slide 123 text

now everythin to ether! step NaN of 9

Slide 124

Slide 124 text

No content

Slide 125

Slide 125 text

^_^b

Slide 126

Slide 126 text

https:// ist. ithub.com/ d49f704f129a2db188f0 http://bit.ly/NfCGI9

Slide 127

Slide 127 text

http://rodri ofranco.com/ t nk u! @caffo @caffo

Slide 128

Slide 128 text

No content

Slide 129

Slide 129 text

No content

Slide 130

Slide 130 text

http://bookqueue.net

Slide 131

Slide 131 text

http://moourl.com