locatine 0.01309 → 0.01439
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/locatine/app/content.js +1 -1
- data/lib/locatine/app/manifest.json +1 -1
- data/lib/locatine/data_generate.rb +39 -57
- data/lib/locatine/data_logic.rb +53 -0
- data/lib/locatine/find_by_magic.rb +50 -2
- data/lib/locatine/helpers.rb +16 -0
- data/lib/locatine/large_scripts/dimensions.js +17 -0
- data/lib/locatine/public.rb +3 -1
- data/lib/locatine/search.rb +4 -1
- data/lib/locatine/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77f63cceefd7594a340e9295b71d7ef491e60ebe
|
4
|
+
data.tar.gz: 61cdf5270323f799eec652caa3f528b4491c53f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d7c8bc6e6d829f11be85a9c9e783f521c1cbe18febcee3d073417d7bdc729dc8e840849c88c70610049d9998c52f43e2d949f2b83b5187b9fb59bdf6420810d
|
7
|
+
data.tar.gz: 42bd7eec1492d5495ff35e661513fbd2e1add8dd3d6f084e334ffc9119ea646c1f8d2f7f96b817c013fde0b87fec0b62cd787a063b1b8e97b79ddf4aee16f42a
|
data/lib/locatine/app/content.js
CHANGED
@@ -61,7 +61,7 @@ async function getSelected(value){
|
|
61
61
|
const tagName = value.tagName;
|
62
62
|
const array = Array.prototype.slice.call( document.getElementsByTagName(tagName) );
|
63
63
|
const index = array.indexOf(value);
|
64
|
-
if (document.locatine_selected != value) {
|
64
|
+
if ((document.locatine_selected != value) && (String(tagName) != "")) {
|
65
65
|
document.locatine_selected = value;
|
66
66
|
await set_value("locatine_confirm", "selected");
|
67
67
|
magic_div.setAttribute("tag", tagName);
|
@@ -1,56 +1,62 @@
|
|
1
1
|
module Locatine
|
2
2
|
##
|
3
|
-
#
|
3
|
+
# Collecting data of element and making it dynamic
|
4
4
|
module DataGenerate
|
5
5
|
private
|
6
6
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
attrs
|
7
|
+
def real_text_of(element)
|
8
|
+
element.text == element.inner_html ? element.text : ''
|
9
|
+
end
|
10
|
+
|
11
|
+
def mesure(element)
|
12
|
+
xy = element.location
|
13
|
+
wh = element.size
|
14
|
+
return xy.x, xy.y, wh.width, wh.height
|
16
15
|
end
|
17
16
|
|
18
17
|
def get_dynamic_tag(element, vars)
|
19
18
|
tag = element.tag_name
|
20
19
|
tag = "\#{tag}" if vars[:tag] == tag
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
def real_text_of(element)
|
25
|
-
element.text == element.inner_html ? element.text : ''
|
20
|
+
push_hash('tag', tag, 'tag')
|
26
21
|
end
|
27
22
|
|
28
23
|
def get_dynamic_text(element, vars)
|
29
24
|
attrs = []
|
30
|
-
real_text_of(element).split('
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
attrs.push('
|
25
|
+
real_text_of(element).split(/['" ]/).each do |word|
|
26
|
+
final = if !vars[:text].to_s.strip.empty?
|
27
|
+
word.gsub(vars[:text].to_s, "\#{text}")
|
28
|
+
else
|
29
|
+
word
|
30
|
+
end
|
31
|
+
attrs.push push_hash('text', final, 'text') unless final.empty?
|
37
32
|
end
|
38
33
|
attrs
|
39
34
|
end
|
40
35
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
36
|
+
def process_dimension(name, value, vars)
|
37
|
+
s_name = name.to_s
|
38
|
+
value = value.to_s.gsub(vars[name], "\#{#{s_name}}") if vars[name]
|
39
|
+
value
|
40
|
+
end
|
41
|
+
|
42
|
+
def processed_dimensions(element, vars)
|
43
|
+
x, y, width, height = mesure(element)
|
44
|
+
x = process_dimension(:x, x, vars)
|
45
|
+
y = process_dimension(:y, y, vars)
|
46
|
+
width = process_dimension(:width, width, vars)
|
47
|
+
height = process_dimension(:height, height, vars)
|
48
|
+
return x, y, width, height
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_dimensions(element, vars)
|
52
|
+
resolution = window_size
|
53
|
+
x, y, w, h = processed_dimensions(element, vars)
|
54
|
+
push_hash(resolution, "#{x}*#{y}*#{w}*#{h}", 'dimensions')
|
49
55
|
end
|
50
56
|
|
51
57
|
def hash_by_style(style, value, vars)
|
52
58
|
value.gsub!(vars[style.to_sym], "\#{#{style}}") if vars[style.to_sym]
|
53
|
-
|
59
|
+
push_hash(style, value, 'css')
|
54
60
|
end
|
55
61
|
|
56
62
|
def get_raw_css(element)
|
@@ -73,30 +79,6 @@ module Locatine
|
|
73
79
|
attrs
|
74
80
|
end
|
75
81
|
|
76
|
-
##
|
77
|
-
# Generating data for group of elements
|
78
|
-
def generate_data(result, vars)
|
79
|
-
family = {}
|
80
|
-
result.each do |item|
|
81
|
-
family = get_commons(get_family_info(item, vars), family)
|
82
|
-
end
|
83
|
-
family
|
84
|
-
end
|
85
|
-
|
86
|
-
##
|
87
|
-
# Getting element\\parents information
|
88
|
-
def get_family_info(element, vars)
|
89
|
-
i = 0
|
90
|
-
attributes = {}
|
91
|
-
while i != @depth
|
92
|
-
attributes[i.to_s] = get_element_info(element, vars, i)
|
93
|
-
i += 1
|
94
|
-
element = element.parent
|
95
|
-
i = @depth unless element.exists?
|
96
|
-
end
|
97
|
-
attributes
|
98
|
-
end
|
99
|
-
|
100
82
|
##
|
101
83
|
# Collecting attributes of the element
|
102
84
|
def get_attributes(element)
|
@@ -105,9 +87,9 @@ module Locatine
|
|
105
87
|
attributes.each_pair do |name, value|
|
106
88
|
next if name.to_s == 'locatineclass'
|
107
89
|
|
108
|
-
value.split('
|
90
|
+
value.split(/['" ]/).uniq.each do |part|
|
109
91
|
array.push('name' => name.to_s, 'type' => 'attribute',
|
110
|
-
'value' => part)
|
92
|
+
'value' => part) unless part.empty?
|
111
93
|
end
|
112
94
|
end
|
113
95
|
array
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Locatine
|
2
|
+
##
|
3
|
+
# Logic of collecting data of the element
|
4
|
+
module DataLogic
|
5
|
+
private
|
6
|
+
|
7
|
+
def get_dynamic_attributes(element, vars)
|
8
|
+
attrs = []
|
9
|
+
get_attributes(element).each do |hash|
|
10
|
+
if vars[hash['name'].to_sym]
|
11
|
+
hash['value'].gsub!(vars[hash['name'].to_sym], "\#{#{hash['name']}}")
|
12
|
+
end
|
13
|
+
attrs.push hash
|
14
|
+
end
|
15
|
+
attrs
|
16
|
+
end
|
17
|
+
|
18
|
+
##
|
19
|
+
# Generating array of hashes representing data of the element
|
20
|
+
def get_element_info(element, vars, depth)
|
21
|
+
attrs = get_dynamic_attributes(element, vars)
|
22
|
+
attrs.push get_dynamic_tag(element, vars)
|
23
|
+
attrs += get_dynamic_text(element, vars)
|
24
|
+
attrs += get_dynamic_css(element, vars) if depth.to_i.zero? && visual?
|
25
|
+
attrs.push get_dimensions(element, vars) if depth.to_i.zero? && visual?
|
26
|
+
attrs
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# Generating data for group of elements
|
31
|
+
def generate_data(result, vars)
|
32
|
+
family = {}
|
33
|
+
result.each do |item|
|
34
|
+
family = get_commons(get_family_info(item, vars), family)
|
35
|
+
end
|
36
|
+
family
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Getting element\\parents information
|
41
|
+
def get_family_info(element, vars)
|
42
|
+
i = 0
|
43
|
+
attributes = {}
|
44
|
+
while i != @depth
|
45
|
+
attributes[i.to_s] = get_element_info(element, vars, i)
|
46
|
+
i += 1
|
47
|
+
element = element.parent
|
48
|
+
i = @depth unless element.exists?
|
49
|
+
end
|
50
|
+
attributes
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -18,7 +18,7 @@ module Locatine
|
|
18
18
|
|
19
19
|
def similar_enough(data, attributes)
|
20
20
|
(same_entries(data['0'], attributes, '0').length * 100 /
|
21
|
-
data['0'].length)
|
21
|
+
data['0'].length) >= @tolerance
|
22
22
|
end
|
23
23
|
|
24
24
|
def suggest_by_all(all, data, vars, name, scope)
|
@@ -38,10 +38,58 @@ module Locatine
|
|
38
38
|
all += one_option_array(hash, vars, depth).to_a
|
39
39
|
end
|
40
40
|
end
|
41
|
-
all += full_find_by_css(data, vars)
|
41
|
+
all += full_find_by_css(data, vars) if visual?
|
42
|
+
all += find_by_dimensions(data, vars) if visual?
|
42
43
|
all
|
43
44
|
end
|
44
45
|
|
46
|
+
def min_max_by_size(middle, size)
|
47
|
+
min = middle - (size.to_i * (100 + @tolerance)) / 200
|
48
|
+
max = middle + (size.to_i * (100 + @tolerance)) / 200
|
49
|
+
return min, max
|
50
|
+
end
|
51
|
+
|
52
|
+
def middle(sizes)
|
53
|
+
x = sizes[0].to_i + (sizes[2].to_i / 2)
|
54
|
+
y = sizes[1].to_i + (sizes[3].to_i / 2)
|
55
|
+
return x, y
|
56
|
+
end
|
57
|
+
|
58
|
+
def dimension_search_field(sizes)
|
59
|
+
x, y = middle(sizes)
|
60
|
+
x_min, x_max = min_max_by_size(x, sizes[2])
|
61
|
+
y_min, y_max = min_max_by_size(y, sizes[3])
|
62
|
+
return x_min, x_max, y_min, y_max
|
63
|
+
end
|
64
|
+
|
65
|
+
def retrieve_mesures(data)
|
66
|
+
size = window_size
|
67
|
+
dimensions = data['0'].map do |i|
|
68
|
+
i if (i['type'] == 'dimensions') && (i['name'] == size)
|
69
|
+
end
|
70
|
+
dimensions.compact
|
71
|
+
end
|
72
|
+
|
73
|
+
def sizez_from_dimensions(dimensions, vars)
|
74
|
+
result = []
|
75
|
+
dimensions.first['value'].split('*').each do |value|
|
76
|
+
result.push(process_string(value, vars))
|
77
|
+
end
|
78
|
+
result
|
79
|
+
end
|
80
|
+
|
81
|
+
def find_by_dimensions(data, vars)
|
82
|
+
dimensions = retrieve_mesures(data)
|
83
|
+
if !dimensions.empty?
|
84
|
+
sizes = sizez_from_dimensions(dimensions, vars)
|
85
|
+
xmi, xma, ymi, yma = dimension_search_field(sizes)
|
86
|
+
script = File.read("#{HOME}/large_scripts/dimensions.js")
|
87
|
+
engine.execute_script(script, xmi, xma, ymi, yma).compact
|
88
|
+
else
|
89
|
+
[]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
45
93
|
def one_option_array(hash, vars, depth)
|
46
94
|
case hash['type']
|
47
95
|
when 'tag'
|
data/lib/locatine/helpers.rb
CHANGED
@@ -23,6 +23,22 @@ module Locatine
|
|
23
23
|
"[not(@id = 'locatine_magic_div')]"
|
24
24
|
end
|
25
25
|
|
26
|
+
def push_hash(name, value, type)
|
27
|
+
{ 'name' => name,
|
28
|
+
'value' => value,
|
29
|
+
'type' => type }
|
30
|
+
end
|
31
|
+
|
32
|
+
def window_size
|
33
|
+
b_w = engine.execute_script('return window.innerWidth')
|
34
|
+
b_h = engine.execute_script('return window.innerHeight')
|
35
|
+
"#{b_w}x#{b_h}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def visual?
|
39
|
+
@visual_search
|
40
|
+
end
|
41
|
+
|
26
42
|
def right_browser
|
27
43
|
Watir::Browser.new(:chrome, switches: ["--load-extension=#{HOME}/app"])
|
28
44
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
function walk(xmi, xma, ymi, yma){
|
2
|
+
let x;
|
3
|
+
let y;
|
4
|
+
let array =[];
|
5
|
+
let one;
|
6
|
+
for (x = xmi; x <= xma; x++) {
|
7
|
+
for (y = ymi; y <= yma; y++) {
|
8
|
+
one = document.elementFromPoint(x, y);
|
9
|
+
if ((one != document.documentElement) && (one != document.body)){
|
10
|
+
array.push(document.elementFromPoint(x, y));
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}
|
14
|
+
return [...new Set(array)];
|
15
|
+
}
|
16
|
+
|
17
|
+
return walk(parseInt(arguments[0]), parseInt(arguments[1]), parseInt(arguments[2]), parseInt(arguments[3]))
|
data/lib/locatine/public.rb
CHANGED
@@ -32,7 +32,8 @@ module Locatine
|
|
32
32
|
learn: ENV['LEARN'].nil? ? false : true,
|
33
33
|
stability_limit: 10,
|
34
34
|
scope: 'Default',
|
35
|
-
tolerance: 33
|
35
|
+
tolerance: 33,
|
36
|
+
visual_search: false)
|
36
37
|
import_browser browser
|
37
38
|
import_file(json)
|
38
39
|
@depth = depth
|
@@ -40,6 +41,7 @@ module Locatine
|
|
40
41
|
@stability_limit = stability_limit
|
41
42
|
@scope = scope
|
42
43
|
@tolerance = tolerance
|
44
|
+
@visual_search = visual_search
|
43
45
|
end
|
44
46
|
|
45
47
|
##
|
data/lib/locatine/search.rb
CHANGED
@@ -9,6 +9,7 @@ require 'locatine/public'
|
|
9
9
|
require 'locatine/helpers'
|
10
10
|
require 'locatine/file_work'
|
11
11
|
require 'locatine/highlight'
|
12
|
+
require 'locatine/data_logic'
|
12
13
|
require 'locatine/find_logic'
|
13
14
|
require 'locatine/find_by_css'
|
14
15
|
require 'locatine/dialog_logic'
|
@@ -29,6 +30,7 @@ module Locatine
|
|
29
30
|
include Locatine::Public
|
30
31
|
include Locatine::Helpers
|
31
32
|
include Locatine::FileWork
|
33
|
+
include Locatine::DataLogic
|
32
34
|
include Locatine::FindLogic
|
33
35
|
include Locatine::Highlight
|
34
36
|
include Locatine::FindByCss
|
@@ -45,7 +47,8 @@ module Locatine
|
|
45
47
|
:learn,
|
46
48
|
:stability_limit,
|
47
49
|
:scope,
|
48
|
-
:tolerance
|
50
|
+
:tolerance,
|
51
|
+
:visual_search
|
49
52
|
attr_reader :json,
|
50
53
|
:browser
|
51
54
|
end
|
data/lib/locatine/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: locatine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.01439'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergei Seleznev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -125,6 +125,7 @@ files:
|
|
125
125
|
- lib/locatine/app/popup.html
|
126
126
|
- lib/locatine/app/popup.js
|
127
127
|
- lib/locatine/data_generate.rb
|
128
|
+
- lib/locatine/data_logic.rb
|
128
129
|
- lib/locatine/dialog_actions.rb
|
129
130
|
- lib/locatine/dialog_logic.rb
|
130
131
|
- lib/locatine/file_work.rb
|
@@ -136,6 +137,7 @@ files:
|
|
136
137
|
- lib/locatine/helpers.rb
|
137
138
|
- lib/locatine/highlight.rb
|
138
139
|
- lib/locatine/large_scripts/css.js
|
140
|
+
- lib/locatine/large_scripts/dimensions.js
|
139
141
|
- lib/locatine/merge.rb
|
140
142
|
- lib/locatine/public.rb
|
141
143
|
- lib/locatine/search.rb
|