ff-automationv2 2.2.2 → 2.2.6
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/dist/ai/llmprompts/systemPrompts/combinedActionExtractorPromptMob.js +3 -2
- package/dist/ai/llmprompts/systemPrompts/fireflinkElementIndexExtractor_Mob.js +8 -2
- package/dist/ai/llmprompts/systemPrompts/getActionExtractorPromptMob.js +2 -2
- package/dist/ai/llmprompts/systemPrompts/mobileKeywordExtractor.js +6 -6
- package/dist/ai/llmprompts/systemPrompts/verifyActionExtractorPromptMob.js +2 -2
- package/dist/ai/llmprompts/systemPrompts/visionPromptMobile.js +1 -1
- package/dist/ai/llmprompts/systemPrompts/waitActionExtractorPromptMob.js +2 -2
- package/dist/automation/actions/executor.d.ts +29 -0
- package/dist/automation/actions/executor.js +419 -0
- package/dist/automation/actions/interaction/click/doubleClick.js +2 -2
- package/dist/automation/actions/interaction/click/tapOnSpecifiedLocation.d.ts +2 -0
- package/dist/automation/actions/interaction/click/tapOnSpecifiedLocation.js +29 -0
- package/dist/automation/actions/interaction/elementlessActions/activateAppUsingAppPackage.d.ts +5 -0
- package/dist/automation/actions/interaction/elementlessActions/activateAppUsingAppPackage.js +17 -0
- package/dist/automation/actions/interaction/elementlessActions/installAPK.d.ts +2 -0
- package/dist/automation/actions/interaction/elementlessActions/installAPK.js +40 -0
- package/dist/automation/actions/interaction/elementlessActions/isAppInstalled.d.ts +2 -0
- package/dist/automation/actions/interaction/elementlessActions/isAppInstalled.js +35 -0
- package/dist/automation/actions/interaction/elementlessActions/openAppWithApkFilePath.d.ts +2 -0
- package/dist/automation/actions/interaction/elementlessActions/openAppWithApkFilePath.js +93 -0
- package/dist/automation/actions/interaction/elementlessActions/openMobileApplication.d.ts +2 -0
- package/dist/automation/actions/interaction/elementlessActions/openMobileApplication.js +14 -0
- package/dist/automation/actions/interaction/elementlessActions/receiveMessageOnEmulator.d.ts +2 -0
- package/dist/automation/actions/interaction/elementlessActions/receiveMessageOnEmulator.js +17 -0
- package/dist/automation/actions/interaction/elementlessActions/terminateAppUsingAppPackage.d.ts +2 -0
- package/dist/automation/actions/interaction/elementlessActions/terminateAppUsingAppPackage.js +17 -0
- package/dist/automation/actions/interaction/elementlessActions/uninstallAPK.d.ts +2 -0
- package/dist/automation/actions/interaction/elementlessActions/uninstallAPK.js +44 -0
- package/dist/automation/actions/interaction/inputlessActions/AirplaneModeSwitchOff.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/AirplaneModeSwitchOff.js +24 -0
- package/dist/automation/actions/interaction/inputlessActions/AirplaneModeSwitchOn.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/AirplaneModeSwitchOn.js +25 -0
- package/dist/automation/actions/interaction/inputlessActions/Break.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/Break.js +14 -0
- package/dist/automation/actions/interaction/inputlessActions/Continue.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/Continue.js +14 -0
- package/dist/automation/actions/interaction/inputlessActions/GpsSwitchOff.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/GpsSwitchOff.js +18 -0
- package/dist/automation/actions/interaction/inputlessActions/GpsSwitchOn.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/GpsSwitchOn.js +18 -0
- package/dist/automation/actions/interaction/inputlessActions/HideKeyboard.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/HideKeyboard.js +14 -0
- package/dist/automation/actions/interaction/inputlessActions/LockDevice.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/LockDevice.js +14 -0
- package/dist/automation/actions/interaction/inputlessActions/OpenChromeBrowser.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/OpenChromeBrowser.js +14 -0
- package/dist/automation/actions/interaction/inputlessActions/OpenNotification.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/OpenNotification.js +14 -0
- package/dist/automation/actions/interaction/inputlessActions/ResetApp.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/ResetApp.js +19 -0
- package/dist/automation/actions/interaction/inputlessActions/RestartCurrentDevice.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/RestartCurrentDevice.js +23 -0
- package/dist/automation/actions/interaction/inputlessActions/SetDeviceOrientationAsLandscape.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/SetDeviceOrientationAsLandscape.js +14 -0
- package/dist/automation/actions/interaction/inputlessActions/SetDeviceOrientationAsPortrait.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/SetDeviceOrientationAsPortrait.js +14 -0
- package/dist/automation/actions/interaction/inputlessActions/SetEmulatorPowerStateOff.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/SetEmulatorPowerStateOff.js +27 -0
- package/dist/automation/actions/interaction/inputlessActions/SetEmulatorPowerStateOn.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/SetEmulatorPowerStateOn.js +27 -0
- package/dist/automation/actions/interaction/inputlessActions/WifiSwitchOff.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/WifiSwitchOff.js +18 -0
- package/dist/automation/actions/interaction/inputlessActions/WifiSwitchOn.d.ts +2 -0
- package/dist/automation/actions/interaction/inputlessActions/WifiSwitchOn.js +18 -0
- package/dist/automation/actions/interaction/press/longPress.d.ts +2 -0
- package/dist/automation/actions/interaction/press/longPress.js +44 -0
- package/dist/automation/actions/interaction/press/pressHomeKey.d.ts +2 -0
- package/dist/automation/actions/interaction/press/pressHomeKey.js +20 -0
- package/dist/automation/actions/interaction/verify/VerifyAllBrokenImages.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyAllOptionsAreSelected.js +4 -3
- package/dist/automation/actions/interaction/verify/VerifyIfOptionWithIndexIsDeselectedInElement.js +2 -2
- package/dist/automation/actions/interaction/verify/VerifyIfOptionWithIndexIsSelectedInListBox.js +2 -2
- package/dist/automation/actions/interaction/verify/VerifyListBoxOptionsAreSorted.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyNumberOfElementsByTagName.js +2 -2
- package/dist/automation/actions/interaction/wait/waitTillPresenceOfAllElements.js +2 -2
- package/dist/automation/actions/interface/InputlessActionnterface.d.ts +91 -0
- package/dist/automation/actions/interface/InputlessActionnterface.js +1 -0
- package/dist/automation/actions/interface/clickActionInterface.d.ts +6 -0
- package/dist/automation/actions/interface/elementlessInterface.d.ts +55 -0
- package/dist/automation/actions/interface/elementlessInterface.js +1 -0
- package/dist/automation/actions/interface/pressActionInterface.d.ts +14 -0
- package/dist/automation/browserSession/initiateBrowserSession.d.ts +6 -2
- package/dist/automation/browserSession/initiateBrowserSession.js +16 -12
- package/dist/automation/cloudSession/initiateCloudSession.d.ts +9 -0
- package/dist/automation/cloudSession/initiateCloudSession.js +36 -0
- package/dist/automation/mobileSession/initiateMobileSession.d.ts +5 -2
- package/dist/automation/mobileSession/initiateMobileSession.js +37 -12
- package/dist/core/constants/allAction.js +2 -1
- package/dist/core/constants/defaultValues.d.ts +1 -1
- package/dist/core/constants/defaultValues.js +1 -1
- package/dist/core/constants/supportedActions.js +68 -1
- package/dist/core/interfaces/actionInterface.d.ts +29 -0
- package/dist/core/interfaces/browserCapabilitiesInterface.d.ts +19 -2
- package/dist/core/interfaces/browserCapabilitiesInterface.js +33 -1
- package/dist/core/interfaces/browserConfigurationInterface.d.ts +2 -1
- package/dist/core/interfaces/cloudConfigInterface.d.ts +9 -0
- package/dist/core/interfaces/cloudConfigInterface.js +1 -0
- package/dist/core/interfaces/executionDetails.d.ts +6 -2
- package/dist/core/interfaces/fireflinkScriptPayloadInterface.d.ts +1 -1
- package/dist/core/main/actionHandlerFactory.js +261 -15
- package/dist/core/main/executionContext.js +3 -3
- package/dist/core/main/runAutomationScript.js +33 -18
- package/dist/core/types/browserType.d.ts +1 -0
- package/dist/core/types/browserType.js +1 -0
- package/dist/core/types/cloudServerPortType.d.ts +4 -0
- package/dist/core/types/cloudServerPortType.js +4 -0
- package/dist/core/types/cloudprotocolType.d.ts +1 -0
- package/dist/core/types/cloudprotocolType.js +1 -0
- package/dist/fireflinkData/fireflinkScript/scriptGenrationData.d.ts +2 -0
- package/dist/fireflinkData/fireflinkScript/scriptGenrationData.js +4 -1
- package/dist/imageAnalysisMobile/annotatedScreenshotMobile.d.ts +4 -1
- package/dist/imageAnalysisMobile/annotatedScreenshotMobile.js +7 -4
- package/dist/index.js +0 -2
- package/dist/service/fireflink.service.d.ts +10 -0
- package/dist/service/fireflink.service.js +36 -0
- package/dist/service/kafka/fireflinkKafka.service.d.ts +1 -1
- package/dist/tests/test12.js +17 -4
- package/dist/tests/test3.d.ts +1 -2
- package/dist/tests/test3.js +23 -18
- package/dist/utils/DomExtraction/jsForAttributeInjection.js +3 -1
- package/dist/utils/browserCap/capability.d.ts +23 -0
- package/dist/utils/browserCap/capability.js +37 -0
- package/dist/utils/cloudConfig/cloudPath.d.ts +2 -0
- package/dist/utils/cloudConfig/cloudPath.js +3 -0
- package/dist/utils/helpers/enterActionHelper.js +48 -37
- package/dist/utils/helpers/xpathcreation.d.ts +6 -1
- package/dist/utils/helpers/xpathcreation.js +23 -6
- package/package.json +5 -2
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { logger } from "../../../../utils/logger/logData.js";
|
|
2
|
+
import { execSync } from "child_process";
|
|
3
|
+
export async function SetEmulatorPowerStateOff(args) {
|
|
4
|
+
try {
|
|
5
|
+
try {
|
|
6
|
+
await args.driver.execute("mobile: setPowerState", {
|
|
7
|
+
state: "off"
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
logger.info("mobile: setPowerState failed, attempting ADB fallback for real device...", error);
|
|
12
|
+
const udid = args.driver.capabilities["appium:udid"] || args.driver.capabilities.udid;
|
|
13
|
+
const cmdPrefix = udid ? `adb -s ${udid} shell` : `adb shell`;
|
|
14
|
+
// KEYCODE_SLEEP = 223
|
|
15
|
+
execSync(`${cmdPrefix} input keyevent 223`);
|
|
16
|
+
}
|
|
17
|
+
args.scriptDataAppender.add(async () => ({
|
|
18
|
+
nlpName: "MOB_SetEmulatorPowerStateOff",
|
|
19
|
+
stepInputs: [],
|
|
20
|
+
elementsData: []
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
args.scriptDataAppender.setErrorNLP("MOB_SetEmulatorPowerStateOff");
|
|
25
|
+
throw new Error("SetEmulatorPowerStateOff action failed", { cause: error });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { logger } from "../../../../utils/logger/logData.js";
|
|
2
|
+
import { execSync } from "child_process";
|
|
3
|
+
export async function SetEmulatorPowerStateOn(args) {
|
|
4
|
+
try {
|
|
5
|
+
try {
|
|
6
|
+
await args.driver.execute("mobile: setPowerState", {
|
|
7
|
+
state: "on"
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
logger.info("mobile: setPowerState failed, attempting ADB fallback for real device...", error);
|
|
12
|
+
const udid = args.driver.capabilities["appium:udid"] || args.driver.capabilities.udid;
|
|
13
|
+
const cmdPrefix = udid ? `adb -s ${udid} shell` : `adb shell`;
|
|
14
|
+
// KEYCODE_WAKEUP = 224
|
|
15
|
+
execSync(`${cmdPrefix} input keyevent 224`);
|
|
16
|
+
}
|
|
17
|
+
args.scriptDataAppender.add(async () => ({
|
|
18
|
+
nlpName: "MOB_SetEmulatorPowerStateOn",
|
|
19
|
+
stepInputs: [],
|
|
20
|
+
elementsData: []
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
args.scriptDataAppender.setErrorNLP("MOB_SetEmulatorPowerStateOn");
|
|
25
|
+
throw new Error("SetEmulatorPowerStateOn action failed", { cause: error });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export async function WifiSwitchOff(args) {
|
|
2
|
+
try {
|
|
3
|
+
const currentState = await args.driver.getNetworkConnection();
|
|
4
|
+
// If Wi-Fi is ON (2 or 6), switch it OFF
|
|
5
|
+
if (currentState === 2 || currentState === 6) {
|
|
6
|
+
await args.driver.setNetworkConnection(4); // Data only (Wifi OFF)
|
|
7
|
+
}
|
|
8
|
+
args.scriptDataAppender.add(async () => ({
|
|
9
|
+
nlpName: "MOB_WifiSwitchOff",
|
|
10
|
+
stepInputs: [],
|
|
11
|
+
elementsData: []
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
args.scriptDataAppender.setErrorNLP("MOB_WifiSwitchOff");
|
|
16
|
+
throw new Error("WifiSwitchOff action failed", { cause: error });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export async function WifiSwitchOn(args) {
|
|
2
|
+
try {
|
|
3
|
+
const currentState = await args.driver.getNetworkConnection();
|
|
4
|
+
// If Wi-Fi is OFF (0, 1, 4), switch it ON
|
|
5
|
+
if (currentState === 0 || currentState === 1 || currentState === 4) {
|
|
6
|
+
await args.driver.setNetworkConnection(2); // Wifi only
|
|
7
|
+
}
|
|
8
|
+
args.scriptDataAppender.add(async () => ({
|
|
9
|
+
nlpName: "MOB_WifiSwitchOn",
|
|
10
|
+
stepInputs: [],
|
|
11
|
+
elementsData: []
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
args.scriptDataAppender.setErrorNLP("MOB_WifiSwitchOn");
|
|
16
|
+
throw new Error("WifiSwitchOn action failed", { cause: error });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const LongPress = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const element = await args.driver.$(args.selector);
|
|
4
|
+
let duration = 2000;
|
|
5
|
+
if (args.value && args.value.trim() !== "") {
|
|
6
|
+
const parsed = parseInt(args.value);
|
|
7
|
+
if (!isNaN(parsed)) {
|
|
8
|
+
duration = parsed * 1000;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const location = await element.getLocation();
|
|
12
|
+
const size = await element.getSize();
|
|
13
|
+
const x = location.x + Math.floor(size.width / 2);
|
|
14
|
+
const y = location.y + Math.floor(size.height / 2);
|
|
15
|
+
await args.driver.performActions([
|
|
16
|
+
{
|
|
17
|
+
type: "pointer",
|
|
18
|
+
id: "finger1",
|
|
19
|
+
parameters: { pointerType: "touch" },
|
|
20
|
+
actions: [
|
|
21
|
+
{ type: "pointerMove", duration: 0, x, y },
|
|
22
|
+
{ type: "pointerDown", button: 0 },
|
|
23
|
+
{ type: "pause", duration: duration },
|
|
24
|
+
{ type: "pointerUp", button: 0 }
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
]);
|
|
28
|
+
await args.driver.releaseActions();
|
|
29
|
+
args.scriptDataAppender.add(async () => ({
|
|
30
|
+
nlpName: "MOB_LongPress",
|
|
31
|
+
stepInputs: [duration],
|
|
32
|
+
elementsData: [{
|
|
33
|
+
name: args.elementName,
|
|
34
|
+
type: args.elementType,
|
|
35
|
+
locators: [{ "xpath": args.selector }],
|
|
36
|
+
platform: args.platform
|
|
37
|
+
}]
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
args.scriptDataAppender.setErrorNLP("MOB_LongPress");
|
|
42
|
+
throw new Error("MOB_LongPress action failed", { cause: error });
|
|
43
|
+
}
|
|
44
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { logger } from "../../../../utils/logger/logData.js";
|
|
2
|
+
import { execSync } from "child_process";
|
|
3
|
+
export async function PressHomeKey(args) {
|
|
4
|
+
try {
|
|
5
|
+
logger.info("Pressing HOME key...");
|
|
6
|
+
const udid = args.driver.capabilities["appium:udid"] || args.driver.capabilities.udid;
|
|
7
|
+
const cmdPrefix = udid ? `adb -s ${udid} shell` : `adb shell`;
|
|
8
|
+
// Android HOME keyevent is 3
|
|
9
|
+
execSync(`${cmdPrefix} input keyevent 3`);
|
|
10
|
+
args.scriptDataAppender.add(async () => ({
|
|
11
|
+
nlpName: 'MOB_PressHomeKey',
|
|
12
|
+
stepInputs: [],
|
|
13
|
+
elementsData: []
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
args.scriptDataAppender.setErrorNLP("MOB_PressHomeKey");
|
|
18
|
+
throw new Error("MOB_PressHomeKey action failed", { cause: error });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -2,7 +2,7 @@ import { logger } from "../../../../utils/logger/logData.js";
|
|
|
2
2
|
export async function verifyAllBrokenImages(args) {
|
|
3
3
|
try {
|
|
4
4
|
const images = await args.driver.$$("img");
|
|
5
|
-
if (images.length === 0) {
|
|
5
|
+
if (await images.length === 0) {
|
|
6
6
|
throw new Error("No images found on the page.");
|
|
7
7
|
}
|
|
8
8
|
for (const img of images) {
|
|
@@ -3,7 +3,8 @@ export async function verifyAllOptionsAreSelected(args) {
|
|
|
3
3
|
try {
|
|
4
4
|
const element = await args.driver.$(args.selector);
|
|
5
5
|
const options = await element.$$("option");
|
|
6
|
-
|
|
6
|
+
const length = await options.length;
|
|
7
|
+
if (!options || await options.length === 0) {
|
|
7
8
|
logger.info("No options found in dropdown.");
|
|
8
9
|
}
|
|
9
10
|
let selectedCount = 0;
|
|
@@ -12,9 +13,9 @@ export async function verifyAllOptionsAreSelected(args) {
|
|
|
12
13
|
selectedCount++;
|
|
13
14
|
}
|
|
14
15
|
}
|
|
15
|
-
const isAllSelected = selectedCount === options.length;
|
|
16
|
+
const isAllSelected = selectedCount === await options.length;
|
|
16
17
|
logger.info("Verify all options selected result:", {
|
|
17
|
-
totalOptions:
|
|
18
|
+
totalOptions: length,
|
|
18
19
|
selectedCount,
|
|
19
20
|
isAllSelected
|
|
20
21
|
});
|
package/dist/automation/actions/interaction/verify/VerifyIfOptionWithIndexIsDeselectedInElement.js
CHANGED
|
@@ -6,12 +6,12 @@ export async function verifyIfOptionWithIndexIsDeselectedInElement(args) {
|
|
|
6
6
|
const element = await args.driver.$(args.selector);
|
|
7
7
|
// Get all <option> elements
|
|
8
8
|
const options = await element.$$("option");
|
|
9
|
-
if (!options || options.length === 0) {
|
|
9
|
+
if (!options || await options.length === 0) {
|
|
10
10
|
logger.info("No options found in dropdown.");
|
|
11
11
|
result = false;
|
|
12
12
|
}
|
|
13
13
|
// If index is within range
|
|
14
|
-
if (expectedIndex < options.length && expectedIndex >= 0) {
|
|
14
|
+
if (expectedIndex < await options.length && expectedIndex >= 0) {
|
|
15
15
|
const targetOption = options[expectedIndex];
|
|
16
16
|
const isSelected = await targetOption.isSelected();
|
|
17
17
|
const isDeselected = !isSelected;
|
package/dist/automation/actions/interaction/verify/VerifyIfOptionWithIndexIsSelectedInListBox.js
CHANGED
|
@@ -14,11 +14,11 @@ export async function verifyIfOptionWithIndexIsSelectedInListBox(args) {
|
|
|
14
14
|
;
|
|
15
15
|
// Get all <option> elements
|
|
16
16
|
const options = await element.$$("option");
|
|
17
|
-
if (!options || options.length === 0) {
|
|
17
|
+
if (!options || await options.length === 0) {
|
|
18
18
|
logger.info("No options found in dropdown.");
|
|
19
19
|
}
|
|
20
20
|
// If index is within range
|
|
21
|
-
if (expectedIndex < options.length && expectedIndex >= 0) {
|
|
21
|
+
if (expectedIndex < await options.length && expectedIndex >= 0) {
|
|
22
22
|
const targetOption = options[expectedIndex];
|
|
23
23
|
isSelected = await targetOption.isSelected();
|
|
24
24
|
logger.info("Option index deselection verification result:", {
|
|
@@ -4,7 +4,7 @@ export async function verifyListBoxOptionsAreSorted(args) {
|
|
|
4
4
|
const element = await args.driver.$(args.selector);
|
|
5
5
|
// Get all <option> elements
|
|
6
6
|
const options = await element.$$("option");
|
|
7
|
-
if (!options || options.length === 0) {
|
|
7
|
+
if (!options || await options.length === 0) {
|
|
8
8
|
logger.info("No dropdown options found.");
|
|
9
9
|
}
|
|
10
10
|
// Extract visible text safely (avoids Promise.all typing issue)
|
|
@@ -5,11 +5,11 @@ export async function verifyNumberOfElementsByTagName(args) {
|
|
|
5
5
|
const tagName = parts[0].trim();
|
|
6
6
|
const expectedCount = parseInt(parts[1], 10);
|
|
7
7
|
const elements = await args.driver.$$(tagName);
|
|
8
|
-
const ismatched = elements.length === expectedCount;
|
|
8
|
+
const ismatched = await elements.length === expectedCount;
|
|
9
9
|
logger.info("Number of elements by tag name verification result:", {
|
|
10
10
|
ismatched,
|
|
11
11
|
tagName,
|
|
12
|
-
actualCount:
|
|
12
|
+
actualCount: length,
|
|
13
13
|
expectedCount
|
|
14
14
|
});
|
|
15
15
|
if (ismatched === false) {
|
|
@@ -7,7 +7,7 @@ export async function waitTillPresenceOfAllElements(args) {
|
|
|
7
7
|
const locatorValue = parts[1].trim();
|
|
8
8
|
const elements = await args.driver.$$(`${locatorType}=${locatorValue}`);
|
|
9
9
|
await args.driver.waitUntil(async () => {
|
|
10
|
-
return elements.length > 0;
|
|
10
|
+
return await elements.length > 0;
|
|
11
11
|
}, {
|
|
12
12
|
timeout: 10000,
|
|
13
13
|
timeoutMsg: "Elements not present"
|
|
@@ -33,7 +33,7 @@ export async function waitTillPresenceOfAllElements(args) {
|
|
|
33
33
|
const locatorValue = parts[1].trim();
|
|
34
34
|
const elements = await args.driver.$$(`${locatorType}=${locatorValue}`);
|
|
35
35
|
await args.driver.waitUntil(async () => {
|
|
36
|
-
return elements.length > 0;
|
|
36
|
+
return await elements.length > 0;
|
|
37
37
|
}, {
|
|
38
38
|
timeout: 10000,
|
|
39
39
|
timeoutMsg: "Elements not present"
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { ScriptDataAppender } from "../../../fireflinkData/fireflinkScript/scriptGenrationData.js";
|
|
2
|
+
export interface MOB_OpenNotificationInterface {
|
|
3
|
+
driver: WebdriverIO.Browser;
|
|
4
|
+
scriptDataAppender: ScriptDataAppender;
|
|
5
|
+
platform: string;
|
|
6
|
+
}
|
|
7
|
+
export interface MOB_ResetAppInterface {
|
|
8
|
+
driver: WebdriverIO.Browser;
|
|
9
|
+
scriptDataAppender: ScriptDataAppender;
|
|
10
|
+
platform: string;
|
|
11
|
+
}
|
|
12
|
+
export interface MOB_HideKeyboardInterface {
|
|
13
|
+
driver: WebdriverIO.Browser;
|
|
14
|
+
scriptDataAppender: ScriptDataAppender;
|
|
15
|
+
platform: string;
|
|
16
|
+
}
|
|
17
|
+
export interface MOB_SetEmulatorPowerStateOffInterface {
|
|
18
|
+
driver: WebdriverIO.Browser;
|
|
19
|
+
scriptDataAppender: ScriptDataAppender;
|
|
20
|
+
platform: string;
|
|
21
|
+
}
|
|
22
|
+
export interface MOB_OpenChromeBrowserInterface {
|
|
23
|
+
driver: WebdriverIO.Browser;
|
|
24
|
+
scriptDataAppender: ScriptDataAppender;
|
|
25
|
+
platform: string;
|
|
26
|
+
}
|
|
27
|
+
export interface MOB_SetDeviceOrientationAsPortraitInterface {
|
|
28
|
+
driver: WebdriverIO.Browser;
|
|
29
|
+
scriptDataAppender: ScriptDataAppender;
|
|
30
|
+
platform: string;
|
|
31
|
+
}
|
|
32
|
+
export interface MOB_SetDeviceOrientationAsLandscapeInterface {
|
|
33
|
+
driver: WebdriverIO.Browser;
|
|
34
|
+
scriptDataAppender: ScriptDataAppender;
|
|
35
|
+
platform: string;
|
|
36
|
+
}
|
|
37
|
+
export interface MOB_SetEmulatorPowerStateOnInterface {
|
|
38
|
+
driver: WebdriverIO.Browser;
|
|
39
|
+
scriptDataAppender: ScriptDataAppender;
|
|
40
|
+
platform: string;
|
|
41
|
+
}
|
|
42
|
+
export interface MOB_AirplaneModeSwitchOnInterface {
|
|
43
|
+
driver: WebdriverIO.Browser;
|
|
44
|
+
scriptDataAppender: ScriptDataAppender;
|
|
45
|
+
platform: string;
|
|
46
|
+
}
|
|
47
|
+
export interface MOB_LockDeviceInterface {
|
|
48
|
+
driver: WebdriverIO.Browser;
|
|
49
|
+
scriptDataAppender: ScriptDataAppender;
|
|
50
|
+
platform: string;
|
|
51
|
+
}
|
|
52
|
+
export interface MOB_WifiSwitchOffInterface {
|
|
53
|
+
driver: WebdriverIO.Browser;
|
|
54
|
+
scriptDataAppender: ScriptDataAppender;
|
|
55
|
+
platform: string;
|
|
56
|
+
}
|
|
57
|
+
export interface MOB_WifiSwitchOnInterface {
|
|
58
|
+
driver: WebdriverIO.Browser;
|
|
59
|
+
scriptDataAppender: ScriptDataAppender;
|
|
60
|
+
platform: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ContinueInterface {
|
|
63
|
+
driver: WebdriverIO.Browser;
|
|
64
|
+
scriptDataAppender: ScriptDataAppender;
|
|
65
|
+
platform: string;
|
|
66
|
+
}
|
|
67
|
+
export interface MOB_GpsSwitchOnInterface {
|
|
68
|
+
driver: WebdriverIO.Browser;
|
|
69
|
+
scriptDataAppender: ScriptDataAppender;
|
|
70
|
+
platform: string;
|
|
71
|
+
}
|
|
72
|
+
export interface MOB_GpsSwitchOffInterface {
|
|
73
|
+
driver: WebdriverIO.Browser;
|
|
74
|
+
scriptDataAppender: ScriptDataAppender;
|
|
75
|
+
platform: string;
|
|
76
|
+
}
|
|
77
|
+
export interface MOB_RestartCurrentDeviceInterface {
|
|
78
|
+
driver: WebdriverIO.Browser;
|
|
79
|
+
scriptDataAppender: ScriptDataAppender;
|
|
80
|
+
platform: string;
|
|
81
|
+
}
|
|
82
|
+
export interface MOB_AirplaneModeSwitchOffInterface {
|
|
83
|
+
driver: WebdriverIO.Browser;
|
|
84
|
+
scriptDataAppender: ScriptDataAppender;
|
|
85
|
+
platform: string;
|
|
86
|
+
}
|
|
87
|
+
export interface BreakInterface {
|
|
88
|
+
driver: WebdriverIO.Browser;
|
|
89
|
+
scriptDataAppender: ScriptDataAppender;
|
|
90
|
+
platform: string;
|
|
91
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ScriptDataAppender } from "../../../fireflinkData/fireflinkScript/scriptGenrationData.js";
|
|
2
|
+
export interface MOB_TapOnSpecifiedLocationInterface {
|
|
3
|
+
driver: WebdriverIO.Browser;
|
|
4
|
+
scriptDataAppender: ScriptDataAppender;
|
|
5
|
+
platform: string;
|
|
6
|
+
value: string;
|
|
7
|
+
}
|
|
8
|
+
export interface MOB_OpenMobileApplicationInterface {
|
|
9
|
+
driver: WebdriverIO.Browser;
|
|
10
|
+
scriptDataAppender: ScriptDataAppender;
|
|
11
|
+
platform: string;
|
|
12
|
+
value: string;
|
|
13
|
+
}
|
|
14
|
+
export interface MOB_IsAppInstalledInterface {
|
|
15
|
+
driver: WebdriverIO.Browser;
|
|
16
|
+
scriptDataAppender: ScriptDataAppender;
|
|
17
|
+
platform: string;
|
|
18
|
+
value: string;
|
|
19
|
+
}
|
|
20
|
+
export interface MOB_ReceiveMessageOnEmulatorInterface {
|
|
21
|
+
driver: WebdriverIO.Browser;
|
|
22
|
+
scriptDataAppender: ScriptDataAppender;
|
|
23
|
+
platform: string;
|
|
24
|
+
value: string;
|
|
25
|
+
}
|
|
26
|
+
export interface MOB_UninstallAPKInterface {
|
|
27
|
+
driver: WebdriverIO.Browser;
|
|
28
|
+
scriptDataAppender: ScriptDataAppender;
|
|
29
|
+
platform: string;
|
|
30
|
+
value: string;
|
|
31
|
+
}
|
|
32
|
+
export interface MOB_InstallAPKInterface {
|
|
33
|
+
driver: WebdriverIO.Browser;
|
|
34
|
+
scriptDataAppender: ScriptDataAppender;
|
|
35
|
+
platform: string;
|
|
36
|
+
value: string;
|
|
37
|
+
}
|
|
38
|
+
export interface MOB_TerminateAppUsingAppPackageInterface {
|
|
39
|
+
driver: WebdriverIO.Browser;
|
|
40
|
+
scriptDataAppender: ScriptDataAppender;
|
|
41
|
+
platform: string;
|
|
42
|
+
value: string;
|
|
43
|
+
}
|
|
44
|
+
export interface MOB_OpenAppWithApkFilePathInterface {
|
|
45
|
+
driver: WebdriverIO.Browser;
|
|
46
|
+
scriptDataAppender: ScriptDataAppender;
|
|
47
|
+
platform: string;
|
|
48
|
+
value: string;
|
|
49
|
+
}
|
|
50
|
+
export interface MOB_ActivateAppUsingAppPackageInterface {
|
|
51
|
+
driver: WebdriverIO.Browser;
|
|
52
|
+
scriptDataAppender: ScriptDataAppender;
|
|
53
|
+
platform: string;
|
|
54
|
+
value: string;
|
|
55
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -21,3 +21,17 @@ export interface PressEnterKeyInterface {
|
|
|
21
21
|
scriptDataAppender: ScriptDataAppender;
|
|
22
22
|
platform: string;
|
|
23
23
|
}
|
|
24
|
+
export interface MOB_PressHomeKeyInterface {
|
|
25
|
+
driver: WebdriverIO.Browser;
|
|
26
|
+
scriptDataAppender: ScriptDataAppender;
|
|
27
|
+
platform: string;
|
|
28
|
+
}
|
|
29
|
+
export interface MOB_LongPressInterface {
|
|
30
|
+
driver: WebdriverIO.Browser;
|
|
31
|
+
scriptDataAppender: ScriptDataAppender;
|
|
32
|
+
platform: string;
|
|
33
|
+
selector: string;
|
|
34
|
+
value: string;
|
|
35
|
+
elementName: string;
|
|
36
|
+
elementType: any;
|
|
37
|
+
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { Browser } from "../../core/types/browserType.js";
|
|
2
|
+
import { CloudConfig } from "../../core/interfaces/cloudConfigInterface.js";
|
|
1
3
|
export declare class BrowserSession {
|
|
2
|
-
private
|
|
4
|
+
private driver;
|
|
3
5
|
private browserName;
|
|
4
6
|
private pageLoad;
|
|
5
|
-
|
|
7
|
+
private cloudSessionInstances;
|
|
8
|
+
private isCloud;
|
|
9
|
+
constructor(browserName: Browser, isCloud: boolean | undefined, capabilities: Record<string, any> | undefined, pageLoad: number, CloudConfig: CloudConfig | undefined);
|
|
6
10
|
private openBrowser;
|
|
7
11
|
open(): Promise<void>;
|
|
8
12
|
close(): Promise<void>;
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { remote } from "webdriverio";
|
|
2
|
+
import { getCapabilities } from "../../utils/browserCap/capability.js";
|
|
3
|
+
import { CloudSession } from "../cloudSession/initiateCloudSession.js";
|
|
2
4
|
export class BrowserSession {
|
|
3
|
-
constructor(browserName, pageLoad) {
|
|
4
|
-
this.
|
|
5
|
+
constructor(browserName, isCloud, capabilities, pageLoad, CloudConfig) {
|
|
6
|
+
this.driver = null;
|
|
5
7
|
this.browserName = browserName;
|
|
6
8
|
this.pageLoad = pageLoad;
|
|
9
|
+
this.isCloud = isCloud;
|
|
10
|
+
this.cloudSessionInstances = new CloudSession(capabilities, CloudConfig);
|
|
7
11
|
}
|
|
8
12
|
async openBrowser() {
|
|
9
13
|
try {
|
|
10
14
|
const driver = await remote({
|
|
11
|
-
capabilities:
|
|
12
|
-
browserName: this.browserName,
|
|
13
|
-
},
|
|
15
|
+
capabilities: getCapabilities(this.browserName),
|
|
14
16
|
logLevel: "silent"
|
|
15
17
|
});
|
|
16
|
-
driver.setTimeout({ 'pageLoad':
|
|
18
|
+
driver.setTimeout({ 'pageLoad': this.pageLoad });
|
|
17
19
|
await driver.waitUntil(async () => {
|
|
18
20
|
const state = await driver.execute(() => document.readyState);
|
|
19
21
|
return state === "complete";
|
|
@@ -25,18 +27,20 @@ export class BrowserSession {
|
|
|
25
27
|
}
|
|
26
28
|
}
|
|
27
29
|
async open() {
|
|
28
|
-
this.
|
|
30
|
+
this.driver = this.isCloud
|
|
31
|
+
? await this.cloudSessionInstances.initialize()
|
|
32
|
+
: await this.openBrowser();
|
|
29
33
|
}
|
|
30
34
|
async close() {
|
|
31
|
-
if (this.
|
|
32
|
-
await this.
|
|
33
|
-
this.
|
|
35
|
+
if (this.driver) {
|
|
36
|
+
await this.driver.deleteSession();
|
|
37
|
+
this.driver = null;
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
40
|
async getCurrentDriver() {
|
|
37
|
-
if (!this.
|
|
41
|
+
if (!this.driver) {
|
|
38
42
|
throw new Error("Browser is not initialized");
|
|
39
43
|
}
|
|
40
|
-
return this.
|
|
44
|
+
return this.driver;
|
|
41
45
|
}
|
|
42
46
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CloudConfig } from "../../core/interfaces/cloudConfigInterface.js";
|
|
2
|
+
export declare class CloudSession {
|
|
3
|
+
private driver;
|
|
4
|
+
private capabilities;
|
|
5
|
+
private cloudConfig;
|
|
6
|
+
constructor(capabilities?: Record<string, any>, cloudConfig?: CloudConfig);
|
|
7
|
+
private createDriver;
|
|
8
|
+
initialize(): Promise<WebdriverIO.Browser>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { remote } from "webdriverio";
|
|
2
|
+
import { logger } from "../../utils/logger/logData.js";
|
|
3
|
+
import { CloudPort } from "../../core/types/cloudServerPortType.js";
|
|
4
|
+
import { getPath } from "../../utils/cloudConfig/cloudPath.js";
|
|
5
|
+
export class CloudSession {
|
|
6
|
+
constructor(capabilities, cloudConfig) {
|
|
7
|
+
this.driver = null;
|
|
8
|
+
this.capabilities = {
|
|
9
|
+
"wdio:enforceWebDriverClassic": true,
|
|
10
|
+
"devicefarm:networkLogEnable": false,
|
|
11
|
+
"fireflink:deviceType": "public",
|
|
12
|
+
...(capabilities ?? {})
|
|
13
|
+
};
|
|
14
|
+
this.cloudConfig = cloudConfig ?? {};
|
|
15
|
+
}
|
|
16
|
+
async createDriver() {
|
|
17
|
+
logger.info(this.capabilities);
|
|
18
|
+
try {
|
|
19
|
+
return await remote({
|
|
20
|
+
protocol: this.cloudConfig.protocol,
|
|
21
|
+
hostname: this.cloudConfig.hostname,
|
|
22
|
+
port: CloudPort[this.cloudConfig.protocol ?? "https"],
|
|
23
|
+
path: getPath(this.cloudConfig),
|
|
24
|
+
capabilities: this.capabilities,
|
|
25
|
+
logLevel: "silent"
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw new Error("Browser failed to open", { cause: error });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async initialize() {
|
|
33
|
+
this.driver = this.driver ?? await this.createDriver();
|
|
34
|
+
return this.driver;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CloudConfig } from "../../core/interfaces/cloudConfigInterface.js";
|
|
1
2
|
export interface IMobileCapabilities {
|
|
2
3
|
platformName: "Android";
|
|
3
4
|
"appium:platformVersion": string;
|
|
@@ -17,10 +18,12 @@ export interface IMobileCapabilities {
|
|
|
17
18
|
[key: string]: any;
|
|
18
19
|
}
|
|
19
20
|
export declare class MobileSession {
|
|
20
|
-
private
|
|
21
|
+
private driver;
|
|
21
22
|
private appiumPort;
|
|
22
23
|
private currentAppPackage;
|
|
23
|
-
|
|
24
|
+
private cloudSessionInstances;
|
|
25
|
+
private isCloud;
|
|
26
|
+
constructor(appiumPort: number, isCloud: boolean | undefined, capabilities: Record<string, string | boolean> | undefined, CloudConfig: CloudConfig | undefined);
|
|
24
27
|
private openApp;
|
|
25
28
|
open(arg: {
|
|
26
29
|
capabilities: IMobileCapabilities;
|