@seleniumhq/code-export-python-pytest 3.17.0 → 3.17.2
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.
- package/__test__/src/__snapshots__/command.spec.js.snap +10 -10
- package/__test__/src/__snapshots__/index.spec.js.snap +14 -3
- package/__test__/src/command.spec.js +1 -1
- package/__test__/src/index.spec.js +10 -1
- package/__test__/src/selection.spec.js +7 -0
- package/dist/command.js +30 -10
- package/dist/index.js +2 -1
- package/dist/selection.js +4 -0
- package/package.json +3 -4
- package/src/command.js +30 -10
- package/src/index.js +1 -0
- package/src/selection.js +3 -0
- package/LICENSE +0 -202
- package/dist/hooks/afterAll.js +0 -48
- package/dist/hooks/afterEach.js +0 -49
- package/dist/hooks/beforeAll.js +0 -48
- package/dist/hooks/beforeEach.js +0 -50
- package/dist/hooks/declareDependencies.js +0 -66
- package/dist/hooks/declareMethods.js +0 -53
- package/dist/hooks/declareVariables.js +0 -48
- package/dist/hooks/inEach.js +0 -42
- package/dist/hooks/inEachBegin.js +0 -42
- package/dist/hooks/inEachEnd.js +0 -42
- package/dist/hooks/index.js +0 -61
- package/dist/parsers.js +0 -31
- package/yarn-error.log +0 -2196
|
@@ -123,9 +123,9 @@ actions = ActionChains(self.driver)
|
|
|
123
123
|
actions.drag_and_drop(dragged, dropped).perform()"
|
|
124
124
|
`;
|
|
125
125
|
|
|
126
|
-
exports[`command code emitter should emit \`echo\` command 1`] = `"print(
|
|
126
|
+
exports[`command code emitter should emit \`echo\` command 1`] = `"print(\\"blah\\")"`;
|
|
127
127
|
|
|
128
|
-
exports[`command code emitter should emit \`echo\` command with variables 1`] = `"print(
|
|
128
|
+
exports[`command code emitter should emit \`echo\` command with variables 1`] = `"print(\\"blah = {}\\".format(self.vars[\\"blah\\"]))"`;
|
|
129
129
|
|
|
130
130
|
exports[`command code emitter should emit \`edit content\` command 1`] = `
|
|
131
131
|
"element = self.driver.find_element(By.ID, \\"contentEditable\\")
|
|
@@ -225,7 +225,7 @@ actions.move_to_element(element).release().perform()"
|
|
|
225
225
|
|
|
226
226
|
exports[`command code emitter should emit \`open\` with absolute url 1`] = `"self.driver.get(\\"https://www.seleniumhq.org/\\")"`;
|
|
227
227
|
|
|
228
|
-
exports[`command code emitter should emit \`pause\` command 1`] = `"time.sleep(
|
|
228
|
+
exports[`command code emitter should emit \`pause\` command 1`] = `"time.sleep(0.3)"`;
|
|
229
229
|
|
|
230
230
|
exports[`command code emitter should emit \`remove selection\` command 1`] = `
|
|
231
231
|
"dropdown = self.driver.find_element(By.CSS_SELECTOR, \\"select\\")
|
|
@@ -348,19 +348,19 @@ assert value == \\"test\\""
|
|
|
348
348
|
|
|
349
349
|
exports[`command code emitter should emit \`verify\` command 1`] = `"assert(self.vars[\\"varrrName\\"] == \\"blah\\")"`;
|
|
350
350
|
|
|
351
|
-
exports[`command code emitter should emit \`waitForElementEditable\` command 1`] = `"WebDriverWait(self.driver,
|
|
351
|
+
exports[`command code emitter should emit \`waitForElementEditable\` command 1`] = `"WebDriverWait(self.driver, 5).until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, \\"#blah\\")))"`;
|
|
352
352
|
|
|
353
|
-
exports[`command code emitter should emit \`waitForElementNotEditable\` command 1`] = `"WebDriverWait(self.driver,
|
|
353
|
+
exports[`command code emitter should emit \`waitForElementNotEditable\` command 1`] = `"WebDriverWait(self.driver, 5).until_not(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, \\"#blah\\")))"`;
|
|
354
354
|
|
|
355
|
-
exports[`command code emitter should emit \`waitForElementNotPresent\` command 1`] = `"WebDriverWait(self.driver,
|
|
355
|
+
exports[`command code emitter should emit \`waitForElementNotPresent\` command 1`] = `"WebDriverWait(self.driver, 5).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, \\"#blah\\")))"`;
|
|
356
356
|
|
|
357
|
-
exports[`command code emitter should emit \`waitForElementNotVisible\` command 1`] = `"WebDriverWait(self.driver,
|
|
357
|
+
exports[`command code emitter should emit \`waitForElementNotVisible\` command 1`] = `"WebDriverWait(self.driver, 5).until(expected_conditions.invisibility_of_element_located((By.CSS_SELECTOR, \\"#blah\\")))"`;
|
|
358
358
|
|
|
359
|
-
exports[`command code emitter should emit \`waitForElementPresent\` command 1`] = `"WebDriverWait(self.driver,
|
|
359
|
+
exports[`command code emitter should emit \`waitForElementPresent\` command 1`] = `"WebDriverWait(self.driver, 5).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR, \\"#blah\\")))"`;
|
|
360
360
|
|
|
361
|
-
exports[`command code emitter should emit \`waitForElementVisible\` command 1`] = `"WebDriverWait(self.driver,
|
|
361
|
+
exports[`command code emitter should emit \`waitForElementVisible\` command 1`] = `"WebDriverWait(self.driver, 5).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, \\"#blah\\")))"`;
|
|
362
362
|
|
|
363
|
-
exports[`command code emitter should emit \`waitForText\` command 1`] = `"WebDriverWait(self.driver,
|
|
363
|
+
exports[`command code emitter should emit \`waitForText\` command 1`] = `"WebDriverWait(self.driver, 30).until(expected_conditions.text_to_be_present_in_element((By.CSS_SELECTOR, \\"#blah\\"), \\"text\\"))"`;
|
|
364
364
|
|
|
365
365
|
exports[`command code emitter should emit \`while\` command 1`] = `
|
|
366
366
|
Object {
|
|
@@ -127,7 +127,7 @@ from selenium.webdriver.support.wait import WebDriverWait
|
|
|
127
127
|
from selenium.webdriver.common.keys import Keys
|
|
128
128
|
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
|
|
129
129
|
|
|
130
|
-
class
|
|
130
|
+
class TestReusedmethods():
|
|
131
131
|
def setup_method(self, method):
|
|
132
132
|
self.driver = webdriver.Chrome()
|
|
133
133
|
self.vars = {}
|
|
@@ -140,7 +140,11 @@ class TestLogin():
|
|
|
140
140
|
self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click()
|
|
141
141
|
self.driver.find_element(By.ID, \\"username\\").send_keys(self.vars[\\"username\\"])
|
|
142
142
|
self.driver.find_element(By.ID, \\"password\\").send_keys(self.vars[\\"password\\"])
|
|
143
|
-
self.driver.
|
|
143
|
+
if self.driver.execute_script(\\"return (true)\\"):
|
|
144
|
+
self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click()
|
|
145
|
+
|
|
146
|
+
def tinymethod(self):
|
|
147
|
+
self.vars[\\"value\\"] = \\"field\\"
|
|
144
148
|
|
|
145
149
|
def test_invalidcredentials(self):
|
|
146
150
|
self.vars[\\"username\\"] = \\"blah\\"
|
|
@@ -152,6 +156,12 @@ class TestLogin():
|
|
|
152
156
|
self.vars[\\"password\\"] = \\"SuperSecretPassword!\\"
|
|
153
157
|
self.login()
|
|
154
158
|
|
|
159
|
+
def test_twomethods(self):
|
|
160
|
+
self.vars[\\"username\\"] = \\"blah\\"
|
|
161
|
+
self.vars[\\"password\\"] = \\"blah\\"
|
|
162
|
+
self.login()
|
|
163
|
+
self.tinymethod()
|
|
164
|
+
|
|
155
165
|
"
|
|
156
166
|
`;
|
|
157
167
|
|
|
@@ -305,7 +315,8 @@ class TestValidcredentials():
|
|
|
305
315
|
self.driver.find_element(By.LINK_TEXT, \\"Form Authentication\\").click()
|
|
306
316
|
self.driver.find_element(By.ID, \\"username\\").send_keys(self.vars[\\"username\\"])
|
|
307
317
|
self.driver.find_element(By.ID, \\"password\\").send_keys(self.vars[\\"password\\"])
|
|
308
|
-
self.driver.
|
|
318
|
+
if self.driver.execute_script(\\"return (true)\\"):
|
|
319
|
+
self.driver.find_element(By.CSS_SELECTOR, \\".fa\\").click()
|
|
309
320
|
|
|
310
321
|
def test_validcredentials(self):
|
|
311
322
|
self.vars[\\"username\\"] = \\"tomsmith\\"
|
|
@@ -272,7 +272,7 @@ describe('command code emitter', () => {
|
|
|
272
272
|
it('should emit `echo` command with variables', () => {
|
|
273
273
|
const command = {
|
|
274
274
|
command: 'echo',
|
|
275
|
-
target: '${blah}',
|
|
275
|
+
target: 'blah = ${blah}',
|
|
276
276
|
value: '',
|
|
277
277
|
}
|
|
278
278
|
return expect(prettify(command)).resolves.toMatchSnapshot()
|
|
@@ -17,7 +17,13 @@
|
|
|
17
17
|
|
|
18
18
|
import fs from 'fs'
|
|
19
19
|
import path from 'path'
|
|
20
|
-
import
|
|
20
|
+
import codeExport, {
|
|
21
|
+
emitTest,
|
|
22
|
+
emitSuite,
|
|
23
|
+
_emitMethod,
|
|
24
|
+
_findTestByName,
|
|
25
|
+
} from '../../src'
|
|
26
|
+
import Command from '../../src/command'
|
|
21
27
|
import { project as projectProcessor } from '@seleniumhq/side-utils'
|
|
22
28
|
|
|
23
29
|
function readFile(filename) {
|
|
@@ -132,6 +138,9 @@ describe('Code Export Python pytest', () => {
|
|
|
132
138
|
expect(results.body).toBeDefined()
|
|
133
139
|
expect(results.body).toMatchSnapshot()
|
|
134
140
|
})
|
|
141
|
+
it('should export the command emitter', () => {
|
|
142
|
+
expect(Command.emit).toStrictEqual(codeExport.emit.command)
|
|
143
|
+
})
|
|
135
144
|
})
|
|
136
145
|
|
|
137
146
|
function normalizeProject(project) {
|
|
@@ -35,6 +35,13 @@ describe('selection location code emitter', () => {
|
|
|
35
35
|
`By.XPATH, "//option[. = '${selector}']"`
|
|
36
36
|
)
|
|
37
37
|
})
|
|
38
|
+
it('should emit label locator with variable', () => {
|
|
39
|
+
const type = 'label'
|
|
40
|
+
const selector = 'self.vars["label"]'
|
|
41
|
+
return expect(emit(`${type}=${selector}`)).resolves.toEqual(
|
|
42
|
+
`By.XPATH, "//option[. = '{}']".format(${selector})`
|
|
43
|
+
)
|
|
44
|
+
})
|
|
38
45
|
it('should emit id locator', () => {
|
|
39
46
|
const type = 'id'
|
|
40
47
|
const selector = 'someId'
|
package/dist/command.js
CHANGED
|
@@ -399,10 +399,22 @@ async function emitDragAndDrop(dragged, dropped) {
|
|
|
399
399
|
});
|
|
400
400
|
}
|
|
401
401
|
|
|
402
|
+
function translateToPythonString(str) {
|
|
403
|
+
const regExp = /self.vars\["\w+"]/;
|
|
404
|
+
const vars = str.match(regExp);
|
|
405
|
+
|
|
406
|
+
if (vars && vars.length > 0) {
|
|
407
|
+
const fmtStr = str.replace(regExp, '{}');
|
|
408
|
+
return `"${fmtStr}".format(${vars.join(', ')})`;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
return `"${str}"`;
|
|
412
|
+
}
|
|
413
|
+
|
|
402
414
|
async function emitEcho(message) {
|
|
403
|
-
const _message = message
|
|
415
|
+
const _message = translateToPythonString(message);
|
|
404
416
|
|
|
405
|
-
return Promise.resolve(`print(
|
|
417
|
+
return Promise.resolve(`print(${_message})`);
|
|
406
418
|
}
|
|
407
419
|
|
|
408
420
|
async function emitEditContent(locator, content) {
|
|
@@ -499,9 +511,10 @@ function emitOpen(target) {
|
|
|
499
511
|
}
|
|
500
512
|
|
|
501
513
|
async function emitPause(time) {
|
|
514
|
+
const sec = time / 1000;
|
|
502
515
|
const commands = [{
|
|
503
516
|
level: 0,
|
|
504
|
-
statement: `time.sleep(${
|
|
517
|
+
statement: `time.sleep(${sec})`
|
|
505
518
|
}];
|
|
506
519
|
return Promise.resolve({
|
|
507
520
|
commands
|
|
@@ -809,9 +822,10 @@ async function emitVerifyTitle(title) {
|
|
|
809
822
|
}
|
|
810
823
|
|
|
811
824
|
async function emitWaitForElementEditable(locator, timeout) {
|
|
825
|
+
const sec = timeout / 1000;
|
|
812
826
|
const commands = [{
|
|
813
827
|
level: 0,
|
|
814
|
-
statement: `WebDriverWait(self.driver, ${
|
|
828
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.element_to_be_clickable((${await _location.default.emit(locator)})))`
|
|
815
829
|
}];
|
|
816
830
|
return Promise.resolve({
|
|
817
831
|
commands
|
|
@@ -820,9 +834,10 @@ async function emitWaitForElementEditable(locator, timeout) {
|
|
|
820
834
|
|
|
821
835
|
async function emitWaitForText(locator, text) {
|
|
822
836
|
const timeout = 30000;
|
|
837
|
+
const sec = timeout / 1000;
|
|
823
838
|
const commands = [{
|
|
824
839
|
level: 0,
|
|
825
|
-
statement: `WebDriverWait(self.driver, ${
|
|
840
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.text_to_be_present_in_element((${await _location.default.emit(locator)}), "${text}"))`
|
|
826
841
|
}];
|
|
827
842
|
return Promise.resolve({
|
|
828
843
|
commands
|
|
@@ -834,9 +849,10 @@ function skip() {
|
|
|
834
849
|
}
|
|
835
850
|
|
|
836
851
|
async function emitWaitForElementPresent(locator, timeout) {
|
|
852
|
+
const sec = timeout / 1000;
|
|
837
853
|
const commands = [{
|
|
838
854
|
level: 0,
|
|
839
|
-
statement: `WebDriverWait(self.driver, ${
|
|
855
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.presence_of_element_located((${await _location.default.emit(locator)})))`
|
|
840
856
|
}];
|
|
841
857
|
return Promise.resolve({
|
|
842
858
|
commands
|
|
@@ -844,9 +860,10 @@ async function emitWaitForElementPresent(locator, timeout) {
|
|
|
844
860
|
}
|
|
845
861
|
|
|
846
862
|
async function emitWaitForElementVisible(locator, timeout) {
|
|
863
|
+
const sec = timeout / 1000;
|
|
847
864
|
const commands = [{
|
|
848
865
|
level: 0,
|
|
849
|
-
statement: `WebDriverWait(self.driver, ${
|
|
866
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.visibility_of_element_located((${await _location.default.emit(locator)})))`
|
|
850
867
|
}];
|
|
851
868
|
return Promise.resolve({
|
|
852
869
|
commands
|
|
@@ -854,9 +871,10 @@ async function emitWaitForElementVisible(locator, timeout) {
|
|
|
854
871
|
}
|
|
855
872
|
|
|
856
873
|
async function emitWaitForElementNotEditable(locator, timeout) {
|
|
874
|
+
const sec = timeout / 1000;
|
|
857
875
|
const commands = [{
|
|
858
876
|
level: 0,
|
|
859
|
-
statement: `WebDriverWait(self.driver, ${
|
|
877
|
+
statement: `WebDriverWait(self.driver, ${sec}).until_not(expected_conditions.element_to_be_clickable((${await _location.default.emit(locator)})))`
|
|
860
878
|
}];
|
|
861
879
|
return Promise.resolve({
|
|
862
880
|
commands
|
|
@@ -864,9 +882,10 @@ async function emitWaitForElementNotEditable(locator, timeout) {
|
|
|
864
882
|
}
|
|
865
883
|
|
|
866
884
|
async function emitWaitForElementNotPresent(locator, timeout) {
|
|
885
|
+
const sec = timeout / 1000;
|
|
867
886
|
const commands = [{
|
|
868
887
|
level: 0,
|
|
869
|
-
statement: `WebDriverWait(self.driver, ${
|
|
888
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.invisibility_of_element_located((${await _location.default.emit(locator)})))`
|
|
870
889
|
}];
|
|
871
890
|
return Promise.resolve({
|
|
872
891
|
commands
|
|
@@ -874,9 +893,10 @@ async function emitWaitForElementNotPresent(locator, timeout) {
|
|
|
874
893
|
}
|
|
875
894
|
|
|
876
895
|
async function emitWaitForElementNotVisible(locator, timeout) {
|
|
896
|
+
const sec = timeout / 1000;
|
|
877
897
|
const commands = [{
|
|
878
898
|
level: 0,
|
|
879
|
-
statement: `WebDriverWait(self.driver, ${
|
|
899
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.invisibility_of_element_located((${await _location.default.emit(locator)})))`
|
|
880
900
|
}];
|
|
881
901
|
return Promise.resolve({
|
|
882
902
|
commands
|
package/dist/index.js
CHANGED
package/dist/selection.js
CHANGED
|
@@ -49,6 +49,10 @@ function emitValue(value) {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
function emitLabel(label) {
|
|
52
|
+
if (label.startsWith('self.vars[')) {
|
|
53
|
+
return Promise.resolve(`By.XPATH, "//option[. = '{}']".format(${label})`);
|
|
54
|
+
}
|
|
55
|
+
|
|
52
56
|
return Promise.resolve(`By.XPATH, "//option[. = '${label}']"`);
|
|
53
57
|
}
|
|
54
58
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seleniumhq/code-export-python-pytest",
|
|
3
|
-
"version": "3.17.
|
|
3
|
+
"version": "3.17.2",
|
|
4
4
|
"description": "Export Selenium IDE project contents to Python pytest",
|
|
5
5
|
"repository": "https://github.com/SeleniumHQ/selenium-ide",
|
|
6
6
|
"keywords": [
|
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
"@babel/preset-env": "^7.4.5"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@seleniumhq/side-utils": "^3.17.
|
|
25
|
-
}
|
|
26
|
-
"gitHead": "b484b959037301c1d2383046a49449cd0def45d7"
|
|
24
|
+
"@seleniumhq/side-utils": "^3.17.2"
|
|
25
|
+
}
|
|
27
26
|
}
|
package/src/command.js
CHANGED
|
@@ -381,9 +381,21 @@ async function emitDragAndDrop(dragged, dropped) {
|
|
|
381
381
|
return Promise.resolve({ commands })
|
|
382
382
|
}
|
|
383
383
|
|
|
384
|
+
function translateToPythonString(str) {
|
|
385
|
+
const regExp = /self.vars\["\w+"]/
|
|
386
|
+
const vars = str.match(regExp)
|
|
387
|
+
|
|
388
|
+
if (vars && vars.length > 0) {
|
|
389
|
+
const fmtStr = str.replace(regExp, '{}')
|
|
390
|
+
return `"${fmtStr}".format(${vars.join(', ')})`
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return `"${str}"`
|
|
394
|
+
}
|
|
395
|
+
|
|
384
396
|
async function emitEcho(message) {
|
|
385
|
-
const _message = message
|
|
386
|
-
return Promise.resolve(`print(
|
|
397
|
+
const _message = translateToPythonString(message)
|
|
398
|
+
return Promise.resolve(`print(${_message})`)
|
|
387
399
|
}
|
|
388
400
|
|
|
389
401
|
async function emitEditContent(locator, content) {
|
|
@@ -485,7 +497,8 @@ function emitOpen(target) {
|
|
|
485
497
|
}
|
|
486
498
|
|
|
487
499
|
async function emitPause(time) {
|
|
488
|
-
const
|
|
500
|
+
const sec = time / 1000
|
|
501
|
+
const commands = [{ level: 0, statement: `time.sleep(${sec})` }]
|
|
489
502
|
return Promise.resolve({ commands })
|
|
490
503
|
}
|
|
491
504
|
|
|
@@ -855,10 +868,11 @@ async function emitVerifyTitle(title) {
|
|
|
855
868
|
}
|
|
856
869
|
|
|
857
870
|
async function emitWaitForElementEditable(locator, timeout) {
|
|
871
|
+
const sec = timeout / 1000
|
|
858
872
|
const commands = [
|
|
859
873
|
{
|
|
860
874
|
level: 0,
|
|
861
|
-
statement: `WebDriverWait(self.driver, ${
|
|
875
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.element_to_be_clickable((${await location.emit(
|
|
862
876
|
locator
|
|
863
877
|
)})))`,
|
|
864
878
|
},
|
|
@@ -868,10 +882,11 @@ async function emitWaitForElementEditable(locator, timeout) {
|
|
|
868
882
|
|
|
869
883
|
async function emitWaitForText(locator, text) {
|
|
870
884
|
const timeout = 30000
|
|
885
|
+
const sec = timeout / 1000
|
|
871
886
|
const commands = [
|
|
872
887
|
{
|
|
873
888
|
level: 0,
|
|
874
|
-
statement: `WebDriverWait(self.driver, ${
|
|
889
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.text_to_be_present_in_element((${await location.emit(
|
|
875
890
|
locator
|
|
876
891
|
)}), "${text}"))`,
|
|
877
892
|
},
|
|
@@ -884,10 +899,11 @@ function skip() {
|
|
|
884
899
|
}
|
|
885
900
|
|
|
886
901
|
async function emitWaitForElementPresent(locator, timeout) {
|
|
902
|
+
const sec = timeout / 1000
|
|
887
903
|
const commands = [
|
|
888
904
|
{
|
|
889
905
|
level: 0,
|
|
890
|
-
statement: `WebDriverWait(self.driver, ${
|
|
906
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.presence_of_element_located((${await location.emit(
|
|
891
907
|
locator
|
|
892
908
|
)})))`,
|
|
893
909
|
},
|
|
@@ -896,10 +912,11 @@ async function emitWaitForElementPresent(locator, timeout) {
|
|
|
896
912
|
}
|
|
897
913
|
|
|
898
914
|
async function emitWaitForElementVisible(locator, timeout) {
|
|
915
|
+
const sec = timeout / 1000
|
|
899
916
|
const commands = [
|
|
900
917
|
{
|
|
901
918
|
level: 0,
|
|
902
|
-
statement: `WebDriverWait(self.driver, ${
|
|
919
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.visibility_of_element_located((${await location.emit(
|
|
903
920
|
locator
|
|
904
921
|
)})))`,
|
|
905
922
|
},
|
|
@@ -910,10 +927,11 @@ async function emitWaitForElementVisible(locator, timeout) {
|
|
|
910
927
|
}
|
|
911
928
|
|
|
912
929
|
async function emitWaitForElementNotEditable(locator, timeout) {
|
|
930
|
+
const sec = timeout / 1000
|
|
913
931
|
const commands = [
|
|
914
932
|
{
|
|
915
933
|
level: 0,
|
|
916
|
-
statement: `WebDriverWait(self.driver, ${
|
|
934
|
+
statement: `WebDriverWait(self.driver, ${sec}).until_not(expected_conditions.element_to_be_clickable((${await location.emit(
|
|
917
935
|
locator
|
|
918
936
|
)})))`,
|
|
919
937
|
},
|
|
@@ -924,10 +942,11 @@ async function emitWaitForElementNotEditable(locator, timeout) {
|
|
|
924
942
|
}
|
|
925
943
|
|
|
926
944
|
async function emitWaitForElementNotPresent(locator, timeout) {
|
|
945
|
+
const sec = timeout / 1000
|
|
927
946
|
const commands = [
|
|
928
947
|
{
|
|
929
948
|
level: 0,
|
|
930
|
-
statement: `WebDriverWait(self.driver, ${
|
|
949
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.invisibility_of_element_located((${await location.emit(
|
|
931
950
|
locator
|
|
932
951
|
)})))`,
|
|
933
952
|
},
|
|
@@ -938,10 +957,11 @@ async function emitWaitForElementNotPresent(locator, timeout) {
|
|
|
938
957
|
}
|
|
939
958
|
|
|
940
959
|
async function emitWaitForElementNotVisible(locator, timeout) {
|
|
960
|
+
const sec = timeout / 1000
|
|
941
961
|
const commands = [
|
|
942
962
|
{
|
|
943
963
|
level: 0,
|
|
944
|
-
statement: `WebDriverWait(self.driver, ${
|
|
964
|
+
statement: `WebDriverWait(self.driver, ${sec}).until(expected_conditions.invisibility_of_element_located((${await location.emit(
|
|
945
965
|
locator
|
|
946
966
|
)})))`,
|
|
947
967
|
},
|
package/src/index.js
CHANGED
package/src/selection.js
CHANGED
|
@@ -41,6 +41,9 @@ function emitValue(value) {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
function emitLabel(label) {
|
|
44
|
+
if (label.startsWith('self.vars[')) {
|
|
45
|
+
return Promise.resolve(`By.XPATH, "//option[. = '{}']".format(${label})`)
|
|
46
|
+
}
|
|
44
47
|
return Promise.resolve(`By.XPATH, "//option[. = '${label}']"`)
|
|
45
48
|
}
|
|
46
49
|
|
package/LICENSE
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
Apache License
|
|
3
|
-
Version 2.0, January 2004
|
|
4
|
-
http://www.apache.org/licenses/
|
|
5
|
-
|
|
6
|
-
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
7
|
-
|
|
8
|
-
1. Definitions.
|
|
9
|
-
|
|
10
|
-
"License" shall mean the terms and conditions for use, reproduction,
|
|
11
|
-
and distribution as defined by Sections 1 through 9 of this document.
|
|
12
|
-
|
|
13
|
-
"Licensor" shall mean the copyright owner or entity authorized by
|
|
14
|
-
the copyright owner that is granting the License.
|
|
15
|
-
|
|
16
|
-
"Legal Entity" shall mean the union of the acting entity and all
|
|
17
|
-
other entities that control, are controlled by, or are under common
|
|
18
|
-
control with that entity. For the purposes of this definition,
|
|
19
|
-
"control" means (i) the power, direct or indirect, to cause the
|
|
20
|
-
direction or management of such entity, whether by contract or
|
|
21
|
-
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
22
|
-
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
23
|
-
|
|
24
|
-
"You" (or "Your") shall mean an individual or Legal Entity
|
|
25
|
-
exercising permissions granted by this License.
|
|
26
|
-
|
|
27
|
-
"Source" form shall mean the preferred form for making modifications,
|
|
28
|
-
including but not limited to software source code, documentation
|
|
29
|
-
source, and configuration files.
|
|
30
|
-
|
|
31
|
-
"Object" form shall mean any form resulting from mechanical
|
|
32
|
-
transformation or translation of a Source form, including but
|
|
33
|
-
not limited to compiled object code, generated documentation,
|
|
34
|
-
and conversions to other media types.
|
|
35
|
-
|
|
36
|
-
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
-
Object form, made available under the License, as indicated by a
|
|
38
|
-
copyright notice that is included in or attached to the work
|
|
39
|
-
(an example is provided in the Appendix below).
|
|
40
|
-
|
|
41
|
-
"Derivative Works" shall mean any work, whether in Source or Object
|
|
42
|
-
form, that is based on (or derived from) the Work and for which the
|
|
43
|
-
editorial revisions, annotations, elaborations, or other modifications
|
|
44
|
-
represent, as a whole, an original work of authorship. For the purposes
|
|
45
|
-
of this License, Derivative Works shall not include works that remain
|
|
46
|
-
separable from, or merely link (or bind by name) to the interfaces of,
|
|
47
|
-
the Work and Derivative Works thereof.
|
|
48
|
-
|
|
49
|
-
"Contribution" shall mean any work of authorship, including
|
|
50
|
-
the original version of the Work and any modifications or additions
|
|
51
|
-
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
-
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
-
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
-
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
-
means any form of electronic, verbal, or written communication sent
|
|
56
|
-
to the Licensor or its representatives, including but not limited to
|
|
57
|
-
communication on electronic mailing lists, source code control systems,
|
|
58
|
-
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
-
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
-
excluding communication that is conspicuously marked or otherwise
|
|
61
|
-
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
-
|
|
63
|
-
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
-
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
-
subsequently incorporated within the Work.
|
|
66
|
-
|
|
67
|
-
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
-
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
-
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
-
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
-
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
-
Work and such Derivative Works in Source or Object form.
|
|
73
|
-
|
|
74
|
-
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
-
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
-
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
-
(except as stated in this section) patent license to make, have made,
|
|
78
|
-
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
-
where such license applies only to those patent claims licensable
|
|
80
|
-
by such Contributor that are necessarily infringed by their
|
|
81
|
-
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
-
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
-
institute patent litigation against any entity (including a
|
|
84
|
-
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
-
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
-
or contributory patent infringement, then any patent licenses
|
|
87
|
-
granted to You under this License for that Work shall terminate
|
|
88
|
-
as of the date such litigation is filed.
|
|
89
|
-
|
|
90
|
-
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
-
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
-
modifications, and in Source or Object form, provided that You
|
|
93
|
-
meet the following conditions:
|
|
94
|
-
|
|
95
|
-
(a) You must give any other recipients of the Work or
|
|
96
|
-
Derivative Works a copy of this License; and
|
|
97
|
-
|
|
98
|
-
(b) You must cause any modified files to carry prominent notices
|
|
99
|
-
stating that You changed the files; and
|
|
100
|
-
|
|
101
|
-
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
-
that You distribute, all copyright, patent, trademark, and
|
|
103
|
-
attribution notices from the Source form of the Work,
|
|
104
|
-
excluding those notices that do not pertain to any part of
|
|
105
|
-
the Derivative Works; and
|
|
106
|
-
|
|
107
|
-
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
-
distribution, then any Derivative Works that You distribute must
|
|
109
|
-
include a readable copy of the attribution notices contained
|
|
110
|
-
within such NOTICE file, excluding those notices that do not
|
|
111
|
-
pertain to any part of the Derivative Works, in at least one
|
|
112
|
-
of the following places: within a NOTICE text file distributed
|
|
113
|
-
as part of the Derivative Works; within the Source form or
|
|
114
|
-
documentation, if provided along with the Derivative Works; or,
|
|
115
|
-
within a display generated by the Derivative Works, if and
|
|
116
|
-
wherever such third-party notices normally appear. The contents
|
|
117
|
-
of the NOTICE file are for informational purposes only and
|
|
118
|
-
do not modify the License. You may add Your own attribution
|
|
119
|
-
notices within Derivative Works that You distribute, alongside
|
|
120
|
-
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
-
that such additional attribution notices cannot be construed
|
|
122
|
-
as modifying the License.
|
|
123
|
-
|
|
124
|
-
You may add Your own copyright statement to Your modifications and
|
|
125
|
-
may provide additional or different license terms and conditions
|
|
126
|
-
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
-
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
-
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
-
the conditions stated in this License.
|
|
130
|
-
|
|
131
|
-
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
-
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
-
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
-
this License, without any additional terms or conditions.
|
|
135
|
-
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
-
the terms of any separate license agreement you may have executed
|
|
137
|
-
with Licensor regarding such Contributions.
|
|
138
|
-
|
|
139
|
-
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
-
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
-
except as required for reasonable and customary use in describing the
|
|
142
|
-
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
-
|
|
144
|
-
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
-
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
-
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
-
implied, including, without limitation, any warranties or conditions
|
|
149
|
-
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
-
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
-
appropriateness of using or redistributing the Work and assume any
|
|
152
|
-
risks associated with Your exercise of permissions under this License.
|
|
153
|
-
|
|
154
|
-
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
-
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
-
unless required by applicable law (such as deliberate and grossly
|
|
157
|
-
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
-
liable to You for damages, including any direct, indirect, special,
|
|
159
|
-
incidental, or consequential damages of any character arising as a
|
|
160
|
-
result of this License or out of the use or inability to use the
|
|
161
|
-
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
-
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
-
other commercial damages or losses), even if such Contributor
|
|
164
|
-
has been advised of the possibility of such damages.
|
|
165
|
-
|
|
166
|
-
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
-
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
-
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
-
or other liability obligations and/or rights consistent with this
|
|
170
|
-
License. However, in accepting such obligations, You may act only
|
|
171
|
-
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
-
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
-
defend, and hold each Contributor harmless for any liability
|
|
174
|
-
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
-
of your accepting any such warranty or additional liability.
|
|
176
|
-
|
|
177
|
-
END OF TERMS AND CONDITIONS
|
|
178
|
-
|
|
179
|
-
APPENDIX: How to apply the Apache License to your work.
|
|
180
|
-
|
|
181
|
-
To apply the Apache License to your work, attach the following
|
|
182
|
-
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
183
|
-
replaced with your own identifying information. (Don't include
|
|
184
|
-
the brackets!) The text should be enclosed in the appropriate
|
|
185
|
-
comment syntax for the file format. We also recommend that a
|
|
186
|
-
file or class name and description of purpose be included on the
|
|
187
|
-
same "printed page" as the copyright notice for easier
|
|
188
|
-
identification within third-party archives.
|
|
189
|
-
|
|
190
|
-
Copyright [yyyy] [name of copyright owner]
|
|
191
|
-
|
|
192
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
|
-
you may not use this file except in compliance with the License.
|
|
194
|
-
You may obtain a copy of the License at
|
|
195
|
-
|
|
196
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
|
197
|
-
|
|
198
|
-
Unless required by applicable law or agreed to in writing, software
|
|
199
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
|
-
See the License for the specific language governing permissions and
|
|
202
|
-
limitations under the License.
|