crabfarm 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/assets/live-tools/tools.js +0 -1
  3. data/lib/crabfarm/adapters/browser/abstract_webdriver.rb +13 -28
  4. data/lib/crabfarm/adapters/browser/base.rb +43 -0
  5. data/lib/crabfarm/adapters/browser/chrome.rb +5 -1
  6. data/lib/crabfarm/adapters/browser/firefox.rb +4 -0
  7. data/lib/crabfarm/adapters/browser/noop.rb +3 -10
  8. data/lib/crabfarm/adapters/browser/phantom_js.rb +8 -8
  9. data/lib/crabfarm/adapters/driver_wrapper/pincers.rb +6 -0
  10. data/lib/crabfarm/cli.rb +1 -7
  11. data/lib/crabfarm/context.rb +17 -21
  12. data/lib/crabfarm/driver_pool.rb +3 -2
  13. data/lib/crabfarm/errors.rb +2 -0
  14. data/lib/crabfarm/http_client.rb +1 -1
  15. data/lib/crabfarm/live/context.rb +32 -2
  16. data/lib/crabfarm/live/controller.rb +19 -16
  17. data/lib/crabfarm/live/interactable.rb +5 -14
  18. data/lib/crabfarm/live/manager.rb +85 -95
  19. data/lib/crabfarm/live/navigator_runner.rb +43 -40
  20. data/lib/crabfarm/live/navigator_runner_direct.rb +1 -2
  21. data/lib/crabfarm/live/navigator_runner_rspec.rb +34 -55
  22. data/lib/crabfarm/live/reducer_runner.rb +43 -22
  23. data/lib/crabfarm/live/reducer_runner_direct.rb +1 -2
  24. data/lib/crabfarm/live/reducer_runner_rspec.rb +0 -5
  25. data/lib/crabfarm/live/viewer.rb +92 -0
  26. data/lib/crabfarm/live/watcher.rb +6 -1
  27. data/lib/crabfarm/modes/live.rb +1 -1
  28. data/lib/crabfarm/modes/recorder/snapshot.rb +9 -25
  29. data/lib/crabfarm/support/webdriver_factory.rb +1 -1
  30. data/lib/crabfarm/templates/Gemfile.erb +1 -1
  31. data/lib/crabfarm/utils/rspec_runner.rb +54 -22
  32. data/lib/crabfarm/version.rb +1 -1
  33. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 81f0d2fe698cac2db1ccf56dc0d7acf57cca4baf
4
- data.tar.gz: e616ed1e42c48a9ebcd3ba129c7ab89ad581373a
3
+ metadata.gz: 09ceb80d5125962d7f54f0b7d9f79bc568221f18
4
+ data.tar.gz: f72e8f9951b3ae981bece342c9a7364b007677e9
5
5
  SHA512:
6
- metadata.gz: 9cfe9480badc022cba89c2682e426769f1c235a5fffdb34dd8a4fc910275d3e382f1ba36e5fe727296dcbe6dc5b400bbd2bf6ffd500ec1a0cf89d2cda64e7a19
7
- data.tar.gz: 0ea03b0afec02db914b7e50d40a17134edfe631fa498673def3dd060f01df3ffc230030ef31eb85f3f4cd02368075d5d1c4bce92ba3b5bc72329ea9fc6a1a6ee
6
+ metadata.gz: 1572b106739d6f9a7b2ae385bb640b926f05707e31daf0a99758bb308ab8020a374636fc9df7eb56cf868c3a67aaa861d9538d859438367bc7a300e440613bf5
7
+ data.tar.gz: 39049c8c5b3b5c115dfdc11c92a67bb81411aff7512c16b524c6874c66cf0638adcb9a1a369628e83f5a50d667cabb8c494325f534b94a468ea941969f9790b7
@@ -52,7 +52,6 @@ if(!window.crabfarm) {
52
52
 
53
53
  var removeOverlay = function() {
54
54
  overlay.remove();
55
- window.crabfarm.showSelectorGadget();
56
55
  };
57
56
 
58
57
  overlay.bind("click", removeOverlay);
@@ -1,38 +1,31 @@
1
+ require 'crabfarm/adapters/browser/base'
2
+
1
3
  module Crabfarm
2
4
  module Adapters
3
5
  module Browser
4
- class AbstractWebdriver
6
+ class AbstractWebdriver < Base
5
7
 
6
- attr_accessor :config, :viewer
8
+ attr_accessor :config
7
9
 
8
- def initialize(_proxy=nil, _viewer=nil)
10
+ def initialize(_proxy=nil)
9
11
  @config = load_driver_config
10
12
  @config[:proxy] = _proxy
11
- @viewer = _viewer
12
13
  end
13
14
 
14
- def prepare_driver_services
15
- start_server if viewer.nil?
15
+ def build_driver(_session_id)
16
+ wrap_driver build_webdriver_instance
16
17
  end
17
18
 
18
- def cleanup_driver_services
19
- stop_server if viewer.nil?
19
+ def reset_driver(_wrapped)
20
+ _wrapped.driver.manage.delete_all_cookies # pincers exposes driver?
20
21
  end
21
22
 
22
- def build_driver(_session_id)
23
- wrap_driver(if viewer.nil?
24
- build_webdriver_instance
25
- else
26
- viewer.attach _session_id == :default_driver
27
- end)
23
+ def extract_webdriver(_wrapped)
24
+ _wrapped.driver
28
25
  end
29
26
 
30
- def release_driver(_session_id, _wrapped)
31
- if viewer.nil?
32
- _wrapped.driver.quit rescue nil
33
- else
34
- viewer.detach _wrapped.driver
35
- end
27
+ def release_driver(_wrapped)
28
+ _wrapped.driver.quit rescue nil
36
29
  end
37
30
 
38
31
  private
@@ -47,14 +40,6 @@ module Crabfarm
47
40
  raise NotImplementedError.new
48
41
  end
49
42
 
50
- def start_server
51
- # Nothing by default
52
- end
53
-
54
- def stop_server
55
- # Nothing by default
56
- end
57
-
58
43
  def load_driver_config
59
44
  {
60
45
  capabilities: Crabfarm.config.webdriver_capabilities,
@@ -0,0 +1,43 @@
1
+ module Crabfarm
2
+ module Adapters
3
+ module Browser
4
+ class Base
5
+
6
+ def headless?
7
+ true
8
+ end
9
+
10
+ def build_driver(_session_id)
11
+ ensure_implementation :build_driver
12
+ end
13
+
14
+ def reset_driver(_driver)
15
+ nil
16
+ end
17
+
18
+ def extract_webdriver(_driver)
19
+ nil
20
+ end
21
+
22
+ def release_driver(_driver)
23
+ nil
24
+ end
25
+
26
+ def prepare_driver_services
27
+ # Nothing by default
28
+ end
29
+
30
+ def cleanup_driver_services
31
+ # Nothing by default
32
+ end
33
+
34
+ private
35
+
36
+ def ensure_implementation(_name)
37
+ raise NotImplementedError.new "Missing #{_name} implementation on browser adapter"
38
+ end
39
+
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,11 +1,15 @@
1
1
  require 'crabfarm/support/webdriver_factory'
2
- require "crabfarm/adapters/browser/abstract_webdriver"
2
+ require 'crabfarm/adapters/browser/abstract_webdriver'
3
3
 
4
4
  module Crabfarm
5
5
  module Adapters
6
6
  module Browser
7
7
  class Chrome < AbstractWebdriver
8
8
 
9
+ def headless?
10
+ false
11
+ end
12
+
9
13
  private
10
14
 
11
15
  def build_webdriver_instance
@@ -6,6 +6,10 @@ module Crabfarm
6
6
  module Browser
7
7
  class Firefox < AbstractWebdriver
8
8
 
9
+ def headless?
10
+ false
11
+ end
12
+
9
13
  private
10
14
 
11
15
  def build_webdriver_instance
@@ -1,24 +1,17 @@
1
+ require "crabfarm/adapters/browser/base"
2
+
1
3
  module Crabfarm
2
4
  module Adapters
3
5
  module Browser
4
- class Noop
6
+ class Noop < Base
5
7
 
6
8
  def initialize(_proxy=nil)
7
9
  end
8
10
 
9
- def prepare_driver_services
10
- end
11
-
12
- def cleanup_driver_services
13
- end
14
-
15
11
  def build_driver(_session_id)
16
12
  _session_id || :noop
17
13
  end
18
14
 
19
- def release_driver(_driver)
20
- end
21
-
22
15
  end
23
16
  end
24
17
  end
@@ -7,21 +7,21 @@ module Crabfarm
7
7
  module Browser
8
8
  class PhantomJs < AbstractWebdriver
9
9
 
10
- private
11
-
12
- def build_webdriver_instance
13
- Support::WebdriverFactory.build_remote_driver driver_config
14
- end
15
-
16
- def start_server
10
+ def prepare_driver_services
17
11
  @phantom = load_and_start_phantom if @phantom.nil?
18
12
  end
19
13
 
20
- def stop_server
14
+ def cleanup_driver_services
21
15
  @phantom.stop unless @phantom.nil?
22
16
  @phantom = nil
23
17
  end
24
18
 
19
+ private
20
+
21
+ def build_webdriver_instance
22
+ Support::WebdriverFactory.build_remote_driver driver_config
23
+ end
24
+
25
25
  def load_and_start_phantom
26
26
  new_phantom = Support::PhantomRunner.new phantom_config
27
27
  new_phantom.start
@@ -1,3 +1,9 @@
1
+ class Pincers::Core::RootContext
2
+ def driver
3
+ document
4
+ end
5
+ end
6
+
1
7
  class Pincers::Core::SearchContext
2
8
  def webdriver_elements
3
9
  elements
data/lib/crabfarm/cli.rb CHANGED
@@ -155,18 +155,12 @@ module Crabfarm
155
155
  c.desc "Take snapshots from a navigator run"
156
156
  c.command [:snapshot, :snap] do |snap|
157
157
 
158
- snap.desc "Navigate on a memento"
159
- snap.flag [:m, :memento]
160
-
161
- snap.desc "Navigation query string, if not given navigator is run in interactive mode"
162
- snap.flag [:q, :query]
163
-
164
158
  snap.action do |global_options, options, args|
165
159
  next puts "This command can only be ran inside a crabfarm application" unless Crabfarm.inside_crawler_app?
166
160
 
167
161
  Crabfarm.with_context options[:memento] do |context|
168
162
  require "crabfarm/modes/recorder/snapshot"
169
- Crabfarm::Modes::Recorder::Snapshot.start context, args[0], options[:query]
163
+ Crabfarm::Modes::Recorder::Snapshot.start context, args[0]
170
164
  end
171
165
  end
172
166
 
@@ -32,7 +32,7 @@ module Crabfarm
32
32
  private
33
33
 
34
34
  def load_services
35
- init_driver_factory
35
+ init_browser_adapter
36
36
  init_driver_pool
37
37
  init_http_client
38
38
  end
@@ -45,27 +45,23 @@ module Crabfarm
45
45
  def unload_services
46
46
  release_http_client
47
47
  release_driver_pool
48
- release_driver_factory
48
+ release_browser_adapter
49
49
  end
50
50
 
51
- def init_driver_factory
52
- if @factory.nil?
53
- @factory = build_driver_factory
54
- @factory.prepare_driver_services
51
+ def init_browser_adapter
52
+ if @browser_adapter.nil?
53
+ @browser_adapter = build_browser_adapter proxy
54
+ @browser_adapter.prepare_driver_services
55
55
  end
56
56
  end
57
57
 
58
- def build_driver_factory
59
- Strategies.load(:browser, config.browser).new proxy, viewer
60
- end
61
-
62
- def release_driver_factory
63
- @factory.cleanup_driver_services unless @factory.nil?
64
- @factory.nil?
58
+ def release_browser_adapter
59
+ @browser_adapter.cleanup_driver_services unless @browser_adapter.nil?
60
+ @browser_adapter.nil?
65
61
  end
66
62
 
67
63
  def init_driver_pool
68
- @pool = DriverPool.new @factory if @pool.nil?
64
+ @pool = DriverPool.new @browser_adapter if @pool.nil?
69
65
  end
70
66
 
71
67
  def release_driver_pool
@@ -74,11 +70,15 @@ module Crabfarm
74
70
  end
75
71
 
76
72
  def init_http_client
77
- @http = build_http_client if @http.nil?
73
+ @http = build_http_client proxy if @http.nil?
74
+ end
75
+
76
+ def build_browser_adapter(_proxy)
77
+ Strategies.load(:browser, config.browser).new _proxy
78
78
  end
79
79
 
80
- def build_http_client
81
- HttpClient.new proxy, viewer
80
+ def build_http_client(_proxy)
81
+ HttpClient.new _proxy
82
82
  end
83
83
 
84
84
  def release_http_client
@@ -89,10 +89,6 @@ module Crabfarm
89
89
  config.proxy
90
90
  end
91
91
 
92
- def viewer
93
- nil # no viewer provided by default
94
- end
95
-
96
92
  def config
97
93
  Crabfarm.config
98
94
  end
@@ -15,13 +15,14 @@ module Crabfarm
15
15
 
16
16
  def reset(_session_id=nil)
17
17
  if _session_id.nil?
18
- @drivers.each { |k, d| @factory.release_driver(k, d) }
18
+ @drivers.values.each { |d| @factory.release_driver d }
19
19
  @drivers = Hash.new
20
20
  else
21
21
  _session_id = _session_id.to_sym
22
22
  driver = @drivers.delete _session_id
23
- @factory.release_driver(_session_id, driver) unless driver.nil?
23
+ @factory.release_driver(driver) unless driver.nil?
24
24
  end
25
+ nil
25
26
  end
26
27
 
27
28
  def release
@@ -56,4 +56,6 @@ module Crabfarm
56
56
  end
57
57
  end
58
58
 
59
+ class LiveInterrupted < StandardError; end
60
+
59
61
  end
@@ -24,7 +24,7 @@ module Crabfarm
24
24
 
25
25
  attr_reader :proxy_addr, :proxy_port
26
26
 
27
- def initialize(_proxy=nil, _viewer=nil)
27
+ def initialize(_proxy=nil)
28
28
  if _proxy.nil?
29
29
  @proxy_addr = nil
30
30
  @proxy_port = nil
@@ -1,3 +1,4 @@
1
+ require 'crabfarm/adapters/browser/base'
1
2
  require 'crabfarm/utils/webdriver'
2
3
 
3
4
  module Crabfarm
@@ -9,11 +10,40 @@ module Crabfarm
9
10
  end
10
11
 
11
12
  def proxy
13
+ # override proxy so every context service points to crabtrap
12
14
  "127.0.0.1:#{@manager.proxy_port}"
13
15
  end
14
16
 
15
- def viewer
16
- @manager
17
+ private
18
+
19
+ def build_browser_adapter(_proxy)
20
+ # use a special browser adapter to override primary driver
21
+ return BrowserAdapter.new @manager
22
+ end
23
+
24
+ # TODO: override build_http_client, i would like to tap into the http requests and show downloaded data in viewer
25
+
26
+ class BrowserAdapter < Crabfarm::Adapters::Browser::Base
27
+
28
+ def initialize(_manager)
29
+ @manager = _manager
30
+ end
31
+
32
+ def build_driver(_session_id)
33
+ if _session_id == :default_driver
34
+ @manager.primary_driver
35
+ else
36
+ @manager.browser_adapter.build_driver _session_id
37
+ end
38
+ end
39
+
40
+ def release_driver(_driver)
41
+ if _driver != @manager.primary_driver
42
+ @manager.browser_adapter.release_driver _driver
43
+ end
44
+ nil
45
+ end
46
+
17
47
  end
18
48
 
19
49
  end
@@ -11,24 +11,36 @@ module Crabfarm
11
11
  end
12
12
 
13
13
  def display_external_error(_exc)
14
- @manager.reset_driver_status
14
+ try_reset
15
+
15
16
  display_error_feedback _exc
16
17
  end
17
18
 
18
19
  def execute_live(_class)
20
+ try_reset
21
+
19
22
  begin
20
- runner = build_runner_for _class
21
- prepare_session_for runner
22
- runner.execute
23
+ build_runner_for(_class).execute
23
24
  rescue Exception => exc
24
25
  display_error_feedback exc
25
- ensure
26
- clean_up_session
27
26
  end
28
27
  end
29
28
 
30
29
  private
31
30
 
31
+ def try_reset
32
+ begin
33
+ @manager.reset
34
+ rescue Exception => exc
35
+ # restart manager if reset failed
36
+ @manager.stop rescue nil
37
+ @manager.start
38
+
39
+ Utils::Console.error "Something went wrong, restarting live mode:"
40
+ Utils::Console.exception exc
41
+ end
42
+ end
43
+
32
44
  def build_runner_for(_class)
33
45
  raise ArgumentError.new "'#{_class.to_s} is not Interactable" unless _class < Interactable
34
46
 
@@ -50,17 +62,8 @@ module Crabfarm
50
62
  runner
51
63
  end
52
64
 
53
- def prepare_session_for(_runner)
54
- @manager.reset_driver_status
55
- end
56
-
57
- def clean_up_session
58
- # leave crabtrap running for debugging purposes.
59
- end
60
-
61
65
  def display_error_feedback(_exc)
62
- @manager.inject_web_tools
63
- @manager.show_dialog(
66
+ @manager.show_message(
64
67
  :error,
65
68
  'Crawler error!',
66
69
  "#{_exc.class.to_s}: #{_exc.to_s}",