true_automation 0.3.18 → 0.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 44ca6e8ad7d27d427c2eb8f9ab88ec47b45c608b
4
- data.tar.gz: 61a40e7da600632b06fdb544f313768760dfd003
2
+ SHA256:
3
+ metadata.gz: bfbcc2e493c1522b04336e00792f54959faa29a725c782d0059a32cf278a10ea
4
+ data.tar.gz: d981ad6cfdf86e844fdf04df0ce1fd4dc9d318f06076d9d1585a46bdf20dbfdd
5
5
  SHA512:
6
- metadata.gz: de8b7948f32793100823dd8c12170bcf67da2741ba25a64d87edb93426a29c1f766737f5967d2f46b6c89b4690f45acdc33e8a94c009f730258ec18fac59696b
7
- data.tar.gz: 36ce4d0a8613fd5743bc25f53ecd73e9db9ee7ff02c6b78ad8501ec90f4d620da2b11f42c7fa339648f2479ea00196e0c998491d80fa72c6e9f09bf35c7cfce5
6
+ metadata.gz: 587a9f58f8fd6d32e6ae6f703571c340816108df83a57a90a05708328c9f506673fe16a886c58ea8f1cb88b09751dd2e96a3fbea7b7bfb166be26ffdffa91a23
7
+ data.tar.gz: bb8a4aaf3cc04a103925ca51c82c2676d5d3b8e770ed0dd674c49c1f2e7b7095ae0c5cc5c79691c3944f8708aa5ee7af0aeedd148b1b61601d80b7f2d91cc39d
@@ -8,11 +8,13 @@ module TrueAutomation
8
8
  @pid = nil
9
9
 
10
10
  def start(options)
11
-
12
- @port = options[:port] || 9515
11
+ @port = options[:port]
13
12
  remote = options[:remote]
13
+ ta_debug = options[:ta_debug]
14
14
 
15
- if options[:driver]
15
+ if options[:ta_service]
16
+ driver_path = " --driver #{options[:ta_service]}"
17
+ elsif options[:driver]
16
18
  driver_path = " --driver #{options[:driver]}"
17
19
  driver_path += " --driver-version #{options[:driver_version]}" if options[:driver_version]
18
20
  end
@@ -29,19 +31,22 @@ module TrueAutomation
29
31
  Dir.mkdir('log') unless File.exist?('log')
30
32
  logfile = "log/trueautomation-#{Time.now.strftime('%Y%m%dT%H%M%S')}.log"
31
33
 
32
- @pid = spawn("#{@executable} --log-file #{logfile} --port #{@port}#{driver_path}#{remote}")
34
+ @pid = spawn("#{@executable} --log-file #{logfile} --port #{@port}#{driver_path}#{remote}#{ta_debug}")
33
35
  puts "Started TrueAutomation.IO client with pid #{@pid} listening to port #{@port}"
34
36
 
35
37
  @pid
36
38
  end
37
39
 
38
40
  def stop
39
- if @pid
40
- puts "Stopping TrueAutomation.IO Client with pid #{@pid}"
41
- uri = URI("http://localhost:#{@port}/shutdown")
42
- Net::HTTP.get(uri)
41
+ begin
42
+ if @pid
43
+ puts "Stopping TrueAutomation.IO Client with pid #{@pid}"
44
+ uri = URI("http://localhost:#{@port}/shutdown")
45
+ Net::HTTP.get(uri)
43
46
 
44
- @pid = nil
47
+ @pid = nil
48
+ end
49
+ rescue
45
50
  end
46
51
  end
47
52
 
@@ -1,4 +1,65 @@
1
1
  require_relative '../client'
2
+ module Capybara
3
+ module Queries
4
+ class SelectorQuery
5
+ alias_method :original_description, :description
6
+ def description(only_applied = false)
7
+ desc = original_description
8
+ matched_result = desc.match(/.*__taonly__(.+)__taonly__.*/)
9
+ if selector = matched_result && matched_result[1]
10
+ desc = "Element was not found on the page. Element '#{selector}' with such locator is not on this page and could not be detected by TrueAutomation."
11
+ end
12
+ matched_result_ta = desc.match(/visible\s(.+)\s\"(.*)__ta__(.+)__ta__.*/)
13
+ if matched_result_ta && matched_result_ta[3]
14
+ desc = "Unable to locate element { using: '#{matched_result_ta[1]}', selector: '#{matched_result_ta[2]}' }"
15
+ end
16
+ desc
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ module Capybara
23
+ module Node
24
+ module Finders
25
+ private
26
+ alias_method :original_synced_resolve, :synced_resolve
27
+ def synced_resolve(query)
28
+ begin
29
+ original_synced_resolve(query)
30
+ rescue Capybara::ElementNotFound => ex
31
+ raise Capybara::ElementNotFound, query.applied_description if query.locator.match(/.*__ta(only)*__(.+)__ta(only)*__.*/)
32
+ raise Capybara::ElementNotFound, ex
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ module Capybara
40
+ module Node
41
+ class Element < Base
42
+ def innerHTML=(value)
43
+ synchronize { base.innerHTML=(value) }
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ class Capybara::Selenium::Node < Capybara::Driver::Node
50
+ def innerHTML=(value)
51
+ driver.evaluate_script SET_INNER_HTML_SCRIPT, self, value
52
+ end
53
+
54
+ private
55
+
56
+ SET_INNER_HTML_SCRIPT = <<~'JS'
57
+ (function(el, val){
58
+ el.innerHTML = val;
59
+ return;
60
+ })(arguments[0], arguments[1])
61
+ JS
62
+ end
2
63
 
3
64
  module TrueAutomation
4
65
  class RecordNotFound < StandardError; end
@@ -6,10 +67,20 @@ module TrueAutomation
6
67
  module Driver
7
68
  class Capybara < Capybara::Selenium::Driver
8
69
  def initialize(app, **options)
9
- @port = options.delete(:port) || 9515
70
+ options = fetch_options(options)
71
+ @port = options.delete(:port) || find_available_port('localhost')
10
72
  @driver = options.delete(:driver)
11
73
  @driver_version = options.delete(:driver_version)
12
74
 
75
+ if options && options[:ta_debug]
76
+ @ta_debug = ' --ta-debug'
77
+ options.delete(:ta_debug)
78
+ end
79
+
80
+ if options[:ta_service]
81
+ @ta_service = options.delete(:ta_service)
82
+ end
83
+
13
84
  super(app, options)
14
85
 
15
86
  @ta_client = TrueAutomation::Client.new
@@ -18,8 +89,7 @@ module TrueAutomation
18
89
  options ||= {}
19
90
  ta_url = options[:ta_url] || "http://localhost:#{@port}/"
20
91
 
21
- capabilities = options[:desired_capabilities]
22
- capabilities ||= {}
92
+ capabilities = options[:desired_capabilities] || {}
23
93
 
24
94
  if options and options[:browser] == :remote
25
95
  raise 'Remote driver URL is not specified' unless options[:url]
@@ -36,39 +106,59 @@ module TrueAutomation
36
106
 
37
107
  def browser
38
108
  unless @browser
39
- @ta_client.start(port: @port, remote: @remote, driver: @driver, driver_version: @driver_version)
109
+ @ta_client.start(port: @port,
110
+ remote: @remote,
111
+ ta_debug: @ta_debug,
112
+ driver: @driver,
113
+ ta_service_path: @ta_service&.executable_path,
114
+ driver_version: @driver_version)
40
115
 
41
116
  @ta_client.wait_until_start
42
117
 
43
118
  at_exit do
44
119
  @ta_client.stop
45
120
  end
46
-
47
121
  super
48
122
  end
49
123
  @browser
50
124
  end
51
125
 
52
- def find_css(selector)
53
- res = super
54
- check_selector(selector) if !res || res.empty?
55
- res
126
+ def quit
127
+ super
128
+ @ta_client.stop
56
129
  end
57
130
 
58
- def find_xpath(selector)
59
- res = super
60
- check_selector(selector) if !res || res.empty?
61
- res
131
+ def specialize_driver(*args)
132
+ if ::Capybara::Selenium::Driver.respond_to?(:register_specialization)
133
+ browser_type = browser.browser
134
+ # Original method uses self.class, and all classes use Capybara::Selenium::Driver.
135
+ # Thereby no specializations in the list for TA driver class and error occured.
136
+ ::Capybara::Selenium::Driver.specializations.select { |k, _v| k === browser_type }.each_value do |specialization| # rubocop:disable Style/CaseEquality
137
+ extend specialization
138
+ end
139
+ else
140
+ super
141
+ end
62
142
  end
63
143
 
64
144
  private
65
-
66
- def check_selector(selector)
67
- if ta_selector_match = selector.match(/__taonly__(.+)__taonly__/)
68
- error_text = "Element '#{ta_selector_match[1]}' was not found in database. " +
69
- 'Please provide a selector to find and initialize element.'
70
- raise TrueAutomation::RecordNotFound, error_text
145
+ def fetch_options(options)
146
+ if options.key?(:options)
147
+ browser = options[:options].class.name.split('::')[2]
148
+ desCaps = Selenium::WebDriver::Remote::Capabilities.send(browser.downcase)
149
+ opts = options[:options].as_json
150
+ desCaps[opts.keys.first] = opts[opts.keys.first]
151
+ options[:desired_capabilities] = desCaps
152
+ options.delete(:options)
71
153
  end
154
+ options
155
+ end
156
+
157
+ def find_available_port(host)
158
+ server = TCPServer.new(host, rand(9515..65515))
159
+ server.addr[1]
160
+ ensure
161
+ server&.close
72
162
  end
73
163
  end
74
164
  end
@@ -1,3 +1,3 @@
1
1
  module TrueAutomation
2
- VERSION = '0.3.18'
2
+ VERSION = '0.5.5'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: true_automation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.18
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - TrueAutomation.IO
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-18 00:00:00.000000000 Z
11
+ date: 2020-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,8 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
110
  requirements: []
111
- rubyforge_project:
112
- rubygems_version: 2.5.2
111
+ rubygems_version: 3.0.8
113
112
  signing_key:
114
113
  specification_version: 4
115
114
  summary: TrueAutomation.IO