cucu 1.3.9__py3-none-any.whl → 1.3.11__py3-none-any.whl

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.
cucu/cli/core.py CHANGED
@@ -35,9 +35,7 @@ from cucu.cli.steps import print_human_readable_steps, print_json_steps
35
35
  from cucu.config import CONFIG
36
36
  from cucu.db import (
37
37
  consolidate_database_files,
38
- db,
39
38
  finish_worker_record,
40
- get_first_cucu_run_filepath,
41
39
  )
42
40
  from cucu.lint import linter
43
41
  from cucu.utils import generate_short_id
@@ -524,16 +522,6 @@ def _generate_report(
524
522
  if os.path.exists(results_dir):
525
523
  consolidate_database_files(results_dir)
526
524
 
527
- db_path = os.path.join(results_dir, "run.db")
528
-
529
- try:
530
- db.init(db_path)
531
- db.connect(reuse_if_open=True)
532
- filepath = get_first_cucu_run_filepath()
533
- behave_init(filepath)
534
- finally:
535
- db.close()
536
-
537
525
  report_location = reporter.generate(
538
526
  results_dir, output, only_failures=only_failures
539
527
  )
cucu/fuzzy/core.py CHANGED
@@ -97,6 +97,7 @@ def find(
97
97
  str(index),
98
98
  str(direction.value),
99
99
  name_within_thing,
100
+ "true",
100
101
  ]
101
102
 
102
103
  def execute_fuzzy_find():
@@ -104,4 +105,11 @@ def find(
104
105
  script = f"return cucu.fuzzy_find({','.join(args)});"
105
106
  return browser.execute(script)
106
107
 
107
- return search_in_all_frames(browser, execute_fuzzy_find)
108
+ fuzzy_return = search_in_all_frames(browser, execute_fuzzy_find)
109
+ if fuzzy_return is None:
110
+ logger.info("Fuzzy found no element.")
111
+ return None
112
+ logger.info(
113
+ "Fuzzy found element by search term {}".format(fuzzy_return[1])
114
+ )
115
+ return fuzzy_return[0]
cucu/fuzzy/fuzzy.js CHANGED
@@ -54,13 +54,15 @@
54
54
  things,
55
55
  index=0,
56
56
  direction=LEFT_TO_RIGHT,
57
- name_within_thing=false) {
57
+ name_within_thing=false,
58
+ insert_label=false) {
58
59
  var elements = [];
60
+ var element_labels = [];
59
61
  var results = null;
60
62
  var attributes = ['aria-label', 'title', 'placeholder', 'value'];
61
63
  var matchers = ['has_text', 'contains'];
62
64
 
63
- name = name.replaceAll('"', '\\"')
65
+ name = name.replaceAll('"', '\\"');
64
66
 
65
67
  /*
66
68
  * try to match on exact text but ultimately fall back to matching on
@@ -75,24 +77,27 @@
75
77
  for(var tIndex = 0; tIndex < things.length; tIndex++) {
76
78
  var thing = things[tIndex];
77
79
 
78
- /*
79
- * <thing>name</thing>
80
- */
81
- results = jqCucu(thing + ':vis:' + matcher + '("' + name + '")', document.body).toArray();
82
- if (cucu.debug) { console.log('<thing>name</thing>', results); }
80
+ var nameInTagContentLabel = `<${thing}>${name}</${thing}>`;
81
+ var nameInTagContentJq = `${thing}:vis:${matcher}("${name}")`;
82
+ results = jqCucu(nameInTagContentJq, document.body).toArray();
83
+ if (cucu.debug) { console.log(nameInTagContentLabel, results); }
83
84
  elements = elements.concat(results);
85
+ element_labels = element_labels.concat(results.map(x => nameInTagContentLabel));
84
86
 
85
- // <thing attribute="name"></thing>
86
87
  for(var aIndex=0; aIndex < attributes.length; aIndex++) {
87
88
  var attribute_name = attributes[aIndex];
89
+ var nameIsAttributeLabel = `<${thing} attribute="${attribute_name}"></${thing}>`;
88
90
  if (matcher == 'has_text') {
89
- results = jqCucu(thing + '[' + attribute_name + '="' + name + '"]:vis', document.body).toArray();
90
- if (cucu.debug) { console.log('<thing attribute="name"></thing>', results); }
91
+ var nameIsAttributeJq = `${thing}[${attribute_name}="${name}"]:vis`;
92
+ results = jqCucu(nameIsAttributeJq, document.body).toArray();
93
+ if (cucu.debug) { console.log(nameIsAttributeLabel, results); }
91
94
  } else if (matcher == 'contains') {
92
- results = jqCucu(thing + '[' + attribute_name + '*="' + name + '"]:vis', document.body).toArray();
93
- if (cucu.debug) { console.log('<thing attribute*="name"></thing>', results); }
95
+ var nameInAttributeJq = `${thing}[${attribute_name}*="${name}"]:vis`;
96
+ results = jqCucu(nameInAttributeJq, document.body).toArray();
97
+ if (cucu.debug) { console.log(nameIsAttributeLabel, results); }
94
98
  }
95
99
  elements = elements.concat(results);
100
+ element_labels = element_labels.concat(results.map(x => nameIsAttributeLabel));
96
101
  }
97
102
  }
98
103
 
@@ -107,38 +112,44 @@
107
112
  for(var tIndex = 0; tIndex < things.length; tIndex++) {
108
113
  var thing = things[tIndex];
109
114
 
110
- // <thing value="name"></thing>
111
115
  if (matcher == 'has_text') {
112
- results = jqCucu(thing + ':vis', document.body).filter(function(){
116
+ var nameIsValueLabel = `${thing} value="${name}"></${thing}>`;
117
+ var nameIsValueJq = `${thing}:vis`;
118
+ results = jqCucu(nameInValueJq, document.body).filter(function(){
113
119
  return this.value == name;
114
120
  }).toArray();
115
- if (cucu.debug) { console.log('<thing value="name"></thing>', results); }
121
+ if (cucu.debug) { console.log(nameIsValueLabel, results); }
116
122
  } else if (matcher == 'contains') {
117
- results = jqCucu(thing + ':vis', document.body).filter(function(){
123
+ var nameInValueLabel = `${thing} value*="${name}"></${thing}>`;
124
+ var nameInValueJq = `${thing}:vis`;
125
+ results = jqCucu(nameInValueJq, document.body).filter(function(){
118
126
  return this.value !== undefined && String(this.value).indexOf(name) != -1;
119
127
  }).toArray();
120
- if (cucu.debug) { console.log('<thing value*="name"></thing>', results); }
128
+ if (cucu.debug) { console.log(nameInValueLabel, results); }
121
129
  }
122
130
  elements = elements.concat(results);
131
+ element_labels = element_labels.concat(results.map(x => nameInValueLabel));
123
132
  }
124
133
 
125
134
  /*
126
135
  * element labeled by another using the for/id attributes
127
136
  */
128
- var labels = jqCucu('*[for]:vis:' + matcher + '("' + name + '")', document.body).toArray();
137
+ var labelForNameJq = `*[for]:vis:${matcher}("${name}")`
138
+ var labels = jqCucu(labelForNameJq, document.body).toArray();
129
139
  for(var tIndex = 0; tIndex < things.length; tIndex++) {
130
140
  var thing = things[tIndex];
131
141
  results = [];
132
142
 
133
- /*
134
- * <* for=...>name</*>...<thing id=...></thing>
135
- */
143
+ var labelForNameLabel = `<* for=...>${name}</*>...<${thing} id=...></${thing}>`;
136
144
  for(var lIndex=0; lIndex < labels.length; lIndex++) {
137
145
  var label = labels[lIndex];
138
146
  var id = label.getAttribute('for');
139
- results = jqCucu(thing + '[id="' + id + '"]:vis', document.body).toArray();
140
- if (cucu.debug) { console.log('<* for=...>name</*>...<thing id=...></thing>', results); }
147
+ var idMatchesForLabelJq = `${thing}[id="${id}"]:vis`;
148
+ results = jqCucu(idMatchesForLabelJq, document.body).toArray();
149
+
150
+ if (cucu.debug) { console.log(labelForNameLabel, results); }
141
151
  elements = elements.concat(results);
152
+ element_labels = element_labels.concat(results.map(x => labelForNameLabel));
142
153
  }
143
154
  }
144
155
 
@@ -148,19 +159,23 @@
148
159
  for(var tIndex = 0; tIndex < things.length; tIndex++) {
149
160
  var thing = things[tIndex];
150
161
 
151
- /*
152
- * <thing><*>...name...</*></thing>
153
- */
162
+ var nameInNestedChildLabel = `<${thing}><*>...${name}...</*></${thing}>`;
154
163
  results = jqCucu('*:vis:' + matcher + '("' + name + '")', document.body).parents(thing).toArray();
155
- if (cucu.debug) { console.log('<thing><*>...name...</*></thing>', results); }
164
+ if (cucu.debug) { console.log(nameInNestedChildLabel, results); }
156
165
  elements = elements.concat(results);
166
+ if (results.length > 0) {
167
+ console.log('!*!*!* Found element labeled by nested child!');
168
+ console.log(`!*!*!* elements: ${elements}`);
169
+ }
170
+ element_labels = element_labels.concat(results.map(x => nameInNestedChildLabel));
157
171
 
158
- // <thing><* attribute="name"></*></thing>
159
172
  for(var aIndex=0; aIndex < attributes.length; aIndex++) {
160
173
  var attribute_name = attributes[aIndex];
161
- results = jqCucu('*:vis[' + attribute_name + '="' + name + '"]', document.body).parents(thing).toArray();
162
- if (cucu.debug) { console.log('<thing><* attibute="name"></*></thing>', results); }
174
+ var innerNestedElementsLabel = `<${thing}><* ${attribute_name}="${name}"></*></${thing}>`;
175
+ results = jqCucu(`*:vis[${attribute_name}="${name}"]`, document.body).parents(thing).toArray();
176
+ if (cucu.debug) { console.log(innerNestedElementsLabel, results); }
163
177
  elements = elements.concat(results);
178
+ element_labels = element_labels.concat(results.map(x => innerNestedElementsLabel));
164
179
  }
165
180
  }
166
181
 
@@ -174,10 +189,11 @@
174
189
  for(var tIndex = 0; tIndex < things.length; tIndex++) {
175
190
  var thing = things[tIndex];
176
191
 
177
- // <*>name</*><thing/>
178
- results = jqCucu('*:vis:' + matcher + '("' + name + '")', document.body).next(thing + ':vis').toArray();
179
- if (cucu.debug) { console.log('<*>name</*><thing/>', results); }
192
+ var nameIsPreviousSiblingLabel = `<*>${name}</*><${thing}/>`;
193
+ results = jqCucu(`*:vis:${matcher}("${name}")`, document.body).next(thing + ':vis').toArray();
194
+ if (cucu.debug) { console.log(nameIsPreviousSiblingLabel, results); }
180
195
  elements = elements.concat(results);
196
+ element_labels = element_labels.concat(results.map(x => nameIsPreviousSiblingLabel));
181
197
  }
182
198
  }
183
199
 
@@ -186,10 +202,11 @@
186
202
  for(var tIndex = 0; tIndex < things.length; tIndex++) {
187
203
  var thing = things[tIndex];
188
204
 
189
- // <thing/><*>name</*>
190
- results = jqCucu('*:vis:' + matcher + '("' + name + '")', document.body).prev(thing).toArray();
191
- if (cucu.debug) { console.log('<thing/><*>name</*>', results); }
205
+ var nameIsNextSiblingLabel = `<${thing}/><*>${name}</*>`;
206
+ results = jqCucu(`*:vis:${matcher}("${name}")`, document.body).prev(thing).toArray();
207
+ if (cucu.debug) { console.log(nameIsNextSiblingLabel, results); }
192
208
  elements = elements.concat(results);
209
+ element_labels = element_labels.concat(results.map(x => nameIsNextSiblingLabel));
193
210
  }
194
211
  }
195
212
 
@@ -199,12 +216,11 @@
199
216
  for(var tIndex = 0; tIndex < things.length; tIndex++) {
200
217
  var thing = things[tIndex];
201
218
 
202
- /*
203
- * <*><thing></thing>name</*>
204
- */
205
- results = jqCucu('*:vis:' + matcher + '("' + name + '")', document.body).children(thing + ':vis').toArray();
206
- if (cucu.debug) { console.log('<*><thing></thing>name</*>', results); }
219
+ var nameIsTextSiblingLabel = `<*><${thing}></${thing}>${name}</*>`;
220
+ results = jqCucu(`*:vis:${matcher}("${name}")`, document.body).children(thing + ':vis').toArray();
221
+ if (cucu.debug) { console.log(nameIsTextSiblingLabel, results); }
207
222
  elements = elements.concat(results);
223
+ element_labels = element_labels.concat(results.map(x => nameIsTextSiblingLabel));
208
224
  }
209
225
 
210
226
  // element labeled with any previous sibling
@@ -212,17 +228,19 @@
212
228
  for(var tIndex = 0; tIndex < things.length; tIndex++) {
213
229
  var thing = things[tIndex];
214
230
 
215
- // <*>name</*>...<thing>...
216
- results = jqCucu('*:vis:' + matcher + '("' + name + '")', document.body).nextAll(thing + ':vis').toArray();
217
- if (cucu.debug) { console.log('<*>name</*>...<thing>...', results); }
231
+ var leftToRightLabel = `<*>${name}</*>...<${thing}>...`;
232
+ results = jqCucu(`*:vis:${matcher}("${name}")`, document.body).nextAll(thing + ':vis').toArray();
233
+ if (cucu.debug) { console.log(leftToRightLabel, results); }
218
234
  elements = elements.concat(results);
235
+ element_labels = element_labels.concat(results.map(x => leftToRightLabel));
219
236
 
220
- // <...><*>name</*></...>...<...><thing></...>
237
+ var leftToRightGrandpaLabel = `<...><*>${name}</*></...>...<...><${thing}></...>`;
221
238
  // XXX: this rule is horribly complicated and I'd rather see it gone
222
239
  // basically: common great grandpranet
223
- results = jqCucu('*:vis:' + matcher + '("' + name + '")', document.body).nextAll().find(thing + ':vis').toArray();
224
- if (cucu.debug) { console.log('<...><*>name</*></...>...<...><thing></...>', results); }
240
+ results = jqCucu(`*:vis:${matcher}("${name}")`, document.body).nextAll().find(thing + ':vis').toArray();
241
+ if (cucu.debug) { console.log(leftToRightGrandpaLabel, results); }
225
242
  elements = elements.concat(results);
243
+ element_labels = element_labels.concat(results.map(x => leftToRightGrandpaLabel));
226
244
  }
227
245
  }
228
246
 
@@ -231,22 +249,29 @@
231
249
  for(var tIndex = 0; tIndex < things.length; tIndex++) {
232
250
  var thing = things[tIndex];
233
251
 
234
- // next siblings: <thing>...<*>name</*>...
235
- results = jqCucu('*:vis:' + matcher + '("' + name + '")', document.body).prevAll(thing).toArray();
236
- if (cucu.debug) { console.log('<thing>...<*>name</*>...', results); }
252
+ var rightToLeftLabel = `<${thing}>...<*>${name}</*>...`;
253
+ results = jqCucu(`*:vis:${matcher}("${name}")`, document.body).prevAll(thing).toArray();
254
+ if (cucu.debug) { console.log(rightToLeftLabel, results); }
237
255
  elements = elements.concat(results);
256
+ element_labels = element_labels.concat(results.map(x => rightToLeftLabel));
238
257
 
239
- // <...><thing></...>...<...><*>name</*></...>
258
+ var rightToLeftGrandpaLabel = `<...><${thing}></...>...<...><*>${name}</*></...>`;
240
259
  // XXX: this rule is horribly complicated and I'd rather see it gone
241
- results = jqCucu('*:vis:' + matcher + '("' + name + '")', document.body).prevAll().find(thing + ':vis').toArray();
242
- if (cucu.debug) { console.log('<...><thin></...>...<...><*>name</*></...>', results); }
260
+ results = jqCucu(`*:vis:${matcher}("${name}")`, document.body).prevAll().find(thing + ':vis').toArray();
261
+ if (cucu.debug) { console.log(rightToLeftGrandpaLabel, results); }
243
262
  elements = elements.concat(results);
263
+ element_labels = element_labels.concat(results.map(x => rightToLeftGrandpaLabel));
244
264
  }
245
265
  }
246
266
  }
247
267
 
248
268
  if (cucu.debug) {
249
269
  console.log(elements);
270
+ console.log(element_labels);
271
+ }
272
+
273
+ if (elements.length > 0 && insert_label) {
274
+ return [elements[index], element_labels[index]];
250
275
  }
251
276
  return elements[index];
252
277
  };
cucu/reporter/html.py CHANGED
@@ -247,7 +247,9 @@ def generate(results, basepath, only_failures=False):
247
247
  "__CUCU_HTML_REPORT_SCENARIO_SUBHEADER_HANDLER"
248
248
  ]:
249
249
  try:
250
- sub_headers.append(handler(scenario))
250
+ sub_header = handler(scenario, feature)
251
+ if sub_header:
252
+ sub_headers.append(sub_header)
251
253
  except Exception:
252
254
  logger.warning(
253
255
  f'Exception while trying to run sub_headers hook for scenario: "{scenario["name"]}"\n{traceback.format_exc()}'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: cucu
3
- Version: 1.3.9
3
+ Version: 1.3.11
4
4
  Summary: Easy BDD web testing
5
5
  Keywords: cucumber,selenium,behave
6
6
  Author: Domino Data Lab, Rodney Gomes, Cedric Young, Xin Dong, Kavya Yakkati, Kevin Garton, Joy Liao
@@ -7,7 +7,7 @@ cucu/browser/frames.py,sha256=IW7kzRJn5PkbMaovIelAeCWO-T-2sOTwqaYBw-0-LKU,3545
7
7
  cucu/browser/selenium.py,sha256=eUC2DZkhUIZi70sVTaNE_0AhanGTceyx_pCLIT7PN6o,13299
8
8
  cucu/browser/selenium_tweaks.py,sha256=oUIhWVhBZbc9qsmQUJMpIr9uUWKxtgZBcnySWU6Yttk,879
9
9
  cucu/cli/__init__.py,sha256=uXX5yVG1konJ_INdlrcfMg-Tt_5_cSx29Ed8R8v908A,62
10
- cucu/cli/core.py,sha256=On0i9QzGoJ6ZFEYwt1Ae50i8YZFAAqeB__ULW8jcXc4,26950
10
+ cucu/cli/core.py,sha256=gIc_r6qjfLxVvGiiJeSErdsXsoKWlhi9ca_EaBUx6fM,26673
11
11
  cucu/cli/run.py,sha256=XIGIACPieywM5Mi3k_CycM9eiRElzGNZdHlV0_TDSVY,6118
12
12
  cucu/cli/steps.py,sha256=lg5itVH_C-0_3RelWXv9X2qQUHggdxuxLCGwH5l1bf4,4210
13
13
  cucu/cli/thread_dumper.py,sha256=Z3XnYSxidx6pqjlQ7zu-TKMIYZWk4z9c5YLdPkcemiU,1593
@@ -24,8 +24,8 @@ cucu/formatter/json.py,sha256=fJ1dZBGwYD4OkhQFDE49MRKGNzsrhDzQYq-dUfsYh94,10589
24
24
  cucu/formatter/junit.py,sha256=dCyS47iHOqn5AZjsRpWCsDRkxxJ67IZy3wIlE5jjhoM,10249
25
25
  cucu/formatter/rundb.py,sha256=dKNlD-LXmrJ1Gm4OHI7Cs49eMuBGlBfwLz7NLISF5sg,7857
26
26
  cucu/fuzzy/__init__.py,sha256=ce4JRmaBF6oab6U99Qbpt7DrD3elhH32__-ND6fw5xc,104
27
- cucu/fuzzy/core.py,sha256=tmQKX_Ni-2ohoxzctRUg2x7zMeEW8MlJJmpU3PfTmvQ,3153
28
- cucu/fuzzy/fuzzy.js,sha256=ee-TytISLyUo7cMAkuVI5qbLXdt0eoFWczTsoU4zYhg,11618
27
+ cucu/fuzzy/core.py,sha256=CMxS5XifmWNtuDacGA8SA6dAUNuFR71WrNzZ2uK0_vc,3395
28
+ cucu/fuzzy/fuzzy.js,sha256=7ppPmR8szoEQ2rfIsyTmtYDgTrNwXrP_g11y-qEITGk,13882
29
29
  cucu/helpers.py,sha256=l_YMmbuXjtBRo-MER-qe6soUIyjt0ey2BoSgWs4zYwA,36285
30
30
  cucu/hooks.py,sha256=3Z1mavU42XMQ0DZ7lVWwTB-BJYHRyYUOzzOtmkdIsow,7117
31
31
  cucu/init_data/.gitignore,sha256=FgMovmORdGgSvRH6EoFK6ch_EyCMyQof61yamXG0P50,137
@@ -56,7 +56,7 @@ cucu/reporter/external/jquery-3.5.1.min.js,sha256=9_aliU8dGd2tb6OSsuzixeV4y_faTq
56
56
  cucu/reporter/external/jquery.dataTables.min.js,sha256=XNhaB1tBOSFMHu96BSAJpZOJzfZ4SZI1nwAbnwry2UY,90265
57
57
  cucu/reporter/external/popper.min.js,sha256=pS96pU17yq-gVu4KBQJi38VpSuKN7otMrDQprzf_DWY,19188
58
58
  cucu/reporter/favicon.png,sha256=9ikXLAmzfQzy2NQps_8CGaZog2FvQrOX8nnSZ0e1UmM,2161
59
- cucu/reporter/html.py,sha256=PhITO1Zxc3WVl1nU7maKpDeUvYmlkkv4cMNTFJnnTxM,19516
59
+ cucu/reporter/html.py,sha256=I0eRj3FDQO6Oo1dWVmQ3wrDKqEuKC8mpUwdp5IJpDQU,19608
60
60
  cucu/reporter/templates/feature.html,sha256=IBkwGiul-sRO5lT8q8VFXMUJx1owsAd1YbdDzziSjKw,3645
61
61
  cucu/reporter/templates/flat.html,sha256=JGsMq-IWz6YUpJX9hcN65-15HxcX3NJclOmMDtW3HZE,2358
62
62
  cucu/reporter/templates/index.html,sha256=xgPYNU-sozN-iOaEzyymoQ4LDRI75eHXngbAP0xDYls,2770
@@ -88,7 +88,7 @@ cucu/steps/text_steps.py,sha256=Jj_GHoHeemNwVdUOdqcehArNp7WM-WMjljA4w0pLXuw,2576
88
88
  cucu/steps/variable_steps.py,sha256=WSctH3_xcxjijGPYZlxp-foC_SIAAKtF__saNtgZJbk,2966
89
89
  cucu/steps/webserver_steps.py,sha256=wWkpSvcSMdiskPkh4cqlepWx1nkvEpTU2tRXQmPDbyo,1410
90
90
  cucu/utils.py,sha256=LCcs8sMzvdvH05N8P5QYO4lO6j-_PQC530mEAD96go8,10957
91
- cucu-1.3.9.dist-info/WHEEL,sha256=-neZj6nU9KAMg2CnCY6T3w8J53nx1kFGw_9HfoSzM60,79
92
- cucu-1.3.9.dist-info/entry_points.txt,sha256=11WRIhQM7LuUnQg1lAoZQoNvvBvYNN1maDgQS4djwJo,40
93
- cucu-1.3.9.dist-info/METADATA,sha256=3vWeUwEJ0WyZAdYNYAktzlhpWg7vWTz0i_cqiLb2tvk,16721
94
- cucu-1.3.9.dist-info/RECORD,,
91
+ cucu-1.3.11.dist-info/WHEEL,sha256=-neZj6nU9KAMg2CnCY6T3w8J53nx1kFGw_9HfoSzM60,79
92
+ cucu-1.3.11.dist-info/entry_points.txt,sha256=11WRIhQM7LuUnQg1lAoZQoNvvBvYNN1maDgQS4djwJo,40
93
+ cucu-1.3.11.dist-info/METADATA,sha256=diIgoAsSKpyOJOxNJv2qymSkVL1k697sbpoaI-pZ-0Q,16722
94
+ cucu-1.3.11.dist-info/RECORD,,
File without changes