@mablhq/mabl-cli 1.62.1 → 2.1.0

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.
Files changed (120) hide show
  1. package/api/basicApiClient.js +10 -10
  2. package/api/mablApiClient.js +39 -1
  3. package/browserLauncher/playwrightBrowserLauncher/playwrightBrowser.js +6 -6
  4. package/cli.js +1 -0
  5. package/commands/app-files/app-files.js +5 -0
  6. package/commands/app-files/app-files_cmds/create.js +98 -0
  7. package/commands/app-files/app-files_cmds/delete.js +31 -0
  8. package/commands/app-files/app-files_cmds/download.js +50 -0
  9. package/commands/app-files/app-files_cmds/list.js +72 -0
  10. package/commands/config/config_cmds/install.js +92 -0
  11. package/commands/constants.js +9 -2
  12. package/commands/tests/testsUtil.js +9 -1
  13. package/commands/tests/tests_cmds/run-mobile.js +218 -0
  14. package/commands/tests/tests_cmds/run.js +1 -1
  15. package/core/util.js +36 -2
  16. package/env/defaultEnv.js +2 -1
  17. package/env/dev.js +2 -1
  18. package/env/env.js +3 -1
  19. package/env/local.js +2 -1
  20. package/env/prod.js +2 -1
  21. package/execution/index.js +13 -1
  22. package/execution/runAppiumServer.js +133 -0
  23. package/http/MablHttpAgent.js +1 -4
  24. package/http/RequestFilteringHttpAgent.js +3 -3
  25. package/http/axiosProxyConfig.js +10 -7
  26. package/http/httpUtil.js +10 -6
  27. package/index.js +3 -2
  28. package/mablApi/index.js +1 -1
  29. package/mablscript/MablAction.js +6 -2
  30. package/mablscript/MablStep.js +41 -5
  31. package/mablscript/MablStepV2.js +57 -0
  32. package/mablscript/MablSymbol.js +6 -2
  33. package/mablscript/actions/AwaitDownloadAction.js +1 -1
  34. package/mablscript/actions/ConditionAction.js +1 -1
  35. package/mablscript/actions/CountAction.js +1 -1
  36. package/mablscript/actions/ExtractAction.js +12 -7
  37. package/mablscript/actions/FindAction.js +6 -6
  38. package/mablscript/actions/GenerateEmailAddressAction.js +1 -1
  39. package/mablscript/actions/GenerateRandomStringAction.js +1 -1
  40. package/mablscript/actions/GetUrlAction.js +1 -1
  41. package/mablscript/actions/GetVariableValue.js +1 -1
  42. package/mablscript/actions/JavaScriptAction.js +25 -14
  43. package/mablscript/importer.js +99 -16
  44. package/mablscript/mobile/steps/CreateVariableMobileStep.js +53 -0
  45. package/mablscript/mobile/steps/EnterTextStep.js +41 -0
  46. package/mablscript/mobile/steps/NavigateBackStep.js +20 -0
  47. package/mablscript/mobile/steps/NavigateHomeStep.js +21 -0
  48. package/mablscript/mobile/steps/ScrollStep.js +37 -0
  49. package/mablscript/mobile/steps/SetOrientationStep.js +20 -0
  50. package/mablscript/mobile/steps/TapStep.js +37 -0
  51. package/mablscript/mobile/steps/actions/MobileFindAction.js +23 -0
  52. package/mablscript/mobile/steps/stepUtil.js +74 -0
  53. package/mablscript/mobile/tests/StepTestsUtil.js +20 -0
  54. package/mablscript/mobile/tests/TestMobileFindDescriptors.js +215 -0
  55. package/mablscript/mobile/tests/steps/CreateVariableMobileStep.mobiletest.js +298 -0
  56. package/mablscript/mobile/tests/steps/EnterTextStep.mobiletest.js +79 -0
  57. package/mablscript/mobile/tests/steps/GeneralHumanization.mobiletest.js +167 -0
  58. package/mablscript/mobile/tests/steps/NavigateBackStep.mobiletest.js +27 -0
  59. package/mablscript/mobile/tests/steps/NavigateHomeStep.mobiletest.js +27 -0
  60. package/mablscript/mobile/tests/steps/ScrollStep.mobiletest.js +121 -0
  61. package/mablscript/mobile/tests/steps/SetOrientationStep.mobiletest.js +32 -0
  62. package/mablscript/mobile/tests/steps/TapStep.mobiletest.js +57 -0
  63. package/mablscript/steps/AccessibilityCheck.js +20 -9
  64. package/mablscript/steps/AssertStep.js +54 -39
  65. package/mablscript/steps/AssertStepOld.js +35 -4
  66. package/mablscript/steps/AwaitTabStep.js +5 -2
  67. package/mablscript/steps/AwaitUploadsStep.js +6 -4
  68. package/mablscript/steps/ClearCookiesStep.js +6 -4
  69. package/mablscript/steps/ClickAndHoldStep.js +10 -3
  70. package/mablscript/steps/ClickStep.js +10 -3
  71. package/mablscript/steps/CreateVariableStep.js +25 -8
  72. package/mablscript/steps/DoubleClickStep.js +10 -3
  73. package/mablscript/steps/DownloadStep.js +4 -2
  74. package/mablscript/steps/EchoStep.js +8 -5
  75. package/mablscript/steps/ElseIfConditionStep.js +14 -4
  76. package/mablscript/steps/ElseStep.js +8 -5
  77. package/mablscript/steps/EndStep.js +8 -5
  78. package/mablscript/steps/EnterAuthCodeStep.js +10 -3
  79. package/mablscript/steps/EnterTextStep.js +8 -2
  80. package/mablscript/steps/EvaluateFlowStep.js +5 -2
  81. package/mablscript/steps/EvaluateJavaScriptStep.js +15 -4
  82. package/mablscript/steps/HoverStep.js +10 -3
  83. package/mablscript/steps/IfConditionStep.js +25 -12
  84. package/mablscript/steps/NavigateStep.js +5 -2
  85. package/mablscript/steps/OpenEmailStep.js +5 -2
  86. package/mablscript/steps/ReleaseStep.js +10 -3
  87. package/mablscript/steps/RemoveCookieStep.js +5 -2
  88. package/mablscript/steps/RightClickStep.js +10 -3
  89. package/mablscript/steps/SelectStep.js +9 -3
  90. package/mablscript/steps/SendHttpRequestStep.js +8 -4
  91. package/mablscript/steps/SendKeyStep.js +10 -3
  92. package/mablscript/steps/SetCookieStep.js +5 -2
  93. package/mablscript/steps/SetFilesStep.js +9 -3
  94. package/mablscript/steps/SetViewportStep.js +5 -3
  95. package/mablscript/steps/SwitchContextStep.js +14 -3
  96. package/mablscript/steps/SyntheticStep.js +1 -1
  97. package/mablscript/steps/VisitUrlStep.js +5 -2
  98. package/mablscript/steps/WaitStep.js +8 -4
  99. package/mablscript/steps/WaitUntilStep.js +6 -3
  100. package/mablscript/types/GetVariableDescriptor.js +8 -3
  101. package/mablscript/types/mobile/CreateVariableMobileStepDescriptor.js +9 -0
  102. package/mablscript/types/mobile/EnterTextStepDescriptor.js +2 -0
  103. package/mablscript/types/mobile/NavigateBackStepDescriptor.js +2 -0
  104. package/mablscript/types/mobile/NavigateHomeStepDescriptor.js +2 -0
  105. package/mablscript/types/mobile/ScrollStepDescriptor.js +2 -0
  106. package/mablscript/types/mobile/SetOrientationStepDescriptor.js +8 -0
  107. package/mablscript/types/mobile/StepWithMobileFindDescriptor.js +2 -0
  108. package/mablscript/types/mobile/TapStepDescriptor.js +8 -0
  109. package/mablscriptFind/index.js +1 -1
  110. package/observers/ObserverBase.js +9 -0
  111. package/observers/mockObserver.js +3 -3
  112. package/package.json +11 -6
  113. package/resources/webdriver.js +21 -0
  114. package/upload/index.js +5 -0
  115. package/util/FileCache.js +180 -0
  116. package/util/Lazy.js +90 -0
  117. package/util/MobileAppFileCache.js +102 -0
  118. package/util/RichPromise.js +3 -1
  119. package/util/javaScriptStepMigration.js +1 -0
  120. package/webdriver/index.js +41 -0
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCreateVariableMobileStep = exports.CreateVariableMobileStep = void 0;
4
+ const MablStepV2_1 = require("../../MablStepV2");
5
+ const CreateVariableStepDescriptor_1 = require("../../types/CreateVariableStepDescriptor");
6
+ const CreateVariableMobileStepDescriptor_1 = require("../../types/mobile/CreateVariableMobileStepDescriptor");
7
+ const MobileFindAction_1 = require("./actions/MobileFindAction");
8
+ const stepUtil_1 = require("./stepUtil");
9
+ class CreateVariableMobileStep extends MablStepV2_1.MablStepV2 {
10
+ constructor(descriptor) {
11
+ super(CreateVariableMobileStep.stepName, descriptor, 'mablscript_as');
12
+ if ((0, CreateVariableMobileStepDescriptor_1.isCreateVariableMobileFindStepDescriptor)(this.descriptor)) {
13
+ this.findAction = MobileFindAction_1.MobileFindAction.fromDescriptor(this.descriptor.find);
14
+ this.actions = [this.findAction];
15
+ }
16
+ }
17
+ stepDescription() {
18
+ const varGenerator = this.descriptor.generator.type;
19
+ switch (varGenerator) {
20
+ case CreateVariableStepDescriptor_1.VariableGenerator.ATTRIBUTE:
21
+ return `Assign variable "${this.descriptor.name}" value from element attribute "${this.descriptor.generator.attribute}"`;
22
+ case CreateVariableStepDescriptor_1.VariableGenerator.PATTERN:
23
+ return `Assign variable "${this.descriptor.name}" value from string generated with format "${this.descriptor.generator.pattern}"`;
24
+ case CreateVariableStepDescriptor_1.VariableGenerator.EMAIL:
25
+ return `Generate a new mabl mailbox email address`;
26
+ case CreateVariableStepDescriptor_1.VariableGenerator.ELEMENT_COUNT:
27
+ return `Assign variable "${this.descriptor.name}" value from element count using ${(0, stepUtil_1.humanizeCustomFind)(this.descriptor)}`;
28
+ case CreateVariableStepDescriptor_1.VariableGenerator.JAVASCRIPT:
29
+ return `Assign variable "${this.descriptor.name}" using script`;
30
+ default:
31
+ return `Assign variable "${this.descriptor.name}" a value`;
32
+ }
33
+ }
34
+ static fromYaml(_stepName, stepDescriptor) {
35
+ if (!stepDescriptor.find) {
36
+ stepDescriptor.find = stepDescriptor.generator.find;
37
+ delete stepDescriptor.generator.find;
38
+ delete stepDescriptor.selector;
39
+ delete stepDescriptor.selectorAncestors;
40
+ }
41
+ return new CreateVariableMobileStep(stepDescriptor);
42
+ }
43
+ }
44
+ exports.CreateVariableMobileStep = CreateVariableMobileStep;
45
+ CreateVariableMobileStep.stepName = 'CreateVariable';
46
+ CreateVariableMobileStep.yamlMablScriptNames = [CreateVariableMobileStep.stepName];
47
+ CreateVariableMobileStep.stepVersion = 2;
48
+ function isCreateVariableMobileStep(value) {
49
+ return ((value === null || value === void 0 ? void 0 : value.getStepName) &&
50
+ (value === null || value === void 0 ? void 0 : value.getStepName()) === CreateVariableMobileStep.stepName &&
51
+ !!value.descriptor);
52
+ }
53
+ exports.isCreateVariableMobileStep = isCreateVariableMobileStep;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnterTextStep = void 0;
4
+ const MablStepV2_1 = require("../../MablStepV2");
5
+ const FindAction_1 = require("../../actions/FindAction");
6
+ const stepUtil_1 = require("./stepUtil");
7
+ const MablAction_1 = require("../../MablAction");
8
+ const STEP_NAME = 'EnterText';
9
+ class EnterTextStep extends MablStepV2_1.MablStepV2 {
10
+ constructor(descriptor) {
11
+ super(EnterTextStep.stepName, descriptor, 'enter_text');
12
+ }
13
+ getInputVariables() {
14
+ const { find, text } = this.descriptor;
15
+ const vars = MablAction_1.MablAction.findUniqueVariableReferencesInValue(find);
16
+ vars.push(...MablAction_1.MablAction.findUniqueVariableReferencesInValue(text));
17
+ return vars;
18
+ }
19
+ stepDescription() {
20
+ return (0, stepUtil_1.getDescriptionForMobileStepDescriptor)(`Enter text "${this.descriptor.text}" in`, this.descriptor);
21
+ }
22
+ static fromYaml(_stepName, stepDescriptor) {
23
+ if (!stepDescriptor.find &&
24
+ !!stepDescriptor.selector &&
25
+ !!stepDescriptor.findType) {
26
+ stepDescriptor.find = {
27
+ findType: FindAction_1.formattedFindTypeToMablscript[stepDescriptor.findType],
28
+ findTarget: {
29
+ selector: stepDescriptor.selector,
30
+ },
31
+ };
32
+ delete stepDescriptor.selector;
33
+ delete stepDescriptor.findType;
34
+ }
35
+ return new EnterTextStep(stepDescriptor);
36
+ }
37
+ }
38
+ exports.EnterTextStep = EnterTextStep;
39
+ EnterTextStep.stepName = STEP_NAME;
40
+ EnterTextStep.yamlMablScriptNames = [EnterTextStep.stepName];
41
+ EnterTextStep.stepVersion = 2;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NavigateBackStep = void 0;
4
+ const MablStepV2_1 = require("../../MablStepV2");
5
+ const STEP_NAME = 'NavigateBack';
6
+ class NavigateBackStep extends MablStepV2_1.MablStepV2 {
7
+ constructor(descriptor) {
8
+ super(NavigateBackStep.stepName, descriptor, 'navigate_back');
9
+ }
10
+ stepDescription() {
11
+ return `Navigate back`;
12
+ }
13
+ static fromYaml(_stepName, stepDescriptor) {
14
+ return new NavigateBackStep(stepDescriptor);
15
+ }
16
+ }
17
+ exports.NavigateBackStep = NavigateBackStep;
18
+ NavigateBackStep.stepName = STEP_NAME;
19
+ NavigateBackStep.yamlMablScriptNames = [NavigateBackStep.stepName];
20
+ NavigateBackStep.stepVersion = 2;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NavigateHomeStep = void 0;
4
+ const MablStepV2_1 = require("../../MablStepV2");
5
+ const STEP_NAME = 'NavigateHome';
6
+ class NavigateHomeStep extends MablStepV2_1.MablStepV2 {
7
+ constructor(descriptor) {
8
+ super(NavigateHomeStep.stepName, descriptor, 'navigate_home');
9
+ this.descriptor = descriptor;
10
+ }
11
+ stepDescription() {
12
+ return `Navigate home`;
13
+ }
14
+ static fromYaml(_stepName, stepDescriptor) {
15
+ return new NavigateHomeStep(stepDescriptor);
16
+ }
17
+ }
18
+ exports.NavigateHomeStep = NavigateHomeStep;
19
+ NavigateHomeStep.stepName = STEP_NAME;
20
+ NavigateHomeStep.yamlMablScriptNames = [NavigateHomeStep.stepName];
21
+ NavigateHomeStep.stepVersion = 2;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.humanizeScrollInformation = exports.formatPercentageVal = exports.ScrollStep = void 0;
4
+ const MablStepV2_1 = require("../../MablStepV2");
5
+ const STEP_NAME = 'Scroll';
6
+ class ScrollStep extends MablStepV2_1.MablStepV2 {
7
+ constructor(descriptor) {
8
+ super(ScrollStep.stepName, descriptor, 'scroll');
9
+ }
10
+ stepDescription() {
11
+ return humanizeScrollInformation(this.descriptor.coordinates);
12
+ }
13
+ static fromYaml(_stepName, stepDescriptor) {
14
+ return new ScrollStep(stepDescriptor);
15
+ }
16
+ }
17
+ exports.ScrollStep = ScrollStep;
18
+ ScrollStep.stepName = STEP_NAME;
19
+ ScrollStep.yamlMablScriptNames = [ScrollStep.stepName];
20
+ ScrollStep.stepVersion = 2;
21
+ function formatPercentageVal(percent) {
22
+ return `${Math.round(percent * 10000) / 100}%`;
23
+ }
24
+ exports.formatPercentageVal = formatPercentageVal;
25
+ function humanizeScrollInformation(coordinates) {
26
+ const yScrollDistance = Math.abs(coordinates.to.yPercent - coordinates.from.yPercent);
27
+ const xScrollDistance = Math.abs(coordinates.to.xPercent - coordinates.from.xPercent);
28
+ if (yScrollDistance > xScrollDistance) {
29
+ const scrollDistanceFormatted = formatPercentageVal(yScrollDistance);
30
+ const scrollUp = coordinates.from.yPercent < coordinates.to.yPercent;
31
+ return `Scroll ${scrollUp ? 'up' : 'down'} ${scrollDistanceFormatted} of the screen`;
32
+ }
33
+ const scrollDistanceFormatted = formatPercentageVal(xScrollDistance);
34
+ const swipeRight = coordinates.from.xPercent < coordinates.to.xPercent;
35
+ return `Swipe ${swipeRight ? 'right' : 'left'} ${scrollDistanceFormatted} of the screen`;
36
+ }
37
+ exports.humanizeScrollInformation = humanizeScrollInformation;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SetOrientationStep = void 0;
4
+ const MablStepV2_1 = require("../../MablStepV2");
5
+ const STEP_NAME = 'SetOrientation';
6
+ class SetOrientationStep extends MablStepV2_1.MablStepV2 {
7
+ constructor(descriptor) {
8
+ super(SetOrientationStep.stepName, descriptor, 'set_orientation');
9
+ }
10
+ stepDescription() {
11
+ return `Set orientation of device to ${this.descriptor.orientation.toLowerCase()}`;
12
+ }
13
+ static fromYaml(_stepName, stepDescriptor) {
14
+ return new SetOrientationStep(stepDescriptor);
15
+ }
16
+ }
17
+ exports.SetOrientationStep = SetOrientationStep;
18
+ SetOrientationStep.stepName = STEP_NAME;
19
+ SetOrientationStep.yamlMablScriptNames = [SetOrientationStep.stepName];
20
+ SetOrientationStep.stepVersion = 2;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TapStep = void 0;
4
+ const MablStepV2_1 = require("../../MablStepV2");
5
+ const TapStepDescriptor_1 = require("../../types/mobile/TapStepDescriptor");
6
+ const MobileFindAction_1 = require("./actions/MobileFindAction");
7
+ const stepUtil_1 = require("./stepUtil");
8
+ const MablAction_1 = require("../../MablAction");
9
+ class TapStep extends MablStepV2_1.MablStepV2 {
10
+ constructor(descriptor) {
11
+ super(TapStep.stepName, descriptor, 'tap');
12
+ this.findAction = MobileFindAction_1.MobileFindAction.fromDescriptor(this.descriptor.find);
13
+ this.actions = [this.findAction];
14
+ }
15
+ getInputVariables() {
16
+ const { find } = this.descriptor;
17
+ return MablAction_1.MablAction.findUniqueVariableReferencesInValue(find);
18
+ }
19
+ stepDescription() {
20
+ let prependedText;
21
+ switch (this.descriptor.type) {
22
+ case TapStepDescriptor_1.TapType.long:
23
+ prependedText = `Perform long press on `;
24
+ break;
25
+ default:
26
+ prependedText = `Tap on`;
27
+ }
28
+ return (0, stepUtil_1.getDescriptionForMobileStepDescriptor)(prependedText, this.descriptor);
29
+ }
30
+ static fromYaml(_stepName, stepDescriptor) {
31
+ return new TapStep(stepDescriptor);
32
+ }
33
+ }
34
+ exports.TapStep = TapStep;
35
+ TapStep.stepName = 'Tap';
36
+ TapStep.yamlMablScriptNames = [TapStep.stepName];
37
+ TapStep.stepVersion = 2;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MobileFindAction = void 0;
4
+ const MablAction_1 = require("../../../MablAction");
5
+ class MobileFindAction extends MablAction_1.MablAction {
6
+ constructor(findDescriptor) {
7
+ super('MobileFindAction', 'mobile_find_action', [[]]);
8
+ this.findDescriptor = findDescriptor;
9
+ }
10
+ toDescriptor() {
11
+ return this.findDescriptor;
12
+ }
13
+ toYaml() {
14
+ return this.findDescriptor;
15
+ }
16
+ getInputVariables() {
17
+ return MablAction_1.MablAction.findUniqueVariableReferencesInValue(this.findDescriptor);
18
+ }
19
+ static fromDescriptor(mobileFindDescriptor) {
20
+ return new MobileFindAction(mobileFindDescriptor);
21
+ }
22
+ }
23
+ exports.MobileFindAction = MobileFindAction;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isStepWithFind = exports.humanizeCustomFind = exports.getElementDescriptionFromMobileFindDescriptor = exports.getDescriptionForMobileStepDescriptor = exports.getSimpleIOSElementName = exports.getSimpleAndroidElementName = void 0;
4
+ const domUtil_1 = require("../../../domUtil");
5
+ const mablscriptFind_1 = require("../../../mablscriptFind");
6
+ function getSimpleAndroidElementName(className) {
7
+ if (!className) {
8
+ return 'unknown';
9
+ }
10
+ const parts = className.split('.');
11
+ return parts[parts.length - 1];
12
+ }
13
+ exports.getSimpleAndroidElementName = getSimpleAndroidElementName;
14
+ function getSimpleIOSElementName(elementName) {
15
+ if (!elementName) {
16
+ return 'unknown';
17
+ }
18
+ const parts = elementName.split('XCUIElementType');
19
+ if (parts.length > 1) {
20
+ return parts[1];
21
+ }
22
+ return 'unknown';
23
+ }
24
+ exports.getSimpleIOSElementName = getSimpleIOSElementName;
25
+ function getDescriptionForMobileStepDescriptor(predicateAction, descriptor) {
26
+ const elementDescription = getElementDescriptionFromMobileFindDescriptor(descriptor.find);
27
+ return `${predicateAction} ${elementDescription}`;
28
+ }
29
+ exports.getDescriptionForMobileStepDescriptor = getDescriptionForMobileStepDescriptor;
30
+ function getElementDescriptionFromMobileFindDescriptor(descriptor) {
31
+ const findTarget = descriptor === null || descriptor === void 0 ? void 0 : descriptor.findTarget;
32
+ if ((0, domUtil_1.isMobileFindSpecification)(findTarget)) {
33
+ if ((0, domUtil_1.isWebViewFindElementDescriptor)(descriptor)) {
34
+ return getDescriptionForWebViewFindDescriptor(descriptor);
35
+ }
36
+ const selector = findTarget.selector;
37
+ if (selector.android && Object.keys(selector.android).length) {
38
+ if (selector.android.text) {
39
+ return `element with text "${selector.android.text}"`;
40
+ }
41
+ return `"${getSimpleAndroidElementName(selector.android.class)}" element`;
42
+ }
43
+ else if (selector.iOS) {
44
+ if (selector.iOS.name) {
45
+ return `"${selector.iOS.name}" element`;
46
+ }
47
+ if (selector.iOS.label) {
48
+ return `element with text "${selector.iOS.label}"`;
49
+ }
50
+ return `the "${getSimpleIOSElementName(selector.iOS.type)}" element`;
51
+ }
52
+ }
53
+ return 'unknown element';
54
+ }
55
+ exports.getElementDescriptionFromMobileFindDescriptor = getElementDescriptionFromMobileFindDescriptor;
56
+ function getDescriptionForWebViewFindDescriptor(webViewElementDescriptor) {
57
+ if ((0, domUtil_1.isFindElementDescriptor)(webViewElementDescriptor.webView.descriptor)) {
58
+ return (0, mablscriptFind_1.humanizeFindOneDescriptor)(webViewElementDescriptor.webView.descriptor.findTarget);
59
+ }
60
+ return `unknown webview element`;
61
+ }
62
+ function humanizeCustomFind(descriptor) {
63
+ if (isStepWithFind(descriptor)) {
64
+ if ((0, domUtil_1.isMobileFindCustomDescriptor)(descriptor.find)) {
65
+ return `xpath: ${descriptor.find.findTarget.xpath}`;
66
+ }
67
+ }
68
+ return `custom find`;
69
+ }
70
+ exports.humanizeCustomFind = humanizeCustomFind;
71
+ function isStepWithFind(value) {
72
+ return !!(value === null || value === void 0 ? void 0 : value.find);
73
+ }
74
+ exports.isStepWithFind = isStepWithFind;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadRawStepIntoMablStep = exports.parseAndValidateYamlConversion = void 0;
4
+ const js_yaml_1 = require("js-yaml");
5
+ const importer_1 = require("../../importer");
6
+ function parseAndValidateYamlConversion(steps, expectedStepName, expectedDescriptor) {
7
+ const yamlfiedSteps = (0, js_yaml_1.dump)(steps);
8
+ const loadedSteps = (0, importer_1.loadYamlSteps)(yamlfiedSteps, true);
9
+ expect(loadedSteps[0].name).toEqual(expectedStepName);
10
+ expect(loadedSteps[0].descriptor).toEqual(expectedDescriptor);
11
+ const yamlfied = (0, importer_1.yamlifyTheLoadedSteps)(loadedSteps);
12
+ expect(yamlfied).toEqual(yamlfiedSteps);
13
+ }
14
+ exports.parseAndValidateYamlConversion = parseAndValidateYamlConversion;
15
+ function loadRawStepIntoMablStep(step) {
16
+ const yamlfiedSteps = (0, js_yaml_1.dump)([step]);
17
+ const loadedSteps = (0, importer_1.loadYamlSteps)(yamlfiedSteps, true);
18
+ return loadedSteps[0];
19
+ }
20
+ exports.loadRawStepIntoMablStep = loadRawStepIntoMablStep;
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AndroidTestLabWebViewClickCounterMobileFindDescriptor = exports.iOSTestLabWebViewClickCounterMobileFindDescriptor = exports.AndroidWebViewTextFieldMobileFindDescriptor = exports.iOSWebViewTextFieldMobileFindDescriptor = void 0;
4
+ const domUtil_1 = require("../../../domUtil");
5
+ exports.iOSWebViewTextFieldMobileFindDescriptor = {
6
+ findType: domUtil_1.FindType.FIND_ONE,
7
+ findTarget: {
8
+ selector: {
9
+ iOS: {
10
+ accessible: false,
11
+ rect: {
12
+ width: 390,
13
+ x: 0,
14
+ y: 175,
15
+ height: 635,
16
+ },
17
+ xpath: '//XCUIElementTypeApplication/XCUIElementTypeWindow/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeWebView',
18
+ visible: true,
19
+ index: 1,
20
+ alternateXPaths: [],
21
+ type: 'XCUIElementTypeWebView',
22
+ enabled: true,
23
+ },
24
+ uuid: '',
25
+ },
26
+ },
27
+ webView: {
28
+ descriptor: {
29
+ findTarget: {
30
+ selector: {
31
+ bounding_width: '155',
32
+ visible: 'true',
33
+ tag_name: 'input',
34
+ namespace_uri: 'http://www.w3.org/1999/xhtml',
35
+ label: 'Regex pattern restriction (simple ip address-like):',
36
+ title: 'HTML5 Input Type test',
37
+ uuid: '',
38
+ url: 'https://storage.googleapis.com/public-dev-test-lab/input/inputtypes.html',
39
+ xpath: '//html[1]/body[1]/form[1]/table[1]/tbody[1]/tr[17]/td[2]/input[1]',
40
+ inputElementType: 'text',
41
+ name: 'input-regex',
42
+ id: 'input-regex',
43
+ bounding_height: '21',
44
+ bounding_x: '333',
45
+ bounding_y: '288',
46
+ },
47
+ },
48
+ findType: domUtil_1.FindType.FIND_ONE,
49
+ },
50
+ title: 'HTML5 Input Type test',
51
+ url: 'https://storage.googleapis.com/public-dev-test-lab/input/inputtypes.html',
52
+ },
53
+ };
54
+ exports.AndroidWebViewTextFieldMobileFindDescriptor = {
55
+ findType: domUtil_1.FindType.FIND_ONE,
56
+ findTarget: {
57
+ selector: {
58
+ android: {
59
+ displayed: true,
60
+ checkable: false,
61
+ clickable: false,
62
+ index: 0,
63
+ focusable: false,
64
+ alternateXPaths: [],
65
+ enabled: true,
66
+ longClickable: false,
67
+ rect: {
68
+ width: 1440,
69
+ x: 0,
70
+ y: 280,
71
+ height: 2196,
72
+ },
73
+ password: false,
74
+ xpath: '//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/androidx.compose.ui.platform.ComposeView/android.view.View/android.view.View/android.view.View/android.view.ViewGroup/android.webkit.WebView',
75
+ bounds: '[0,280][1440,2476]',
76
+ focused: false,
77
+ checked: false,
78
+ text: '',
79
+ class: 'android.webkit.WebView',
80
+ scrollable: false,
81
+ selected: false,
82
+ },
83
+ uuid: '',
84
+ },
85
+ },
86
+ webView: {
87
+ descriptor: {
88
+ findTarget: {
89
+ selector: {
90
+ bounding_width: '191',
91
+ visible: 'true',
92
+ tag_name: 'input',
93
+ namespace_uri: 'http://www.w3.org/1999/xhtml',
94
+ label: 'Regex pattern restriction (simple ip address-like):',
95
+ title: 'HTML5 Input Type test',
96
+ uuid: '',
97
+ url: 'https://storage.googleapis.com/public-dev-test-lab/input/inputtypes.html',
98
+ xpath: '//html[1]/body[1]/form[1]/table[1]/tbody[1]/tr[17]/td[2]/input[1]',
99
+ inputElementType: 'text',
100
+ name: 'input-regex',
101
+ id: 'input-regex',
102
+ bounding_height: '21',
103
+ bounding_x: '92',
104
+ bounding_y: '476',
105
+ },
106
+ },
107
+ findType: domUtil_1.FindType.FIND_ONE,
108
+ },
109
+ title: 'HTML5 Input Type test',
110
+ url: 'https://storage.googleapis.com/public-dev-test-lab/input/inputtypes.html',
111
+ },
112
+ };
113
+ exports.iOSTestLabWebViewClickCounterMobileFindDescriptor = {
114
+ findType: domUtil_1.FindType.FIND_ONE,
115
+ findTarget: {
116
+ selector: {
117
+ iOS: {
118
+ accessible: false,
119
+ rect: {
120
+ width: 390,
121
+ x: 0,
122
+ y: 143,
123
+ height: 334,
124
+ },
125
+ visible: true,
126
+ xpath: '//XCUIElementTypeApplication/XCUIElementTypeWindow/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeWebView',
127
+ alternateXPaths: [],
128
+ type: 'XCUIElementTypeWebView',
129
+ enabled: true,
130
+ },
131
+ uuid: '',
132
+ },
133
+ },
134
+ webView: {
135
+ descriptor: {
136
+ findTarget: {
137
+ selector: {
138
+ bounding_width: '69',
139
+ visible: 'true',
140
+ tag_name: 'button',
141
+ namespace_uri: 'http://www.w3.org/1999/xhtml',
142
+ title: 'test lab - click counter',
143
+ uuid: '',
144
+ url: 'https://storage.googleapis.com/public-dev-test-lab/click/click-counter.html',
145
+ xpath: '//html[1]/body[1]/div[1]/button[1]',
146
+ id: 'click-me-button',
147
+ text: 'Click me',
148
+ bounding_height: '29',
149
+ bounding_x: '40',
150
+ bounding_y: '125',
151
+ },
152
+ },
153
+ findType: domUtil_1.FindType.FIND_ONE,
154
+ },
155
+ title: 'test lab - click counter',
156
+ url: 'https://storage.googleapis.com/public-dev-test-lab/click/click-counter.html',
157
+ },
158
+ };
159
+ exports.AndroidTestLabWebViewClickCounterMobileFindDescriptor = {
160
+ findType: domUtil_1.FindType.FIND_ONE,
161
+ findTarget: {
162
+ selector: {
163
+ android: {
164
+ displayed: true,
165
+ checkable: false,
166
+ clickable: false,
167
+ index: 0,
168
+ focusable: false,
169
+ alternateXPaths: [],
170
+ enabled: true,
171
+ longClickable: false,
172
+ rect: {
173
+ width: 1000,
174
+ x: 0,
175
+ y: 280,
176
+ height: 700,
177
+ },
178
+ password: false,
179
+ xpath: '//hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/androidx.compose.ui.platform.ComposeView/android.view.View/android.view.View/android.view.View/android.view.ViewGroup/android.webkit.WebView',
180
+ bounds: '[0,280][1000,980]',
181
+ focused: false,
182
+ checked: false,
183
+ text: '',
184
+ class: 'android.webkit.WebView',
185
+ scrollable: false,
186
+ selected: false,
187
+ },
188
+ uuid: '',
189
+ },
190
+ },
191
+ webView: {
192
+ descriptor: {
193
+ findTarget: {
194
+ selector: {
195
+ bounding_width: '67',
196
+ visible: 'true',
197
+ tag_name: 'button',
198
+ namespace_uri: 'http://www.w3.org/1999/xhtml',
199
+ title: 'test lab - click counter',
200
+ uuid: '',
201
+ url: 'https://storage.googleapis.com/public-dev-test-lab/click/click-counter.html',
202
+ xpath: '//html[1]/body[1]/div[1]/button[1]',
203
+ id: 'click-me-button',
204
+ text: 'Click me',
205
+ bounding_height: '21',
206
+ bounding_x: '40',
207
+ bounding_y: '115',
208
+ },
209
+ },
210
+ findType: domUtil_1.FindType.FIND_ONE,
211
+ },
212
+ title: 'test lab - click counter',
213
+ url: 'https://storage.googleapis.com/public-dev-test-lab/click/click-counter.html',
214
+ },
215
+ };