watchdoge 0.1.3 → 0.1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e382b87c3df4f37d24f4b98c78ef39ab92f12a61491f56f9da3b018dbcd8c37f
4
- data.tar.gz: 185709f4c2bd89c0d570bbbe3572e03287a69ce8192ed9dc794704306c999d9e
3
+ metadata.gz: c3e163dcbfe0adf1bdd0cad7294c47475d7007792820a79a80d150cc86d58227
4
+ data.tar.gz: 8c03e0dff98141f87e822ac561a47b3267754e258425424d968aa5aef05c2c87
5
5
  SHA512:
6
- metadata.gz: c2a084b1af543607b0cb2ac731e71529a06291fcdc1687ca60802d7daa5435176a471c0409c30400515c5a6958ebc16afb55881aeb4e7523fe87a2cfb625c0c8
7
- data.tar.gz: 503bb810559dc22045a03b4079a8f6e60f41f43f50ab39b9c036088aac5f901b54abfb5507e5a845352cbe39f8c0d455b81e51afb7b8c149ac2515fbfa5b27aa
6
+ metadata.gz: 1f6f3564b357805882226d960aa97b69ab4f11d3a1d8f82d5a176995f5b15d9e42fbfadf9c38c9fed09b43cf2c33dda79abe7c316b277e599c0ae4def9d853e6
7
+ data.tar.gz: 8a7af25b9f84fe6475471dd5bd98207f51d3253f2197b37749126712125e052ed1732081eb479d582d3bb07e9cd98fe35006924d8beab30c73dacc8fa42cff5b
@@ -1,22 +1,23 @@
1
+ # All configurable variables
2
+
3
+ # spec:
4
+ #
5
+
1
6
  require 'watir'
2
7
 
3
8
  module WatchDoge
4
9
  class Configuration
5
10
  class Hooks
6
- attr_accessor :sign_in
7
- attr_accessor :sign_out
8
11
  attr_accessor :before_regression
9
12
  attr_accessor :after_regression
10
13
  attr_accessor :before_scenario
11
14
  attr_accessor :after_scenario
12
15
 
13
16
  def initialize
14
- @sign_in = -> (worker, resource) {}
15
- @sign_out = -> (worker, resource) {}
16
- @before_regression = -> {}
17
- @after_regression = -> {}
18
- @before_scenario = -> {}
19
- @after_scenario = -> {}
17
+ @before_regression = []
18
+ @after_regression = []
19
+ @before_scenario = []
20
+ @after_scenario = []
20
21
  end
21
22
  end
22
23
 
@@ -34,6 +35,8 @@ module WatchDoge
34
35
  attr_accessor :regression_dir
35
36
 
36
37
  attr_accessor :hooks
38
+ attr_accessor :sign_in_proc
39
+ attr_accessor :sign_out_proc
37
40
 
38
41
  attr_accessor :chrome_version
39
42
  attr_accessor :firefox_version
@@ -50,7 +53,6 @@ module WatchDoge
50
53
  @engine = Watir::Browser
51
54
  @browser = :firefox
52
55
 
53
- # cuurently using local fs, probably support NoSQL also maybe?
54
56
  @cookie_pool = @base_dir + '/.doge_cookie'
55
57
 
56
58
  @http_timeout = 120
@@ -81,6 +83,8 @@ module WatchDoge
81
83
  end
82
84
 
83
85
  @hooks = WatchDoge::Configuration::Hooks.new
86
+ @sign_in_proc = -> (worker, resource) {}
87
+ @sign_out_proc = -> (worker, resource) {}
84
88
 
85
89
  @chrome_version = nil
86
90
  @firefox_version = nil
@@ -1,25 +1,16 @@
1
+ # TODO: Improve or should just remove it.
2
+
1
3
  require 'yaml'
2
4
  require 'digest'
3
5
 
4
6
  module WatchDoge
5
7
  module CookiePool
6
8
  class << self
7
- def source uuid, uri = nil
9
+ def source uid, uri = nil
8
10
  suffix = "_#{Digest::MD5.hexdigest(uri.to_s)[0..5]}" if uri
9
11
 
10
- "#{WatchDoge.configuration.cookie_pool}/#{uuid}#{suffix}"
12
+ "#{WatchDoge.configuration.cookie_pool}/#{uid}#{suffix}"
11
13
  end
12
-
13
- # TODO: implement these two methods return Cookie object in future.
14
- # def save uuid, json
15
- # File.write source(uuid), json
16
- # end
17
-
18
- # def load uuid
19
- # return "" unless File.exist? source(uuid)
20
-
21
- # JSON.parse File.read(source(uuid))
22
- # end
23
14
  end
24
15
  end
25
16
  end
@@ -1,12 +1,22 @@
1
+ # generating diff image of two input image
2
+
3
+ # usage:
4
+ # diff_image = WatchDoge::ImageDiff.diff(chunky_png_image, another_chunky_png_image)
5
+
6
+ # spec:
7
+ # 1. input only accept ChunkyPNG::Image, output image is also ChunkyPNG::Image
8
+ # 2. Testing RGBA pixel by pixel. blending mask color if diff detected
9
+
10
+ # todo: should improve testing boundary for more accurate diff imagenot.
11
+
1
12
  module WatchDoge
2
13
  module ImageDiff
3
- OPACITY = 0.7
4
- HIGHLIGHT_COLOR = "#F163FF#{(OPACITY * 256).to_i.to_s(16).upcase}"
5
-
6
14
  class << self
7
- def diff input_image, reference_image
15
+ def diff input_image, reference_image, opacity: 0.7, mask_base_color: "#F163FF"
8
16
  return nil if input_image.pixels.hash == reference_image.pixels.hash
9
17
 
18
+ mask_color = mask_base_color.concat (opacity * 256).to_i.to_s(16).upcase
19
+
10
20
  dup_input_image = input_image.dup
11
21
 
12
22
  input_image.height.times do |y|
@@ -14,7 +24,7 @@ module WatchDoge
14
24
 
15
25
  if y >= reference_image.height
16
26
  pixels.each_with_index do |pixel, x|
17
- dup_input_image.compose_pixel(x, y, HIGHLIGHT_COLOR)
27
+ dup_input_image.compose_pixel(x, y, mask_color)
18
28
  end
19
29
  else
20
30
  reference_pixels = reference_image.row(y)
@@ -24,7 +34,7 @@ module WatchDoge
24
34
  pixels.each_with_index do |pixel, x|
25
35
  if pixels[x] != reference_pixels[x]
26
36
  dup_input_image.compose_pixel(x, y, reference_pixels[x])
27
- dup_input_image.compose_pixel(x, y, HIGHLIGHT_COLOR)
37
+ dup_input_image.compose_pixel(x, y, mask_color)
28
38
  end
29
39
  end
30
40
  end
@@ -16,23 +16,23 @@ module WatchDoge
16
16
  def push message
17
17
  case message
18
18
  when String
19
- _post _matter_most_meta(message)
19
+ post matter_most_meta(message)
20
20
  when ChunkyPNG::Image
21
- _post_file _matter_most_meta(message)
21
+ post_file matter_most_meta(message)
22
22
  end
23
23
  end
24
24
 
25
25
  private
26
26
 
27
- def _post meta
28
- Net::HTTP.post _api_uri('/posts'),
27
+ def post meta
28
+ Net::HTTP.post api_uri('/posts'),
29
29
  meta.to_json,
30
30
  "Content-Type" => "application/json",
31
31
  "Authorization" => "Bearer #{@auth_token}"
32
32
  end
33
33
 
34
- def _post_file meta
35
- uri = _api_uri("/files")
34
+ def post_file meta
35
+ uri = api_uri("/files")
36
36
 
37
37
  req = Net::HTTP::Post::Multipart.new uri.path, meta
38
38
  req.add_field("Authorization", "Bearer #{@auth_token}")
@@ -45,22 +45,22 @@ module WatchDoge
45
45
 
46
46
  file_id = JSON.parse(res)['file_infos'].first['id']
47
47
 
48
- _post_file_to_channel file_id
48
+ post_file_to_channel file_id
49
49
  end
50
50
 
51
- def _post_file_to_channel file_id
52
- _post({
51
+ def post_file_to_channel file_id
52
+ post({
53
53
  channel_id: @channel_id,
54
54
  message: 'file uploaded from WatchDoge',
55
55
  file_ids: [file_id]
56
56
  })
57
57
  end
58
58
 
59
- def _api_uri path
59
+ def api_uri path
60
60
  URI("#{@host}/api/v4#{path}")
61
61
  end
62
62
 
63
- def _matter_most_meta message
63
+ def matter_most_meta message
64
64
  case message
65
65
  when String
66
66
  {
@@ -5,13 +5,13 @@ require 'uri'
5
5
 
6
6
  module WatchDoge
7
7
  module Notification
8
- class Slack
8
+ class SlackWebhook
9
9
  def initialize opt
10
10
  @incoming_url = opt[:incoming_url]
11
11
  end
12
12
 
13
13
  def push message
14
- body = _slack_body(message).to_json
14
+ body = slack_body(message).to_json
15
15
  Net::HTTP.post URI(@incoming_url),
16
16
  body,
17
17
  "Content-Type" => "application/json"
@@ -19,7 +19,7 @@ module WatchDoge
19
19
 
20
20
  private
21
21
 
22
- def _slack_body message
22
+ def slack_body message
23
23
  case message
24
24
  when String
25
25
  {
@@ -1,15 +1,39 @@
1
+ # Notification send message to sources setting in configuration
2
+
3
+ # usage:
4
+ # WatchDoge::Notification.push(message)
5
+
6
+ # spec:
7
+ # 1. could adding custom sources
8
+ # 2. custom source MUST under WatchDoge::Notification namespace and having #push method
9
+
10
+ # for example:
11
+ # class WatchDoge::Notification::CustomSource
12
+ # # args passing from value of WatchDoge::Configuration.notifications['CustomSource']
13
+ # def initialize **args
14
+ # # implement your source setup
15
+ # end
16
+ #
17
+ # # called by WatchDoge::Notification.push(msg)
18
+ # def push msg
19
+ # # do your source push here
20
+ # end
21
+ # end
22
+
23
+ # built-in sources
24
+ require 'watchdoge/notification/slack_webhook'
25
+ require 'watchdoge/notification/matter_most'
26
+
1
27
  module WatchDoge
2
28
  module Notification
3
- Dir["#{File.expand_path File.dirname(__FILE__)}/notification/*.rb"].each {|file| require file }
4
-
5
29
  class << self
6
30
  def push message
7
31
  sources = WatchDoge.configuration.notifications
8
32
 
9
33
  raise "can't find notification sources in configuration" if sources.empty?
10
34
 
11
- sources.each do |source_sym, source_args|
12
- source_class = get_source_class source_sym
35
+ sources.each do |klass, source_args|
36
+ source_class = get_source_class klass
13
37
  source = source_class.new source_args
14
38
  source.push message
15
39
  end
@@ -17,8 +41,7 @@ module WatchDoge
17
41
 
18
42
  private
19
43
 
20
- def get_source_class source_sym
21
- klass = source_sym.to_s.split('_').collect(&:capitalize).join
44
+ def get_source_class klass
22
45
  "WatchDoge::Notification::#{klass}".constantize
23
46
  end
24
47
  end
@@ -6,13 +6,17 @@ module WatchDoge
6
6
  namespace :watchdoge do
7
7
  desc "generating reference images"
8
8
  task :make_reference => :environment do
9
- WatchDoge::Regression::Manager.make_reference
9
+ WatchDoge::Regression::Manager.run_all_scenarios :make_reference
10
10
  end
11
11
  desc "scrap screenshots and compare with reference images"
12
12
  task :regression => :environment do
13
- WatchDoge::Regression::Manager.regression
13
+ WatchDoge::Regression::Manager.run_all_scenarios :regression
14
14
  end
15
15
  end
16
16
  end
17
+
18
+ initializer "watchdoge.initialize" do |app|
19
+ WatchDoge.initialize!
20
+ end
17
21
  end
18
22
  end
@@ -1,3 +1,12 @@
1
+ # DSL for described regression scenario
2
+
3
+ # usage:
4
+ # compare 'https://google.com'
5
+
6
+ # spec: todo
7
+
8
+ # todo: finish document
9
+
1
10
  module WatchDoge
2
11
  module Regression
3
12
  module DSL
@@ -8,15 +17,14 @@ module WatchDoge
8
17
  end
9
18
 
10
19
  def sign_in_as resoruce
11
-
12
20
  puts "[sign_in_as] #{resoruce}"
13
- WatchDoge.hooks.sign_in.call(@worker, resoruce)
21
+ WatchDoge.configuration.sign_in_proc.call(@worker, resoruce)
14
22
 
15
23
  return unless block_given?
16
24
 
17
25
  yield(@worker)
18
26
  puts "sign_out #{resoruce}"
19
- WatchDoge.hooks.sign_out.call(@worker, resoruce)
27
+ WatchDoge.configuration.sign_out_proc.call(@worker, resoruce)
20
28
  end
21
29
 
22
30
  def with_viewport **kwargs
@@ -27,13 +35,7 @@ module WatchDoge
27
35
 
28
36
  def compare path, **kwargs
29
37
  path = URI.join(WatchDoge.configuration.host, path).to_s
30
-
31
- @reference_file_name =
32
- if kwargs[:with]
33
- kwargs[:with]
34
- else
35
- path.gsub(/\//, '_')
36
- end
38
+ @reference_file_name = WatchDoge::Regression::Utils.path_to_filename(kwargs[:with] || path)
37
39
 
38
40
  puts "[compare] #{path} #{ ('[with]'+ @reference_file_name) if kwargs[:with] }"
39
41
 
@@ -53,8 +55,24 @@ module WatchDoge
53
55
  })
54
56
  end
55
57
 
56
- @worker.resize_by_document(@view_port) do
57
- @regression_proc.call(@worker)
58
+ @worker.resize_by_viewport(@view_port) do
59
+ case @regression_flag
60
+ when :make_reference
61
+ puts " -> make reference images on worker #{@worker}"
62
+ @worker.screenshot.save reference_image
63
+ when :regression
64
+ puts " -> compare reference images on worker #{@worker}"
65
+ reference_image = WatchDoge::Regression::Utils.load_png self.reference_image
66
+ cycle_image = WatchDoge::Regression::Utils.load_png @worker.screenshot.png
67
+ diff = WatchDoge::ImageDiff.diff(cycle_image, reference_image)
68
+ if diff
69
+ if ENV['WATCHDOGE_DEBUG']
70
+ WatchDoge::Notification.push cycle_image
71
+ WatchDoge::Notification.push reference_image
72
+ end
73
+ WatchDoge::Notification.push diff
74
+ end
75
+ end
58
76
  end
59
77
 
60
78
  @teardown_proc.call if @teardown_proc
@@ -1,33 +1,41 @@
1
+ # this file is part of Regression, mostly helpers methods
2
+
1
3
  require 'digest'
2
4
 
3
5
  module WatchDoge
4
6
  module Regression
5
7
  module Utils
6
- def load_png input
7
- raise 'Invalid Input' unless input.respond_to? :length
8
+ class << self
9
+ def load_png input
10
+ raise 'Invalid Input' unless input.respond_to? :length
8
11
 
9
- png_magic = ["89", "50", "4E", "47"]
12
+ png_magic = ["89", "50", "4E", "47"]
10
13
 
11
- is_png_blob =
12
- (input.length > 3 && input[0..3].each_byte.map {|t| t.to_s(16).upcase} == png_magic)
14
+ is_png_blob =
15
+ (input.length > 3 && input[0..3].each_byte.map {|t| t.to_s(16).upcase} == png_magic)
13
16
 
14
- if is_png_blob
15
- ChunkyPNG::Image.from_blob input
16
- else
17
- ChunkyPNG::Image.from_file input
17
+ if is_png_blob
18
+ ChunkyPNG::Image.from_blob input
19
+ else
20
+ ChunkyPNG::Image.from_file input
21
+ end
18
22
  end
19
- end
20
23
 
21
- def regression_dir
22
- WatchDoge.configuration.regression_dir
23
- end
24
+ def path_to_filename path
25
+ path.gsub(/\//, '_')
26
+ end
24
27
 
25
- def scenarios_dir
26
- "#{regression_dir}/scenarios"
27
- end
28
+ def regression_dir
29
+ WatchDoge.configuration.regression_dir
30
+ end
31
+
32
+ def scenarios_dir
33
+ "#{regression_dir}/scenarios"
34
+ end
28
35
 
29
- def reference_dir
30
- "#{regression_dir}/reference"
36
+ def reference_dir
37
+ "#{regression_dir}/reference"
38
+ end
31
39
  end
32
40
  end
33
41
  end
@@ -1,62 +1,44 @@
1
+ # Regression testing realtime screenshot with reference images for scenario described by DSL
2
+
3
+ # usage:
4
+ # WatchDoge::Regression.run_all_scenarios(:make_reference)
5
+ # WatchDoge::Regression.run_all_scenarios(:regression)
6
+
7
+ # spec:
8
+ # 1. rake tasks `rake watchdoge:make_reference` and `rake watchdoge:regression` while in Rails
9
+ # 2. generate scenario template by Rails generator
10
+
11
+ # todo: support run single scenario
12
+
13
+ require 'watchdoge/regression/dsl'
14
+ require 'watchdoge/regression/utils'
15
+
1
16
  module WatchDoge
2
17
  module Regression
3
- Dir["#{File.expand_path File.dirname(__FILE__)}/regression/*.rb"].each {|file| require file }
4
-
5
18
  class Manager
6
- extend WatchDoge::Regression::Utils
7
19
  include WatchDoge::Regression::DSL
8
20
 
9
21
  class << self
10
- def regression
11
- run_all_scenarios :regression
12
- end
13
- def make_reference
14
- run_all_scenarios :make_reference
15
- end
16
-
17
- private
18
-
19
22
  def run_all_scenarios regression_flag
20
- WatchDoge.hooks.before_regression.call
23
+ WatchDoge.hooks.before_regression.each { |t| t.call }
21
24
 
22
- Dir["#{scenarios_dir}/*"].each do |scenario_path|
23
- WatchDoge.hooks.before_scenario.call
25
+ Dir["#{WatchDoge::Regression::Utils.scenarios_dir}/*"].each do |scenario_path|
26
+ WatchDoge.hooks.before_scenario.each { |t| t.call }
24
27
 
25
28
  mgr = self.new scenario_path, regression_flag: regression_flag
26
29
  mgr.eval_scenario
27
30
 
28
- WatchDoge.hooks.after_scenario.call
31
+ WatchDoge.hooks.after_scenario.each { |t| t.call }
29
32
  end
30
33
 
31
- WatchDoge.hooks.after_regression.call
34
+ WatchDoge.hooks.after_regression.each { |t| t.call }
32
35
  end
33
36
  end
34
37
 
35
38
  def initialize scenario_path, regression_flag:
36
39
  @scenario_path = scenario_path
37
40
  @scenario_name = File.basename @scenario_path, '.rb'
38
-
39
- case regression_flag
40
- when :make_reference
41
- @regression_proc = -> (worker) {
42
- puts " -> make reference images on worker #{worker}"
43
- worker.screenshot.save reference_image
44
- }
45
- when :regression
46
- @regression_proc = -> (worker) {
47
- puts " -> compare reference images on worker #{worker}"
48
- reference_image = self.class.load_png self.reference_image
49
- cycle_image = self.class.load_png worker.screenshot.png
50
- diff = WatchDoge::ImageDiff.diff(cycle_image, reference_image)
51
- if diff
52
- if ENV['WATCHDOGE_DEBUG']
53
- WatchDoge::Notification.push cycle_image
54
- WatchDoge::Notification.push reference_image
55
- end
56
- WatchDoge::Notification.push diff
57
- end
58
- }
59
- end
41
+ @regression_flag = regression_flag
60
42
 
61
43
  @setup_proc = nil
62
44
  @teardown_proc = nil
@@ -75,7 +57,7 @@ module WatchDoge
75
57
  end
76
58
 
77
59
  def reference_image
78
- self.class.reference_dir + "/#{@scenario_name}/#{@reference_file_name}.png"
60
+ WatchDoge::Regression::Utils.reference_dir + "/#{@scenario_name}/#{@reference_file_name}.png"
79
61
  end
80
62
  end
81
63
  end
@@ -1,3 +1,4 @@
1
+ # Version of WatchDoge
1
2
  module WatchDoge
2
- Version = '0.1.3'
3
+ VERSION = '0.1.4'
3
4
  end
@@ -1,8 +1,16 @@
1
+ # WebdriverManager setup specific version of webdriver in configuration for Selenium
2
+
3
+ # usage:
4
+ # WatchDoge.configuration.firefox_version = '0.17.0'
5
+ # WatchDoge::WebdriverManager.new(:firefox)
6
+
7
+ # todo: shouldn't this class singleton with #setup instead of initializing instance?
8
+
1
9
  require 'net_http_ssl_fix'
2
10
  require 'webdrivers'
3
11
 
4
12
  module WatchDoge
5
- class InstallManager
13
+ class WebdriverManager
6
14
  attr_reader :driver
7
15
  attr_reader :install_version
8
16
  attr_reader :install_path
@@ -16,7 +24,7 @@ module WatchDoge
16
24
  Webdrivers::Geckodriver
17
25
  end
18
26
 
19
- @install_version = (eval "WatchDoge.configuration.#{browser}_version") || @driver.latest_version.to_s
27
+ @install_version = WatchDoge.configuration.send("#{browser}_version") || @driver.latest_version.to_s
20
28
 
21
29
  @install_path = "#{WatchDoge.configuration.web_drivers_dir}/#{browser}/#{@install_version}/"
22
30
  Webdrivers.install_dir = @install_path
@@ -1,45 +1,70 @@
1
+ # Worker contains Selenium browser interface. and installing required WebDriver binaries
2
+
3
+ # usage:
4
+ # worker = WatchDoge::Worker.new("WORKER_NAME")
5
+ # worker.goto "http://google.com"
6
+ # screenshot = worker.fullpage_screenshot
7
+
8
+ # spec:
9
+ # 1. Worker instance having customized configuration Selenium as its engine
10
+ # 2. Worker engine default to headless mode
11
+ # 3. Worker passing all missing method to its engine
12
+
13
+ # todo:
14
+ # 1. improve or remove cookie related functions, is it necessary for frontend regression?
15
+
1
16
  module WatchDoge
2
17
  class Worker
3
- def initialize uuid, opt={}
4
- _before_initialize
5
- @http.read_timeout = opt.delete(:timeout) || WatchDoge.configuration.http_timeout
6
- @uuid = uuid
18
+ # options:
19
+ # 1. width: browser's width, default to 1280
20
+ # 2. height: browser's height, default to 768
21
+ # 3. http_client: instance of Selenium::WebDriver::Remote::Http
22
+ # 4. all acceptable arguments of Watir::Browser class
23
+ def initialize uid, options={}
24
+ @http = Selenium::WebDriver::Remote::Http::Default.new
25
+ @browser = WatchDoge.configuration.browser
26
+
27
+ # HTTP timeout default to 120 sec
28
+ @http.read_timeout = options.delete(:timeout) || WatchDoge.configuration.http_timeout
29
+
30
+ @uid = uid
7
31
 
8
- default_opt = {
32
+ default_options = {
9
33
  width: 1280,
10
34
  height: 768,
11
35
  headless: true,
36
+
37
+ # Selenium HTTP configuration
12
38
  http_client: @http
13
- }.merge(opt).merge(_browser_profile)
39
+ }.merge(options).merge(browser_profile)
14
40
 
15
- WatchDoge::InstallManager.new @browser
16
- @core = WatchDoge.configuration.engine.new @browser, default_opt
41
+ # intall required version driver
42
+ WatchDoge::WebdriverManager.new @browser
43
+ @core = WatchDoge.configuration.engine.new @browser, default_options
17
44
 
18
45
  # for generate uri hash
19
46
  @landed_page = nil
20
47
 
21
- # autosafe cookies while worker closed
22
- @cookie_autosafe = false
48
+ # autosaving cookies while worker closed
49
+ @cookie_autosave = false
23
50
 
24
51
  # flag for cookies loaded
25
52
  @cookie_loaded = false
26
53
 
27
- # initilize width/height
28
- @width = default_opt[:width]
29
- @height = default_opt[:height]
54
+ # width/height
55
+ @width = default_options[:width]
56
+ @height = default_options[:height]
30
57
  @core.window.resize_to @width, @height
31
-
32
- _after_initialize
33
58
  end
34
59
 
35
60
  def fullpage_screenshot **kwargs
36
- resize_by_document(kwargs) do |resize|
61
+ resize_by_viewport(kwargs) do |resize|
37
62
  return resize.screenshot
38
63
  end
39
64
  end
40
65
 
41
66
  def close
42
- _save_cookie
67
+ save_cookie
43
68
  @core.close
44
69
  end
45
70
 
@@ -48,17 +73,12 @@ module WatchDoge
48
73
 
49
74
  @landed_page = uri
50
75
 
51
- _load_cookie unless _cookie_loaded?
76
+ load_cookie unless cookie_loaded?
52
77
 
53
78
  @core.refresh
54
79
  end
55
80
 
56
- # for dev only
57
- def core
58
- @core
59
- end
60
-
61
- def resize_by_document **kwargs
81
+ def resize_by_viewport **kwargs
62
82
  width = (kwargs.delete :width) || @core.body.width
63
83
  height = (kwargs.delete :height) || @core.body.height
64
84
 
@@ -84,13 +104,8 @@ module WatchDoge
84
104
  end
85
105
 
86
106
  private
87
- # callbacks before/after init
88
- def _before_initialize
89
- @http = Selenium::WebDriver::Remote::Http::Default.new
90
- @browser = WatchDoge.configuration.browser
91
- end
92
107
 
93
- def _browser_profile
108
+ def browser_profile
94
109
  case @browser
95
110
  when :chrome
96
111
  prefs = {}
@@ -102,35 +117,36 @@ module WatchDoge
102
117
  }
103
118
  when :firefox
104
119
  profile = Selenium::WebDriver::Firefox::Profile.new
120
+
121
+ # basically, firefox default sanbox level to 4, which denied access to most folders
122
+ # that broken many env config such as FONTCONFIG_PATH
105
123
  profile['security.sandbox.content.level'] = 2
106
- profile['network.dns.disableIPv6'] = true
107
124
  {
108
125
  profile: profile
109
126
  }
110
127
  end
111
128
  end
112
129
 
113
- def _after_initialize
114
- end
115
-
116
- # for cookie load/save
117
- def _cookie_loaded?
130
+ # Cookies
131
+ def cookie_loaded?
118
132
  @cookie_loaded
119
133
  end
120
- def _save_cookie
121
- if @cookie_autosafe
122
- @core.cookies.save WatchDoge::CookiePool.source(@uuid, @landed_page)
134
+
135
+ def save_cookie
136
+ if @cookie_autosave
137
+ @core.cookies.save WatchDoge::CookiePool.source(@uid, @landed_page)
123
138
  end
124
139
  end
125
- def _load_cookie
126
- source = WatchDoge::CookiePool.source(@uuid, @landed_page)
140
+
141
+ def load_cookie
142
+ source = WatchDoge::CookiePool.source(@uid, @landed_page)
127
143
  return unless File.exist? source
128
144
 
129
145
  @core.cookies.load source
130
146
  @cookie_loaded = true
131
147
  end
132
148
 
133
- # try delegate all methods to @core
149
+ # try delegate all missing methods to selenium
134
150
  def method_missing(method_name, *args)
135
151
  result = @core.__send__(method_name, *args)
136
152
 
data/lib/watchdoge.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'pry'
2
- require 'watchdoge/install'
2
+ require 'watchdoge/webdriver_manager'
3
3
  require 'watchdoge/version'
4
4
  require 'watchdoge/configuration'
5
5
  require 'watchdoge/cookie_pool'
@@ -26,18 +26,18 @@ module WatchDoge
26
26
  end
27
27
 
28
28
  def configuration
29
- @_configuration ||= Configuration.new
29
+ @configuration ||= Configuration.new
30
30
  end
31
31
 
32
32
  def initialize!
33
- path = ENV['WATCHDOGE_CONFIG'] ||
33
+ config_file = ENV['WATCHDOGE_CONFIG'] ||
34
34
  if defined?(Rails)
35
- "#{Dir.pwd}/config/watchdoge.rb"
35
+ "#{Rails.root}/config/watchdoge.rb"
36
36
  else
37
37
  "#{Dir.pwd}/watchdoge.rb"
38
38
  end
39
39
 
40
- load path
40
+ load config_file
41
41
  end
42
42
  end
43
43
  end
data/watchdoge.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'watchdoge'
3
- s.version = '0.1.3'
3
+ s.version = '0.1.4'
4
4
  s.date = '2019-07-22'
5
5
  s.summary = "dogi"
6
6
  s.description = "A collection of web test tools"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watchdoge
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shen Lee
@@ -115,16 +115,16 @@ files:
115
115
  - lib/watchdoge/configuration.rb
116
116
  - lib/watchdoge/cookie_pool.rb
117
117
  - lib/watchdoge/image_diff.rb
118
- - lib/watchdoge/install.rb
119
118
  - lib/watchdoge/notification.rb
120
119
  - lib/watchdoge/notification/matter_most.rb
121
- - lib/watchdoge/notification/slack.rb
120
+ - lib/watchdoge/notification/slack_webhook.rb
122
121
  - lib/watchdoge/rails/generator.rb
123
122
  - lib/watchdoge/rails/railtie.rb
124
123
  - lib/watchdoge/regression.rb
125
124
  - lib/watchdoge/regression/dsl.rb
126
125
  - lib/watchdoge/regression/utils.rb
127
126
  - lib/watchdoge/version.rb
127
+ - lib/watchdoge/webdriver_manager.rb
128
128
  - lib/watchdoge/worker.rb
129
129
  - watchdoge.gemspec
130
130
  homepage: