locatine 0.01300 → 0.01309
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 +4 -4
- data/lib/locatine/app/content.js +11 -9
- data/lib/locatine/app/manifest.json +1 -1
- data/lib/locatine/data_generate.rb +32 -7
- data/lib/locatine/find_by_css.rb +45 -0
- data/lib/locatine/find_by_magic.rb +5 -4
- data/lib/locatine/helpers.rb +26 -0
- data/lib/locatine/large_scripts/css.js +21 -0
- data/lib/locatine/public.rb +11 -3
- data/lib/locatine/search.rb +4 -2
- data/lib/locatine/version.rb +1 -1
- data/lib/locatine/xpath_generator.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: 36abed5fc9bb50605d737f8f56be664970461ec9
|
|
4
|
+
data.tar.gz: 3c5b291cf577d416c2396643425d1129c9957b50
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a8e84bd41e4c91bc7ad2dfcffd9c1ca92791aa48a3f658b4a21ad73d61215d6b3afd7b7baeeed69b9d45ee1dd0cafca876f9abecc4540b8ffd9ad30d2d448299
|
|
7
|
+
data.tar.gz: 8415caf49216b65470b0668c9f98c470c5140982a3328750a8f68bc9d348b496c4b667058efe852ba18f78b65d7c02934716ba4ea9c262d4b88c3994657fa78d
|
data/lib/locatine/app/content.js
CHANGED
|
@@ -56,15 +56,17 @@ async function refreshData(){
|
|
|
56
56
|
};
|
|
57
57
|
|
|
58
58
|
async function getSelected(value){
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
document.locatine_selected
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
59
|
+
if (value) {
|
|
60
|
+
const magic_div = document.getElementById("locatine_magic_div");
|
|
61
|
+
const tagName = value.tagName;
|
|
62
|
+
const array = Array.prototype.slice.call( document.getElementsByTagName(tagName) );
|
|
63
|
+
const index = array.indexOf(value);
|
|
64
|
+
if (document.locatine_selected != value) {
|
|
65
|
+
document.locatine_selected = value;
|
|
66
|
+
await set_value("locatine_confirm", "selected");
|
|
67
|
+
magic_div.setAttribute("tag", tagName);
|
|
68
|
+
magic_div.setAttribute("index", index);
|
|
69
|
+
}
|
|
68
70
|
}
|
|
69
71
|
};
|
|
70
72
|
|
|
@@ -40,10 +40,36 @@ module Locatine
|
|
|
40
40
|
|
|
41
41
|
##
|
|
42
42
|
# Generating array of hashes representing data of the element
|
|
43
|
-
def get_element_info(element, vars)
|
|
43
|
+
def get_element_info(element, vars, depth)
|
|
44
44
|
attrs = get_dynamic_attributes(element, vars)
|
|
45
45
|
attrs.push get_dynamic_tag(element, vars)
|
|
46
46
|
attrs += get_dynamic_text(element, vars)
|
|
47
|
+
attrs += get_dynamic_css(element, vars) if depth.to_i.zero?
|
|
48
|
+
attrs
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def hash_by_style(style, value, vars)
|
|
52
|
+
value.gsub!(vars[style.to_sym], "\#{#{style}}") if vars[style.to_sym]
|
|
53
|
+
{ 'name' => style, 'value' => value, 'type' => 'css' }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def get_raw_css(element)
|
|
57
|
+
test_script = 'return typeof(arguments[0])'
|
|
58
|
+
ok = engine.execute_script(test_script, element) == 'object'
|
|
59
|
+
script = 'return getComputedStyle(arguments[0]).cssText'
|
|
60
|
+
return engine.execute_script(script, element) if ok
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def get_dynamic_css(element, vars)
|
|
64
|
+
attrs = []
|
|
65
|
+
raw = get_raw_css(element)
|
|
66
|
+
if raw
|
|
67
|
+
styles = css_text_to_hash(get_raw_css(element))
|
|
68
|
+
(styles.to_a - @default_styles).to_h.each_pair do |style, value|
|
|
69
|
+
hash = hash_by_style(style, value, vars)
|
|
70
|
+
attrs.push(hash) if hash
|
|
71
|
+
end
|
|
72
|
+
end
|
|
47
73
|
attrs
|
|
48
74
|
end
|
|
49
75
|
|
|
@@ -60,14 +86,13 @@ module Locatine
|
|
|
60
86
|
##
|
|
61
87
|
# Getting element\\parents information
|
|
62
88
|
def get_family_info(element, vars)
|
|
63
|
-
|
|
89
|
+
i = 0
|
|
64
90
|
attributes = {}
|
|
65
|
-
while
|
|
66
|
-
attributes[
|
|
67
|
-
|
|
91
|
+
while i != @depth
|
|
92
|
+
attributes[i.to_s] = get_element_info(element, vars, i)
|
|
93
|
+
i += 1
|
|
68
94
|
element = element.parent
|
|
69
|
-
|
|
70
|
-
current_depth = @depth unless element.parent.exists?
|
|
95
|
+
i = @depth unless element.exists?
|
|
71
96
|
end
|
|
72
97
|
attributes
|
|
73
98
|
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Locatine
|
|
2
|
+
##
|
|
3
|
+
# Looking for elements by css values
|
|
4
|
+
module FindByCss
|
|
5
|
+
private
|
|
6
|
+
|
|
7
|
+
def css_array_by_data(data, vars)
|
|
8
|
+
q_css = []
|
|
9
|
+
get_trusted(data['0']).each do |hash|
|
|
10
|
+
if hash['type'] == 'css'
|
|
11
|
+
value = process_string(hash['value'], vars) if vars[hash['name']]
|
|
12
|
+
q_css.push("#{hash['name']}: #{value || hash['value']}")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
q_css
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def return_caught_elements(caught)
|
|
19
|
+
all = []
|
|
20
|
+
caught.each do |i|
|
|
21
|
+
@help_hash[i[0]] ||= engine.elements(tag_name: i[0].downcase).to_a
|
|
22
|
+
elm = @help_hash[i[0]][i[1].to_i]
|
|
23
|
+
all.push(elm) if elm
|
|
24
|
+
end
|
|
25
|
+
all
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def select_elements_from_raws_by_css(q_css, raws)
|
|
29
|
+
all = []
|
|
30
|
+
@help_hash = {}
|
|
31
|
+
q_css.each do |item|
|
|
32
|
+
caught = (raws.select { |i| i[2].include?(item) })
|
|
33
|
+
all += return_caught_elements(caught)
|
|
34
|
+
end
|
|
35
|
+
all
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def full_find_by_css(data, vars)
|
|
39
|
+
q_css = css_array_by_data(data, vars)
|
|
40
|
+
script = File.read("#{HOME}/large_scripts/css.js")
|
|
41
|
+
raws = engine.execute_script(script)
|
|
42
|
+
select_elements_from_raws_by_css(q_css, raws)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -35,20 +35,21 @@ module Locatine
|
|
|
35
35
|
all = []
|
|
36
36
|
data.each_pair do |depth, array|
|
|
37
37
|
get_trusted(array).each do |hash|
|
|
38
|
-
all += one_option_array(hash, vars, depth)
|
|
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
42
|
all
|
|
42
43
|
end
|
|
43
44
|
|
|
44
45
|
def one_option_array(hash, vars, depth)
|
|
45
46
|
case hash['type']
|
|
46
47
|
when 'tag'
|
|
47
|
-
find_by_tag(hash, vars, depth)
|
|
48
|
+
find_by_tag(hash, vars, depth)
|
|
48
49
|
when 'text'
|
|
49
|
-
find_by_text(hash, vars, depth)
|
|
50
|
+
find_by_text(hash, vars, depth)
|
|
50
51
|
when 'attribute'
|
|
51
|
-
find_by_attribute(hash, vars, depth)
|
|
52
|
+
find_by_attribute(hash, vars, depth)
|
|
52
53
|
end
|
|
53
54
|
end
|
|
54
55
|
end
|
data/lib/locatine/helpers.rb
CHANGED
|
@@ -27,6 +27,32 @@ module Locatine
|
|
|
27
27
|
Watir::Browser.new(:chrome, switches: ["--load-extension=#{HOME}/app"])
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
def import_browser(browser)
|
|
31
|
+
s_class = browser.class.superclass
|
|
32
|
+
b = right_browser unless browser
|
|
33
|
+
b = browser if browser.class == Watir::Browser
|
|
34
|
+
b = Watir::Browser.new(browser) if s_class == Selenium::WebDriver::Driver
|
|
35
|
+
@browser = b
|
|
36
|
+
@default_styles = default_styles.to_a
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def css_text_to_hash(text)
|
|
40
|
+
almost_hash = []
|
|
41
|
+
array = text[0..-2].split('; ')
|
|
42
|
+
array.each do |item|
|
|
43
|
+
almost_hash.push item.split(': ')
|
|
44
|
+
end
|
|
45
|
+
almost_hash.to_h
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def default_styles
|
|
49
|
+
css =
|
|
50
|
+
engine.execute_script("const dummy = document.createElement('dummy');
|
|
51
|
+
document.body.appendChild(dummy);
|
|
52
|
+
return getComputedStyle(dummy).cssText;")
|
|
53
|
+
css_text_to_hash(css)
|
|
54
|
+
end
|
|
55
|
+
|
|
30
56
|
def process_string(str, vars)
|
|
31
57
|
str = str.to_s
|
|
32
58
|
thevar = str.match(/\#{([^\#{]*)}/)[1] unless str.match(/\#{(.*)}/).nil?
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function walk(elm, result) {
|
|
2
|
+
let node;
|
|
3
|
+
|
|
4
|
+
const tagName = elm.tagName;
|
|
5
|
+
const array = Array.prototype.slice.call( document.getElementsByTagName(tagName) );
|
|
6
|
+
const index = array.indexOf(elm);
|
|
7
|
+
|
|
8
|
+
const item = [tagName, index, getComputedStyle(elm).cssText]
|
|
9
|
+
result.push(item)
|
|
10
|
+
|
|
11
|
+
// Handle child elements
|
|
12
|
+
for (node = elm.firstChild; node; node = node.nextSibling) {
|
|
13
|
+
if (node.nodeType === 1) { // 1 == Element
|
|
14
|
+
result = walk(node, result);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return result
|
|
18
|
+
}
|
|
19
|
+
let array = walk(document.body,[]);
|
|
20
|
+
array.shift();
|
|
21
|
+
return array;
|
data/lib/locatine/public.rb
CHANGED
|
@@ -21,15 +21,19 @@ module Locatine
|
|
|
21
21
|
# consider it trusted.
|
|
22
22
|
#
|
|
23
23
|
# +scope+ will be used in search (if not provided) defaulkt is "Default"
|
|
24
|
+
#
|
|
25
|
+
# +tolerance+ Shows how similar must be an element found as alternative
|
|
26
|
+
# to the lost one. Default is 33 which means that if less than 33% of
|
|
27
|
+
# metrics of alternative elements are the same as of the lost element
|
|
28
|
+
# will not be returned
|
|
24
29
|
def initialize(json: './Locatine_files/default.json',
|
|
25
30
|
depth: 3,
|
|
26
31
|
browser: nil,
|
|
27
32
|
learn: ENV['LEARN'].nil? ? false : true,
|
|
28
33
|
stability_limit: 10,
|
|
29
34
|
scope: 'Default',
|
|
30
|
-
tolerance:
|
|
31
|
-
browser
|
|
32
|
-
@browser = browser
|
|
35
|
+
tolerance: 33)
|
|
36
|
+
import_browser browser
|
|
33
37
|
import_file(json)
|
|
34
38
|
@depth = depth
|
|
35
39
|
@learn = learn
|
|
@@ -104,5 +108,9 @@ module Locatine
|
|
|
104
108
|
def json=(value)
|
|
105
109
|
import_file(value)
|
|
106
110
|
end
|
|
111
|
+
|
|
112
|
+
def browser=(value)
|
|
113
|
+
import_browser(value)
|
|
114
|
+
end
|
|
107
115
|
end
|
|
108
116
|
end
|
data/lib/locatine/search.rb
CHANGED
|
@@ -10,6 +10,7 @@ require 'locatine/helpers'
|
|
|
10
10
|
require 'locatine/file_work'
|
|
11
11
|
require 'locatine/highlight'
|
|
12
12
|
require 'locatine/find_logic'
|
|
13
|
+
require 'locatine/find_by_css'
|
|
13
14
|
require 'locatine/dialog_logic'
|
|
14
15
|
require 'locatine/find_by_magic'
|
|
15
16
|
require 'locatine/find_by_guess'
|
|
@@ -30,6 +31,7 @@ module Locatine
|
|
|
30
31
|
include Locatine::FileWork
|
|
31
32
|
include Locatine::FindLogic
|
|
32
33
|
include Locatine::Highlight
|
|
34
|
+
include Locatine::FindByCss
|
|
33
35
|
include Locatine::FindByMagic
|
|
34
36
|
include Locatine::DialogLogic
|
|
35
37
|
include Locatine::FindByGuess
|
|
@@ -40,11 +42,11 @@ module Locatine
|
|
|
40
42
|
|
|
41
43
|
attr_accessor :data,
|
|
42
44
|
:depth,
|
|
43
|
-
:browser,
|
|
44
45
|
:learn,
|
|
45
46
|
:stability_limit,
|
|
46
47
|
:scope,
|
|
47
48
|
:tolerance
|
|
48
|
-
attr_reader :json
|
|
49
|
+
attr_reader :json,
|
|
50
|
+
:browser
|
|
49
51
|
end
|
|
50
52
|
end
|
data/lib/locatine/version.rb
CHANGED
|
@@ -17,7 +17,7 @@ module Locatine
|
|
|
17
17
|
xpath = "[not(@id = 'locatine_magic_div')]"
|
|
18
18
|
data.each_pair do |_depth, array|
|
|
19
19
|
get_trusted(array).each do |hash|
|
|
20
|
-
xpath = generate_xpath_part(hash, vars) + xpath
|
|
20
|
+
xpath = generate_xpath_part(hash, vars).to_s + xpath
|
|
21
21
|
end
|
|
22
22
|
xpath = '/*' + xpath
|
|
23
23
|
end
|
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.01309'
|
|
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-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -128,12 +128,14 @@ files:
|
|
|
128
128
|
- lib/locatine/dialog_actions.rb
|
|
129
129
|
- lib/locatine/dialog_logic.rb
|
|
130
130
|
- lib/locatine/file_work.rb
|
|
131
|
+
- lib/locatine/find_by_css.rb
|
|
131
132
|
- lib/locatine/find_by_guess.rb
|
|
132
133
|
- lib/locatine/find_by_locator.rb
|
|
133
134
|
- lib/locatine/find_by_magic.rb
|
|
134
135
|
- lib/locatine/find_logic.rb
|
|
135
136
|
- lib/locatine/helpers.rb
|
|
136
137
|
- lib/locatine/highlight.rb
|
|
138
|
+
- lib/locatine/large_scripts/css.js
|
|
137
139
|
- lib/locatine/merge.rb
|
|
138
140
|
- lib/locatine/public.rb
|
|
139
141
|
- lib/locatine/search.rb
|