sahi 1.0.1 → 1.2.0

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.
Files changed (3) hide show
  1. data/lib/sahi.rb +166 -44
  2. data/test/sahi_test.rb +116 -27
  3. metadata +33 -73
@@ -1,16 +1,12 @@
1
1
  require 'net/http'
2
- require 'cgi'
3
- require 'guid'
4
- require 'Platform'
2
+ require 'time'
3
+ require 'json'
5
4
 
6
5
  module Sahi
7
6
  # The Browser class controls different browsers via Sahi's proxy.
8
7
  #
9
- # Thank you Sai Venkat for helping kickstart the ruby driver.
10
- #
11
8
  # Author:: Narayan Raman (mailto:narayan@sahi.co.in)
12
9
  # Copyright:: Copyright (c) 2006 V Narayan Raman
13
- # License:: Apache License, Version 2.0
14
10
  #
15
11
  # Download Sahi from http://sahi.co.in/ .
16
12
  # Java 1.5 or greater is needed to run Sahi.
@@ -23,48 +19,61 @@ module Sahi
23
19
  #
24
20
  # cd sahi/userdata/bin;
25
21
  # start_sahi.sh;
26
- #
27
- # Point the browser proxy settings to localhost 9999.
28
22
  #
29
23
 
30
24
  class Browser
31
- attr_accessor :proxy_host, :proxy_port, :print_steps, :sahisid, :popup_name
25
+ attr_accessor :proxy_host, :proxy_port, :print_steps, :sahisid, :popup_name, :domain_name
32
26
 
33
- # Takes browser_path and browser_options
27
+ # Takes browser_type as specified in sahi/userdata/config/browser_types.xml (name of browserType) - RECOMMENDED
28
+ #
29
+ # OR
30
+ #
31
+ # Takes browser_path, browser_options and browser_executable - NOT RECOMMENDED
34
32
  # Various browser options needed to initialize the Browser object are:
35
33
  #
36
34
  # Internet Explorer 6&7:
37
35
  # browser_path = "C:\\Program Files\\Internet Explorer\\iexplore.exe"
38
36
  # browser_options = ""
37
+ # browser_executable = "iexplore.exe"
39
38
  #
40
39
  # Internet Explorer 8:
41
40
  # browser_path = "C:\\Program Files\\Internet Explorer\\iexplore.exe"
42
41
  # browser_options = "-nomerge"
42
+ # browser_executable = "iexplore.exe"
43
43
  #
44
44
  # Firefox:
45
- # userdata_dir = "D:/sahi/sf/sahi_993/userdata" # path to Sahi's userdata directory.
46
45
  # browser_path = "C:\\Program Files\\Mozilla Firefox\\firefox.exe"
47
- # browser_options = "-profile # {userdata_dir}/browser/ff/profiles/sahi0 -no-remote"
46
+ # browser_options = "-profile $userDir/browser/ff/profiles/sahi0 -no-remote"
47
+ # browser_executable = "firefox.exe"
48
48
  #
49
49
  # Chrome:
50
50
  # userdata_dir = "D:/sahi/sf/sahi_993/userdata" # path to Sahi's userdata directory.
51
51
  # browser_path = "C:\\Documents and Settings\\YOU_THE_USER\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe"
52
52
  # browser_options = "--user-data-dir=# {userdata_dir}\browser\chrome\profiles\sahi$threadNo"
53
+ # browser_executable = "chrome.exe"
53
54
  #
54
55
  # Safari:
55
56
  # browser_path = "C:\\Program Files\\Safari\Safari.exe"
56
57
  # browser_options = ""
58
+ # browser_executable = "safari.exe"
57
59
  #
58
60
  # Opera:
59
61
  # browser_path = "C:\\Program Files\\Opera\\opera.exe"
60
62
  # browser_options = ""
63
+ # browser_executable = "opera.exe"
61
64
 
62
- def initialize(browser_path, browser_options)
65
+ def initialize(*args)
63
66
  @proxy_host = "localhost"
64
67
  @proxy_port = 9999
65
- @browser_path = browser_path
66
- @browser_options = browser_options
68
+ if args.size == 3
69
+ @browser_path = args[0]
70
+ @browser_options = ars[1]
71
+ @browser_executable = args[2]
72
+ elsif args.size == 1
73
+ @browser_type = args[0]
74
+ end
67
75
  @popup_name = nil
76
+ @domain_name = nil
68
77
  @sahisid = nil
69
78
  @print_steps = false
70
79
  end
@@ -80,18 +89,12 @@ module Sahi
80
89
  #opens the browser
81
90
  def open()
82
91
  check_proxy()
83
-
84
- @sahisid = Guid.new.to_s
85
- cmd = "#{@browser_path} #{@browser_options} http://sahi.example.com/_s_/dyn/Driver_start?sahisid=#{@sahisid}&startUrl=#{CGI.escape("http://sahi.example.com/_s_/dyn/Driver_initialized")}"
86
-
87
- if Platform::OS == :win32
88
- require "win32/process"
89
- @pid = Process.create(:app_name => cmd,
90
- :process_inherit => true,
91
- :thread_inherit => true,
92
- :inherit => true).process_id
92
+ @sahisid = Time.now.to_f
93
+ start_url = "http://sahi.example.com/_s_/dyn/Driver_initialized"
94
+ if (@browser_type != null)
95
+ exec_command("launchPreconfiguredBrowser", {"browserType" => @browser_type, "startUrl" => start_url})
93
96
  else
94
- @pid = fork { exec(cmd) }
97
+ exec_command("launchAndPlayback", {"browser" => @browser, "browserOptions" => @browser_options, "browserExecutable" => @browser_executable, "startUrl" => start_url})
95
98
  end
96
99
 
97
100
  i = 0
@@ -124,6 +127,10 @@ module Sahi
124
127
  if popup?()
125
128
  step = "_sahi._popup(#{Utils.quoted(@popup_name)})." + step
126
129
  end
130
+ if domain?()
131
+ step = "_sahi._domain(#{Utils.quoted(@domain_name)})." + step
132
+ end
133
+ #puts step
127
134
  exec_command("setStep", {"step" => step})
128
135
  i = 0
129
136
  while (i < 500)
@@ -134,9 +141,9 @@ module Sahi
134
141
 
135
142
  error = check_done.index("error:") == 0
136
143
  return if done
137
- if (error)
144
+ if (error)
138
145
  raise check_done
139
- end
146
+ end
140
147
  end
141
148
  end
142
149
 
@@ -146,11 +153,21 @@ module Sahi
146
153
 
147
154
  # evaluates a javascript expression on the browser and fetches its value
148
155
  def fetch(expression)
149
- key = "___lastValue___" +Guid.new.to_s()
156
+ key = "___lastValue___" + Time.now.getutc.to_s;
150
157
  execute_step("_sahi.setServerVarPlain('"+key+"', " + expression + ")")
151
158
  return check_nil(exec_command("getVariable", {"key" => key}))
152
159
  end
153
160
 
161
+ # evaluates a javascript expression on the browser and returns true if value is true or "true"
162
+ def fetch_boolean(expression)
163
+ return fetch(expression) == "true"
164
+ end
165
+
166
+
167
+ def browser_js=(js)
168
+ exec_command("setBrowserJS", {"browserJS"=>js})
169
+ end
170
+
154
171
  def check_nil(s)
155
172
  return (s == "null") ? nil : s
156
173
  end
@@ -160,23 +177,53 @@ module Sahi
160
177
  if popup?()
161
178
  execute_step("_sahi._closeWindow()");
162
179
  else
163
- Process.kill(9, @pid) if @pid
180
+ exec_command("kill");
181
+ #Process.kill(9, @pid) if @pid
164
182
  end
165
183
  end
166
184
 
167
185
  # sets the speed of execution. The speed is specified in milli seconds
168
- def set_speed(ms)
186
+ def speed=(ms)
169
187
  exec_command("setSpeed", {"speed"=>ms})
170
188
  end
171
189
 
190
+ # sets strict visibility check. If true, Sahi APIs ignores elements which are not visible
191
+ def strict_visibility_check=(check)
192
+ execute_step("_sahi._setStrictVisibilityCheck(#{check})")
193
+ end
194
+
195
+
172
196
  # represents a popup window. The name is either the window name or its title.
173
197
  def popup(name)
174
- win = Browser.new(@browser_path, @browser_options)
198
+ if (@browser_type != null)
199
+ win = Browser.new(@browser_type)
200
+ else
201
+ win = Browser.new(@browser_path, @browser_options, @browser_executable)
202
+ end
203
+
175
204
  win.proxy_host = @proxy_host
176
205
  win.proxy_port = @proxy_port
177
206
  win.sahisid = @sahisid
178
207
  win.print_steps = @print_steps
179
208
  win.popup_name = name
209
+ win.domain_name = @domain_name
210
+ return win
211
+ end
212
+
213
+ # represents a domain section of window.
214
+ def domain(name)
215
+ if (@browser_type != null)
216
+ win = Browser.new(@browser_type)
217
+ else
218
+ win = Browser.new(@browser_path, @browser_options, @browser_executable)
219
+ end
220
+
221
+ win.proxy_host = @proxy_host
222
+ win.proxy_port = @proxy_port
223
+ win.sahisid = @sahisid
224
+ win.print_steps = @print_steps
225
+ win.popup_name = @popup_name
226
+ win.domain_name = name
180
227
  return win
181
228
  end
182
229
 
@@ -184,6 +231,10 @@ module Sahi
184
231
  return @popup_name != nil
185
232
  end
186
233
 
234
+ def domain?()
235
+ return @domain_name != nil
236
+ end
237
+
187
238
  # returns the message last alerted on the browser
188
239
  def last_alert()
189
240
  return fetch("_sahi._lastAlert()")
@@ -243,18 +294,43 @@ module Sahi
243
294
  def add_url_mock(url_pattern, clazz=nil)
244
295
  clazz = "MockResponder_simple" if !clazz
245
296
  execute_step("_sahi._addMock(#{Utils.quoted(url_pattern)}, #{Utils.quoted(clazz)})")
246
- end
297
+ end
247
298
 
248
299
  # reverse effect of add_url_mock
249
- def remove_url_mock(url_pattern)
300
+ def remove_url_mock(url_pattern)
250
301
  execute_step("_sahi._removeMock(#{Utils.quoted(url_pattern)})")
251
- end
302
+ end
252
303
 
253
304
  # return window title
254
305
  def title()
255
306
  return fetch("_sahi._title()")
256
307
  end
257
308
 
309
+ # returns true if browser is Internet Explorer
310
+ def ie?()
311
+ return fetch_boolean("_sahi._isIE()")
312
+ end
313
+
314
+ # returns true if browser is Firefox
315
+ def firefox?()
316
+ return fetch_boolean("_sahi._isFF()")
317
+ end
318
+
319
+ # returns true if browser is Google Chrome
320
+ def chrome?()
321
+ return fetch_boolean("_sahi._isChrome()")
322
+ end
323
+
324
+ # returns true if browser is Safari
325
+ def safari?()
326
+ return fetch_boolean("_sahi._isSafari()")
327
+ end
328
+
329
+ # returns true if browser is Opera
330
+ def opera?()
331
+ return fetch_boolean("_sahi._isOpera()")
332
+ end
333
+
258
334
  # waits for specified time (in seconds).
259
335
  # if a block is passed, it will wait till the block evaluates to true or till the specified timeout, which ever is earlier.
260
336
  def wait(timeout)
@@ -296,10 +372,12 @@ module Sahi
296
372
  # uncheck - for checkboxes
297
373
 
298
374
  class ElementStub
299
- @@actions = {"click"=>"click", "mouse_over"=>"mouseOver",
375
+ @@actions = {"click"=>"click",
300
376
  "focus"=>"focus", "remove_focus"=>"removeFocus",
301
377
  "check"=>"check", "uncheck"=>"uncheck",
302
- "dblclick"=>"doubleClick", "right_click"=>"rightClick"}
378
+ "dblclick"=>"doubleClick", "right_click"=>"rightClick",
379
+ "key_down"=>"keyDown", "key_up"=>"keyUp",
380
+ "mouse_over"=>"mouseOver", "mouse_down"=>"mouseDown", "mouse_up"=>"mouseUp"}
303
381
  def initialize (browser, type, identifiers)
304
382
  @type = type
305
383
  @browser = browser
@@ -318,6 +396,10 @@ module Sahi
318
396
  @browser.execute_step(step)
319
397
  end
320
398
 
399
+ def key_press(codes, combo=nil)
400
+ @browser.execute_step("_sahi._keyPress(#{self.to_s()}, #{codes.to_json}, #{combo.to_json})")
401
+ end
402
+
321
403
  # drag element and drop on another element
322
404
  def drag_and_drop_on(el2)
323
405
  @browser.execute_step("_sahi._dragDrop(#{self.to_s()}, #{el2.to_s()})")
@@ -325,7 +407,7 @@ module Sahi
325
407
 
326
408
  # choose option in a select box
327
409
  def choose(val)
328
- @browser.execute_step("_sahi._setSelected(#{self.to_s()}, #{Utils.quoted(val)})")
410
+ @browser.execute_step("_sahi._setSelected(#{self.to_s()}, #{val.to_json})")
329
411
  end
330
412
 
331
413
  # sets the value for textboxes or textareas. Also triggers necessary events.
@@ -335,14 +417,27 @@ module Sahi
335
417
 
336
418
  # returns value of textbox or textareas and other relevant input elements
337
419
  def value()
338
- return @browser.fetch("#{self.to_s()}.value")
420
+ return @browser.fetch("_sahi._getValue(#{self.to_s()})")
339
421
  end
340
422
 
341
423
  # fetches value of specified attribute
342
424
  def fetch(attr=nil)
343
- return attr ? @browser.fetch("#{self.to_s()}.#{attr}") : @browser.fetch("#{self.to_s()}")
344
- end
425
+ if attr
426
+ if attr.include? "."
427
+ return @browser.fetch("#{self.to_s()}.#{attr}")
428
+ else
429
+ return @browser.fetch("_sahi.getAttribute(#{self.to_s()}, #{Utils.quoted(attr)})")
430
+ end
431
+ else
432
+ return @browser.fetch("#{self.to_s()}")
433
+ end
434
+ end
345
435
 
436
+ # returns boolean value of attribute. returns true only if fetch returns "true"
437
+ def fetch_boolean(attr=nil)
438
+ return @browser.fetch_boolean(attr)
439
+ end
440
+
346
441
  # Emulates setting filepath in a file input box.
347
442
  def file=(val)
348
443
  @browser.execute_step("_sahi._setFile(#{self.to_s()}, #{Utils.quoted(val)})")
@@ -378,6 +473,16 @@ module Sahi
378
473
  @identifiers << ElementStub.new(@browser, "in", [el2])
379
474
  return self
380
475
  end
476
+
477
+ # returns a stub with a POSITIONAL "under" relation to another element.
478
+ # Eg.
479
+ # browser.cell(0).under(browser.cell("Header")) will denote the cell visually under "Header"
480
+ # browser.cell(0).near(browser.cell("Book")).under(browser.cell("Cost")) may be used to denote the Cost of Book in a grid
481
+
482
+ def under(el2)
483
+ @identifiers << ElementStub.new(@browser, "under", [el2])
484
+ return self
485
+ end
381
486
 
382
487
 
383
488
  # specifies exacts coordinates to click inside an element. The coordinates are relative to the element. x is from left and y is from top. Can be negative to specify other direction
@@ -429,13 +534,30 @@ module Sahi
429
534
  def contains_html?(html)
430
535
  return @browser.fetch("_sahi._containsHTML(#{self.to_s()}, #{Utils.quoted(html)})")
431
536
  end
432
-
537
+
538
+ # returns count of elements similar to this element
539
+ def count_similar()
540
+ return Integer(@browser.fetch("_sahi._count(\"_#{@type}\", #{concat_identifiers(@identifiers).join(", ")})"))
541
+ end
542
+
543
+ # returns array elements similar to this element
544
+ def collect_similar()
545
+ count = self.count_similar()
546
+ els = Array.new(count)
547
+ for i in (0..count-1)
548
+ copy = Array.new(@identifiers)
549
+ copy[0] = "#{copy[0]}[#{i}]"
550
+ els[i] = ElementStub.new(@browser, @type, copy);
551
+ end
552
+ return els
553
+ end
554
+
433
555
  def to_s
434
- return "_sahi._#{@type }(#{concat_identifiers(@identifiers).join(", ") })"
556
+ return "_sahi._#{@type}(#{concat_identifiers(@identifiers).join(", ") })"
435
557
  end
436
558
 
437
559
  def concat_identifiers(ids)
438
- return ids.collect {|id| id.kind_of?(String) ? Utils.quoted(id) : id.to_s()}
560
+ return ids.collect {|id| id.kind_of?(String) ? Utils.quoted(id) : (id.is_a?(ElementStub) ? id.to_s() : id.to_json())}
439
561
  end
440
562
  #private :concat_identifiers, :exists1?, :visible1?
441
563
  end
@@ -5,38 +5,34 @@ class SahiDriverTest < Test::Unit::TestCase
5
5
  def setup
6
6
  @browser = init_browser()
7
7
  @browser.open
8
- @base_url = "http://sahi.co.in"
8
+ @base_url = "http://localhost."
9
9
  end
10
10
 
11
11
  def teardown
12
12
  if @browser
13
- @browser.set_speed(100)
13
+ @browser.set_speed = 100
14
14
  @browser.close
15
15
  sleep(1)
16
16
  end
17
17
  end
18
18
 
19
19
  def init_browser()
20
- userdata_dir = "../../userdata"
21
- browser_path = "C:\\Program Files\\Mozilla Firefox\\firefox.exe"
22
- browser_options = "-profile #{userdata_dir}/browser/ff/profiles/sahi0 -no-remote"
23
- #browser_path = "C:\\Program Files\\Internet Explorer\\iexplore.exe"
24
- #browser_options = "-nomerge"
25
-
26
- return Sahi::Browser.new(browser_path, browser_options)
20
+ # Look at sahi/userdata/config/browser_types.xml to configure browsers.
21
+ @browser_name = "chrome"
22
+ return Sahi::Browser.new(@browser_name)
27
23
  end
28
24
 
29
25
 
30
26
  def test1
31
27
  @browser.navigate_to(@base_url + "/demo/formTest.htm")
32
- @browser.textbox("t1").value = "aaa"
28
+ @browser.textbox("t1").value = "aaa"
33
29
  @browser.link("Back").click
34
- @browser.link("Table Test").click
30
+ @browser.link("Table Test").click
35
31
  assert_equal("Cell with id", @browser.cell("CellWithId").text)
36
32
  end
37
33
 
38
- def test_ZK
39
- @browser.set_speed(200)
34
+ def xtest_ZK
35
+ @browser.speed = 200
40
36
  @browser.navigate_to("http://www.zkoss.org/zkdemo/userguide/")
41
37
  @browser.div("Hello World").click
42
38
  @browser.span("Pure Java").click
@@ -52,7 +48,7 @@ class SahiDriverTest < Test::Unit::TestCase
52
48
  @browser.span("The coolest technology").click
53
49
  @browser.italic("z-combobox-btn[2]").click
54
50
  @browser.image("CogwheelEye-32x32.gif").click
55
- assert(@browser.textbox("z-combobox-inp[2]").exists?)
51
+ assert(@browser.textbox("z-combobox-inp[2]").exists?)
56
52
  end
57
53
 
58
54
 
@@ -113,6 +109,8 @@ class SahiDriverTest < Test::Unit::TestCase
113
109
  assert_equal("o1", @browser.select("s1Id[1]").selected_text())
114
110
  @browser.select("s1Id[1]").choose("o2")
115
111
  assert_equal("o2", @browser.select("s1Id[1]").selected_text())
112
+ @browser.select(3).choose(["o1", "o3"])
113
+ assert_equal("o1,o3", @browser.select(3).selected_text())
116
114
  end
117
115
 
118
116
  def test_set_file()
@@ -184,7 +182,7 @@ class SahiDriverTest < Test::Unit::TestCase
184
182
  @browser.image("imgWithLinkNoClick").click;
185
183
  assert(@browser.textbox("t1").exists?)
186
184
  assert_equal("myFn called", @browser.textbox("t1").value)
187
- @browser.link("Back").click;
185
+ @browser.link("Back").click;
188
186
  end
189
187
 
190
188
 
@@ -227,14 +225,21 @@ class SahiDriverTest < Test::Unit::TestCase
227
225
  @browser.navigate_to(@base_url + "/demo/tableTest.htm")
228
226
  assert_equal("111", @browser.textarea("ta").near(@browser.cell("a1")).value)
229
227
  assert_equal("222", @browser.textarea("ta").near(@browser.cell("a2")).value)
228
+ assert_equal("3", @browser.table(0).fetch("rows.length"))
230
229
  @browser.link("Go back").in(@browser.cell("a1").parent_node()).click;
231
230
  assert(@browser.link("Link Test").exists?)
232
231
  end
233
232
 
233
+ def test_under()
234
+ @browser.navigate_to(@base_url + "/demo/tableTest.htm")
235
+ assert_equal("x1-2", @browser.cell(0).near(@browser.cell("x1-0")).under(@browser.tableHeader("header 3")).text());
236
+ assert_equal("x1-3", @browser.cell(0).near(@browser.cell("x1-0")).under(@browser.tableHeader("header 4")).text());
237
+ end
238
+
234
239
  def test_exists()
235
240
  @browser.navigate_to(@base_url + "/demo/index.htm")
236
241
  assert(@browser.link("Link Test").exists?)
237
- assert(!@browser.link("Link Test NonExistent").exists?)
242
+ assert(!@browser.link("Link Test NonExistent").exists?)
238
243
  end
239
244
 
240
245
  def alert1(message)
@@ -277,7 +282,7 @@ class SahiDriverTest < Test::Unit::TestCase
277
282
  @browser.expect_confirm("Some question?", true)
278
283
  @browser.button("Click For Confirm").click;
279
284
  assert_equal("oked", @browser.textbox("t1").value)
280
- assert_equal("Some question?", @browser.last_confirm())
285
+ assert_equal("Some question?", @browser.last_confirm())
281
286
  @browser.clear_last_confirm()
282
287
  assert_nil(@browser.last_confirm())
283
288
  end
@@ -292,7 +297,7 @@ class SahiDriverTest < Test::Unit::TestCase
292
297
  @browser.waitFor(2000)
293
298
  assert_equal("Some prompt?", @browser.last_prompt())
294
299
  @browser.clear_last_prompt()
295
- assert_nil(@browser.last_prompt())
300
+ assert_nil(@browser.last_prompt())
296
301
  end
297
302
 
298
303
 
@@ -318,7 +323,7 @@ class SahiDriverTest < Test::Unit::TestCase
318
323
  assert(@browser.spandiv("using visibility").visible?)
319
324
 
320
325
  assert(!@browser.byId("nestedBlockInNone").visible?)
321
- assert(!@browser.byId("absoluteNestedBlockInNone").visible?)
326
+ assert(!@browser.byId("absoluteNestedBlockInNone").visible?)
322
327
  end
323
328
 
324
329
  def test_check()
@@ -346,7 +351,7 @@ class SahiDriverTest < Test::Unit::TestCase
346
351
  @browser.textbox("t2").remove_focus()
347
352
  assert_equal("not focused", @browser.textbox("t1").value)
348
353
  @browser.textbox("t2").focus()
349
- assert_equal("focused", @browser.textbox("t1").value)
354
+ assert_equal("focused", @browser.textbox("t1").value)
350
355
  end
351
356
 
352
357
  def test_title()
@@ -372,12 +377,12 @@ class SahiDriverTest < Test::Unit::TestCase
372
377
  assert_equal("", @browser.div("output").text)
373
378
  @browser.area("Record").click;
374
379
  assert(@browser.link("linkByContent").exists?)
375
- #@browser.navigate_to("map.htm")
380
+ #@browser.navigate_to("map.htm")
376
381
  end
377
382
 
378
383
  def test_dragdrop()
379
384
  @browser.navigate_to("http://www.snook.ca/technical/mootoolsdragdrop/")
380
- @browser.div("Drag me").drag_and_drop_on(@browser.div("Item 2"))
385
+ @browser.div("Drag me").drag_and_drop_on(@browser.xy(@browser.div("Item 2"), 5, 5))
381
386
  assert @browser.div("dropped").exists?
382
387
  assert @browser.div("Item 1").exists?
383
388
  assert @browser.div("Item 3").exists?
@@ -394,9 +399,8 @@ class SahiDriverTest < Test::Unit::TestCase
394
399
  @browser.navigate_to("http://www.google.com")
395
400
  @browser.textbox("q").value = "sahi forums"
396
401
  @browser.submit("Google Search").click
397
- @browser.link("Sahi - Web Automation and Test Tool").click
398
- @browser.link("Login").click
399
- assert @browser.textbox("req_username").visible?
402
+ @browser.link("Sign In").click
403
+ assert @browser.textbox("Form/Email").visible?
400
404
  end
401
405
 
402
406
  def test_dblclick()
@@ -413,6 +417,91 @@ class SahiDriverTest < Test::Unit::TestCase
413
417
  @browser.button("Clear").click
414
418
  end
415
419
 
420
+ def test_different_domains()
421
+ @browser.navigate_to("#{@base_url}/demo/")
422
+ @browser.link("Different Domains External").click
423
+ domain_tyto = @browser.domain("www.tytosoftware.com")
424
+ domain_bing = @browser.domain("www.bing.com")
425
+
426
+ domain_tyto.link("Link Test").click
427
+ domain_bing.textbox("q").value = "fdsfsd"
428
+
429
+ domain_tyto.link("Back").click
430
+ domain_bing.div("bgDiv").click
431
+
432
+ @browser.navigate_to("#{@base_url}/demo/");
433
+ end
434
+
435
+ def test_browser_types()
436
+ @browser.navigate_to("#{@base_url}/demo/")
437
+ if (@browser_name == "firefox")
438
+ assert(!@browser.ie?())
439
+ assert(@browser.firefox?())
440
+ elsif (@browser_name == "ie")
441
+ assert(@browser.ie?())
442
+ assert(!@browser.firefox?())
443
+ end
444
+ end
445
+
446
+ def test_browser_js()
447
+ @browser.browser_js = "function giveMyNumber(){return '23';}"
448
+ @browser.navigate_to("#{@base_url}/demo/")
449
+ assert_equal("23", @browser.fetch("giveMyNumber()"))
450
+ @browser.link("Link Test").click()
451
+ assert_equal("23", @browser.fetch("giveMyNumber()"))
452
+ @browser.link("Back").click()
453
+ end
416
454
 
417
- end
418
-
455
+ def test_count()
456
+ @browser.navigate_to("#{@base_url}/demo/count.htm")
457
+ assert_equal(4, @browser.link("group 0 link").count_similar())
458
+ assert_equal(0, @browser.link("group non existent link").count_similar());
459
+ assert_equal(5, @browser.link("/group 1/").count_similar());
460
+ assert_equal(2, @browser.link("/group 1/").in(@browser.div("div1")).count_similar());
461
+ end
462
+
463
+ def test_collect()
464
+ @browser.navigate_to("#{@base_url}/demo/count.htm")
465
+ els = @browser.link("/group 1/").collect_similar();
466
+ assert_equal(5, els.size());
467
+ assert_equal("group 1 link1", els[0].text);
468
+ assert_equal("group 1 link2", els[1].text);
469
+
470
+ @browser.navigate_to("#{@base_url}/demo/count.htm")
471
+ els2 = @browser.link("/group 1/").in(@browser.div("div1")).collect_similar();
472
+ assert_equal(2, els2.size());
473
+ assert_equal("group 1 link3", els2[0].text);
474
+ assert_equal("group 1 link4", els2[1].text);
475
+ end
476
+
477
+ def test_strict_visible()
478
+ @browser.navigate_to("#{@base_url}/demo/strict_visible.htm")
479
+ assert_equal("b", @browser.textbox("q[1]").value)
480
+ @browser.strict_visibility_check = true
481
+ assert_equal("c", @browser.textbox("q[1]").value)
482
+ @browser.strict_visibility_check = false
483
+ assert_equal("b", @browser.textbox("q[1]").value)
484
+ end
485
+
486
+ def test_active_element()
487
+ @browser.navigate_to("#{@base_url}/demo/training/login.htm")
488
+ @browser.textbox("user").focus()
489
+ assert_equal("user", @browser.activeElement().fetch("name"))
490
+ @browser.password("password").focus()
491
+ assert_equal("password", @browser.activeElement().fetch("name"))
492
+ end
493
+
494
+ def test_identify_by_multiple_attributes()
495
+ @browser.navigate_to("#{@base_url}/demo/training/books.htm")
496
+ @browser.textbox("q[2]").value = "aaa"
497
+ assert_equal("aaa", @browser.textbox({"name"=>"q", "sahiIndex"=>2}).value)
498
+ end
499
+
500
+ def test_key_press()
501
+ @browser.navigate_to("#{@base_url}/demo/formTest.htm")
502
+ @browser.textbox("t1").key_press("a")
503
+ assert_equal("a", @browser.textbox("t1").value)
504
+ @browser.textbox("t1").key_press([66,98]);
505
+ assert_equal("ab", @browser.textbox("t1").value)
506
+ end
507
+ end
metadata CHANGED
@@ -1,94 +1,54 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sahi
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 1
9
- version: 1.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
12
- - Narayan Raman
7
+ authors:
8
+ - Tyto Software
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2010-04-30 00:00:00 +05:30
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: Platform
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- - 3
30
- - 9
31
- version: 0.3.9
32
- type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: guid
36
- prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- requirements:
39
- - - ">="
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 0
43
- - 1
44
- - 1
45
- version: 0.1.1
46
- type: :runtime
47
- version_requirements: *id002
48
- description: |-
49
- Ruby driver for Sahi (http://sahi.co.in/). Sahi is a web automation tool.
50
- Sahi runs as a proxy, and the browser needs to be configured to use Sahi's proxy.
51
- The browser can then be driven via the Sahi Ruby driver.
12
+ date: 2013-08-06 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: ! "Ruby driver for Sahi (http://sahi.co.in/). Sahi is a web automation
15
+ tool. \nSahi runs as a proxy, and the browser needs to be configured to use Sahi's
16
+ proxy. \nThe browser can then be driven via the Sahi Ruby driver."
52
17
  email: support@sahi.co.in
53
18
  executables: []
54
-
55
19
  extensions: []
56
-
57
- extra_rdoc_files:
20
+ extra_rdoc_files:
58
21
  - README.txt
59
- files:
22
+ files:
60
23
  - lib/sahi.rb
61
24
  - README.txt
62
- has_rdoc: true
25
+ - test/elementstub_test.rb
26
+ - test/sahi_test.rb
63
27
  homepage: http://sahi.co.in/w/ruby/
64
28
  licenses: []
65
-
66
- post_install_message: Welcome to easy web automation using Sahi. You need to have Sahi proxy running before using this driver.
29
+ post_install_message: Welcome to easy web automation using Sahi. You need to have
30
+ Sahi proxy running before using this driver.
67
31
  rdoc_options: []
68
-
69
- require_paths:
32
+ require_paths:
70
33
  - lib
71
- required_ruby_version: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- segments:
76
- - 0
77
- version: "0"
78
- required_rubygems_version: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- segments:
83
- - 0
84
- version: "0"
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
85
46
  requirements: []
86
-
87
47
  rubyforge_project:
88
- rubygems_version: 1.3.6
48
+ rubygems_version: 1.7.2
89
49
  signing_key:
90
50
  specification_version: 3
91
- summary: Ruby driver for Sahi - automation tool for web applications
92
- test_files:
51
+ summary: Ruby driver for Sahi Pro
52
+ test_files:
93
53
  - test/elementstub_test.rb
94
54
  - test/sahi_test.rb