marta 0.28879 → 0.29156

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
  SHA1:
3
- metadata.gz: 50b24bc2c301985ae455018ce3c4daf56f39986a
4
- data.tar.gz: 97486b64df6b76156979309461bbd3f0cf5aadad
3
+ metadata.gz: fd0d99204224a1b096fe1d9a103ed94c141f33e6
4
+ data.tar.gz: 92effa54d30743c5718bbcd2fd047143b970e05f
5
5
  SHA512:
6
- metadata.gz: be9b83c7c361143334621a076b62251b7da1744dd783cca86bc9f6b4d5b72029318e465c671d01812572fe4c5ae6192447b0acd20ff47694acdaec89ec87d1fb
7
- data.tar.gz: 73d0368e435ed0016d0866ec6c564832d954b290c029713417ee9ad9d0c8ac179faa1e32b0920999dbff4e64eca2d35028a93b7107728d832917e2713a87b6d3
6
+ metadata.gz: 934ff2dcfa6abf910a4f74be6c95826a36cd5c16b1fb06eb35491c8c02a781672b1bf3804099e04d6d8647bc89bf580f7a53b7d60cf9f7c585bbb71f2d3a46dc
7
+ data.tar.gz: 4debddeef970b3634ccbd73ddcf29ec0e2d1ea2386f4ed19c7d4ef344c862b0c425510c287bba5b746691373eef345b6375c4f9a75a6fbfe0f34f57f8d27b429
data/README.md CHANGED
@@ -206,7 +206,7 @@ g_page.search "I am in love with selenium."
206
206
 
207
207
  **Q: What else?**
208
208
 
209
- *A: Nothing. Marta is under development. Her version is 0.28879 only. And I am not a professional developer. But I am training her on new tricks.*
209
+ *A: Nothing. Marta is under development. Her version is 0.29156 only. And I am not a professional developer. But I am training her on new tricks.*
210
210
 
211
211
  ## Internal Design
212
212
 
data/lib/marta.rb CHANGED
@@ -25,6 +25,9 @@ module Marta
25
25
  include OptionsAndPaths, ReadWrite, Json2Class
26
26
 
27
27
  class SmartPage
28
+
29
+ attr_accessor :data, :class_name, :edit_mark
30
+
28
31
  include BlackMagic, XPath, SimpleElementFinder, ClassesCreation,
29
32
  PublicMethods, Dialogs, Injector, Lightning, OptionsAndPaths,
30
33
  Json2Class, ReadWrite, UserValuePrework
@@ -25,9 +25,10 @@ module Marta
25
25
  # @note It is believed that no user will use it
26
26
  class MagicFinder < BasicFinder
27
27
 
28
- def initialize(meth, engine, tolerancy, requestor)
28
+ def initialize(meth, tolerancy, requestor)
29
29
  @tolerancy = tolerancy
30
- super(meth, engine, requestor)
30
+ @engine = requestor.engine
31
+ super(meth, requestor)
31
32
  end
32
33
 
33
34
  # We can prefind an element and wait for it.
@@ -140,7 +141,7 @@ module Marta
140
141
 
141
142
  # Marta can find something when data is incorrect (by Black magick)
142
143
  def marta_magic_finder(meth)
143
- finder = MagicFinder.new(meth, engine, tolerancy_value, self)
144
+ finder = MagicFinder.new(meth, tolerancy_value, self)
144
145
  finder.find
145
146
  end
146
147
  end
@@ -21,12 +21,16 @@
21
21
  <div martastyle=buttons_holder martaclass=marta_smthing>
22
22
  <input type=button martaclass=marta_smthing id=marta_confirm martastyle=confirm_button onclick=marta_end_loop(); value=Confirm />
23
23
  <input type=button martaclass=marta_smthing id=marta_set_by_hand martastyle=action_button onclick=marta_set_by_hand(); value="Set by hand" />
24
+ <input type=button martaclass=marta_smthing id=marta_show_html martastyle=action_button onclick=marta_show_html(); value="Find in html" />
24
25
  </div>
25
26
  </div>
26
27
  <div id=marta_s_element_type martaclass=marta_smthing martastyle=options_holder>
27
28
  <div martaclass=marta_smthing class=label id=marta_element_label>What we are looking for (one element or group?)</div>
28
29
  <label martaclass=marta_smthing><input type=checkbox id=marta_array martaclass=marta_smthing>Collection</label>
29
30
  </div>
31
+ <div martaclass=marta_smthing martastyle=html_content>
32
+ <div martaclass=marta_smthing id=marta_s_html_holder readonly=true>Enable HTML selector by Find in html button. NOTE: It is highly experimental.</div>
33
+ </div>
30
34
  <div martastyle=table_headers martaclass=marta_smthing>
31
35
  <input type=text martaclass=marta_smthing martastyle=name_field value=attribute_name disabled=disabled;>
32
36
  <input martaclass=marta_smthing martastyle=value_field type=text value=default_value disabled=disabled;>
@@ -61,11 +61,7 @@ function marta_change_field(field){
61
61
  };
62
62
 
63
63
  function marta_clean_up(){
64
- var toClear = document.body.querySelectorAll("[martaclass=marta_div]");
65
- for (var i = 0; i < toClear.length; i++) {
66
- toClear[i].parentNode.removeChild(toClear[i]);
67
- };
68
- var toClear = document.body.querySelectorAll("[martaclass=marta_script]");
64
+ var toClear = document.body.querySelectorAll("[martaclass=marta_div],[martaclass=marta_script],[martaclass=marta_style]");
69
65
  for (var i = 0; i < toClear.length; i++) {
70
66
  toClear[i].parentNode.removeChild(toClear[i]);
71
67
  };
@@ -119,6 +115,51 @@ function marta_add_data() {
119
115
  };
120
116
  };
121
117
 
118
+ function marta_show_html() {
119
+ var area = document.getElementById("marta_s_html_holder");
120
+ area.innerHTML = spaninize(document.documentElement.innerHTML);
121
+ };
122
+
123
+ function marta_touch(element) {
124
+ var control = element.textContent.replace(/</g,"&lt;").replace(/>/g,"&gt;");
125
+ var everything = document.getElementsByTagName("*");
126
+ for (var i=0, max=everything.length; i < max; i++) {
127
+ var check = everything[i].outerHTML.replace(/</g,"&lt;").replace(/>/g,"&gt;");
128
+ if (check == control) {
129
+ everything[i].click();
130
+ };
131
+ };
132
+ };
133
+
134
+ function wrap(el, wrapper) {
135
+ wrapper.appendChild(el.cloneNode(true));
136
+ el.parentNode.replaceChild(wrapper, el);
137
+ };
138
+
139
+ function spaninize(string) {
140
+ var dummy = document.createElement( "marta_span" );
141
+ dummy.innerHTML = string;
142
+ ignore = dummy.querySelectorAll("[martaclass=marta_div],[martaclass=marta_script],[martaclass=marta_style]");
143
+ for (var i = 0; i < ignore.length; i++) {
144
+ ignore[i].parentNode.removeChild(ignore[i]);
145
+ };
146
+ dummy.setAttribute("martaclass", "marta_smthng");
147
+ var counter = {};
148
+ var everything = dummy.getElementsByTagName("*");
149
+ for (var i=0, max=everything.length; i < 2*max; i=i+2) {
150
+ if (counter[everything[i].tagName] == null) {
151
+ counter[everything[i].tagName] = 0;
152
+ } else {
153
+ counter[everything[i].tagName] = counter[everything[i].tagName] + 1;
154
+ };
155
+ var wrapper = document.createElement( "marta_span" );
156
+ wrapper.setAttribute("martaclass","marta_smthing");
157
+ wrapper.setAttribute("onclick","marta_touch(this);");
158
+ wrap(everything[i], wrapper);
159
+ };
160
+ return dummy.innerHTML.replace(/<(?!.?marta_span)([^>]*)>/g,"&lt;$1&gt;").replace(/marta_span/g,"span");
161
+ };
162
+
122
163
  function marta_click_work(e, iframe=false) {
123
164
  if (iframe == false){
124
165
  e = e || window.event;
@@ -1,6 +1,6 @@
1
1
  function marta_add_data(){
2
2
  document.getElementById("title").innerHTML = marta_what;
3
- old_marta_Data.innerHTML = old_marta_Data.id
3
+ document.getElementById(old_marta_Data).innerHTML = old_marta_Data;
4
4
  };
5
5
  var marta_result = "";
6
6
  var marta_confirm_mark = false;
@@ -14,6 +14,7 @@
14
14
  <p>So if you have defined <b>something</b> and you wanna use the value of it in the other var you should write <b>#{@something}</b></p>
15
15
  <p>You should set a var with the <b>url</b> name if you are gonna use <b>your_page.open_page</b> method later</p>
16
16
  <p>Your values provided here will be default for your page_object but you can change it like <b>your_page.your_var = newvalue</b></p>
17
+ <p>NEVER USE AS A VAR NAME:<b>class_name, open_page, data, engine, edit_mark ,method_edit, method_missing</b></p>
17
18
  </div>
18
19
  </div>
19
20
  <div id=marta_s_content martastyle=main_content>
@@ -212,6 +212,27 @@ div[martastyle=hint] {
212
212
  margin: 0 auto;
213
213
  }
214
214
 
215
+ div[martastyle=html_content]{
216
+ text-align: center;
217
+ }
218
+
219
+ div[martastyle=html_content] div {
220
+ background-color: #D7F6F5;
221
+ text-align: center;
222
+ padding: 5px;
223
+ border-style: solid;
224
+ border-width: 1px;
225
+ width: 90%
226
+ }
227
+
228
+ div[martastyle=html_content] div span {
229
+ display: block;
230
+ position: relative;
231
+ left: 30px;
232
+ text-align: left;
233
+ cursor: pointer;
234
+ }
235
+
215
236
  div[martaclass=marta_div] b {
216
237
  color: red;
217
238
  }
data/lib/marta/dialogs.rb CHANGED
@@ -21,13 +21,13 @@ module Marta
21
21
  # @note It is believed that no user will use it
22
22
  class MethodSpeaker
23
23
 
24
- include XPath, Lightning, Injector, PublicMethods
24
+ include XPath, Lightning, Injector, PublicMethods, SimpleElementFinder
25
25
 
26
- def initialize(class_name, method_name, data, requestor)
27
- @class_name = class_name
26
+ def initialize(method_name, requestor)
27
+ @class_name = requestor.class_name
28
28
  @method_name = method_name
29
- @data = data
30
- @title = class_name+ '.' + method_name.to_s
29
+ @data = requestor.data
30
+ @title = @class_name+ '.' + method_name.to_s
31
31
  @requestor = requestor
32
32
  @found = 0
33
33
  @attrs = @data['meths'][@method_name]
@@ -35,8 +35,8 @@ module Marta
35
35
  end
36
36
 
37
37
  # Standart question
38
- def ask(what, title = 'Some title', data = Hash.new)
39
- inject(what, title, data)
38
+ def ask(what, title = 'Some title', data = Hash.new, vars = Array.new)
39
+ inject(what, title, data, vars)
40
40
  end
41
41
 
42
42
  # Was something stated by user?
@@ -69,7 +69,7 @@ module Marta
69
69
  xpath_meth_merge
70
70
  end
71
71
  end
72
-
72
+
73
73
  # Asking: "What are you looking for?"
74
74
  def ask_for_elements
75
75
  ask 'element', "Found #{@found} elements for #{@title}", @attrs
@@ -149,10 +149,10 @@ module Marta
149
149
  end
150
150
 
151
151
  # Method definition process
152
- def user_method_dialogs(my_class_name, method_name, data)
153
- dialog_master = MethodSpeaker.new(my_class_name, method_name, data, self)
152
+ def user_method_dialogs(method_name)
153
+ dialog_master = MethodSpeaker.new(method_name, self)
154
154
  data = dialog_master.dialog
155
- file_write(my_class_name.to_s, data)
155
+ file_write(self.class_name.to_s, data)
156
156
  data
157
157
  end
158
158
  end
@@ -16,12 +16,19 @@ module Marta
16
16
  class Syringe
17
17
 
18
18
  def initialize(engine, marta_what, title = 'Something important',
19
- old_data = Hash.new, folder = gem_libdir)
19
+ old_data = Hash.new, folder = gem_libdir,
20
+ custom_vars = Array.new, custom_scripts = Array.new)
20
21
  @what = marta_what
21
22
  @title = title
22
23
  @data = old_data
24
+ @data ||= Hash.new
23
25
  @engine = engine
24
26
  @folder = folder
27
+ @custom_vars = custom_vars
28
+ @custom_scripts = custom_scripts
29
+ @default_vars = [{"marta_what": "\"#{@title}\""},
30
+ {"old_marta_Data": @data.to_s.gsub('=>',':').gsub('nil','null')}]
31
+ @default_scripts = ["marta_add_data();"]
25
32
  end
26
33
 
27
34
  # "first" or "last".
@@ -38,22 +45,22 @@ module Marta
38
45
  newMartaObject.innerHTML = '#{inner}';
39
46
  document.body.insertBefore(newMartaObject,document.body.#{where}Child);
40
47
  JS
41
- @engine.execute_script script.gsub("\n",'')
48
+ @engine.execute_script script.gsub("\n",'')
42
49
  end
43
50
 
44
51
  # Taking a correct js file to inject
45
52
  def js
46
- File.read(@folder + "/data/#{@what}.js").gsub("\n",'')
53
+ File.read(@folder + "/data/#{@what}.js")
47
54
  end
48
55
 
49
56
  # Taking a correct html file to inject
50
57
  def html
51
- File.read(@folder + "/data/#{@what}.html").gsub("\n",'')
58
+ File.read(@folder + "/data/#{@what}.html")
52
59
  end
53
60
 
54
61
  # Taking a correct css file to inject
55
62
  def style
56
- File.read(@folder + "/data/style.css").gsub("\n",'')
63
+ File.read(@folder + "/data/style.css")
57
64
  end
58
65
 
59
66
  # Injecting everything to the page
@@ -63,17 +70,38 @@ module Marta
63
70
  insert_to_page('style', style, false)
64
71
  end
65
72
 
73
+ # Syringe sets javascript variables
74
+ def set_var(var, value)
75
+ insert_to_page('script', "var #{var} = #{value};", false)
76
+ end
77
+
78
+ # Syringe runs scripts
79
+ def run_script(script)
80
+ @engine.execute_script(script)
81
+ end
82
+
83
+ # Syringe takes array of hashes to set lots of variables
84
+ def set_vars(vars_array)
85
+ vars_array.each do |var_hash|
86
+ var_hash.each_pair do |var_name, var_value|
87
+ set_var var_name.to_s, var_value
88
+ end
89
+ end
90
+ end
91
+
92
+ # Syringe can run an array of scripts
93
+ def all_scripts(scripts_array)
94
+ scripts_array.each do |script|
95
+ run_script script
96
+ end
97
+ end
98
+
66
99
  # It is never used without get_result.
67
100
  # But it can be used to show some message for user
68
101
  def actual_injection
69
102
  files_to_page
70
- @data ||= Hash.new
71
- insert_to_page('script', "var marta_what = \"#{@title}\"", false)
72
- insert_to_page('script',
73
- "var old_marta_Data = #{@data}".gsub('=>',':').
74
- gsub('nil','null'),
75
- false)
76
- @engine.execute_script("marta_add_data();")
103
+ set_vars(@default_vars + @custom_vars)
104
+ all_scripts(@default_scripts + @custom_scripts)
77
105
  end
78
106
 
79
107
  # Retrieving result if js var = marta_confirm_mark is true
@@ -94,8 +122,10 @@ module Marta
94
122
  end
95
123
 
96
124
  # That's how Marta is injecting and retrieving result
97
- def inject(what, title = 'Something important', data = Hash.new)
98
- syringe = Syringe.new(engine, what, title, data, gem_libdir)
125
+ def inject(what, title = 'Something important', data = Hash.new,
126
+ custom_vars = Array.new, custom_scripts = Array.new)
127
+ syringe = Syringe.new(engine, what, title, data, gem_libdir,
128
+ custom_vars, custom_scripts)
99
129
  syringe.actual_injection
100
130
  syringe.get_result
101
131
  end
@@ -10,12 +10,12 @@ module Marta
10
10
  #
11
11
  # User can create pageobject class using SmartPage.new
12
12
  #
13
- # SmartPage can be created withoud all the data. But in that case
13
+ # SmartPage can be created without all the data. But in that case
14
14
  # it will be pretty useless until values are provided
15
15
  #
16
- # The first argument is a class name. It is a constant like string like
16
+ # The first argument is a class name. It is a constant-like string like
17
17
  # "MyClass". All data provided will be stored in MyClass.json
18
- # Once created that way you can call it like MyClass.new.
18
+ # Once it is created that way you can call it like MyClass.new.
19
19
  # That argument is totally necessary one
20
20
  #
21
21
  # The second argument is a marta's special data hash. By default =
@@ -41,7 +41,7 @@ module Marta
41
41
  def method_edit(name)
42
42
  method_name = correct_name(name)
43
43
  exact_name = method_name.to_s + "_exact"
44
- data = user_method_dialogs(@class_name, method_name, @data)
44
+ data = user_method_dialogs(method_name)
45
45
  define_singleton_method method_name.to_sym do |meth_content=@data['meths'][method_name]|
46
46
  marta_magic_finder(meth_content)
47
47
  end
@@ -18,11 +18,11 @@ module Marta
18
18
 
19
19
  include XPath
20
20
 
21
- def initialize(meth, engine, requestor)
21
+ def initialize(meth, requestor)
22
22
  @requestor = requestor
23
23
  @meth = meth
24
- @xpath = xpath_by_meth
25
- @engine = engine
24
+ @xpath = xpath_by_meth if !@meth.nil?
25
+ @engine = requestor.engine
26
26
  end
27
27
 
28
28
  # Maybe our element is defined as a collection?
@@ -73,11 +73,30 @@ module Marta
73
73
  subtype_of prefind
74
74
  end
75
75
  end
76
+
77
+ # Sometimes we need to find out what is hidden
78
+ def find_invisibles
79
+ result = Array.new
80
+ all = @engine.elements
81
+ all.each do |element|
82
+ if element.exists? and !element.visible?
83
+ result.push element
84
+ else
85
+ x, y = element.wd.location.x + 1, element.wd.location.y + 1
86
+ element_on_point = @engine.
87
+ execute_script "return document.elementFromPoint(#{x}, #{y})"
88
+ if element_on_point != element
89
+ result.push element
90
+ end
91
+ end
92
+ end
93
+ return result
94
+ end
76
95
  end
77
96
 
78
97
  # We can simply find something
79
98
  def marta_simple_finder(meth)
80
- finder = BasicFinder.new(meth, engine, self)
99
+ finder = BasicFinder.new(meth, self)
81
100
  finder.find
82
101
  end
83
102
  end
data/lib/marta/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Marta
2
- VERSION = "0.28879"
2
+ VERSION = "0.29156"
3
3
  NAME = "marta"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marta
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.28879'
4
+ version: '0.29156'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergei Seleznev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-13 00:00:00.000000000 Z
11
+ date: 2017-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler