ff-automationv2 2.2.7 → 2.2.10
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/fireflinkElementIndexExtractor_Mob.js +2 -1
- package/dist/ai/llmprompts/systemPrompts/getActionExtractorPromptMob.js +3 -2
- package/dist/ai/llmprompts/systemPrompts/mobileKeywordExtractor.js +3 -1
- package/dist/ai/llmprompts/systemPrompts/verifyActionExtractorPromptMob.js +6 -4
- package/dist/ai/llmprompts/systemPrompts/waitActionExtractorPromptMob.js +2 -1
- package/dist/automation/actions/executor.d.ts +54 -0
- package/dist/automation/actions/executor.js +789 -0
- package/dist/automation/actions/interaction/click/doubleClick.js +1 -5
- package/dist/automation/actions/interaction/enterActions/enterInputAndPress.js +10 -3
- package/dist/automation/actions/interaction/enterActions/waitAndEnter.js +20 -19
- package/dist/automation/actions/interaction/get/MOB_GetADBLogsForGivenAppPackage.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetADBLogsForGivenAppPackage.js +18 -0
- package/dist/automation/actions/interaction/get/MOB_GetAllContexts.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetAllContexts.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetAllWindowHandles.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetAllWindowHandles.js +26 -0
- package/dist/automation/actions/interaction/get/MOB_GetAltitude.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetAltitude.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetBatteryPercentage.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetBatteryPercentage.js +19 -0
- package/dist/automation/actions/interaction/get/MOB_GetBatteryStatus.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetBatteryStatus.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetClipBoardText.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetClipBoardText.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentActivity.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentActivity.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentAppPackage.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentAppPackage.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentContext.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentContext.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceDate.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceDate.js +18 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceSettings.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceSettings.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceStatus.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceStatus.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceSystemBars.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceSystemBars.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceTime.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceTime.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentOrientation.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentOrientation.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentSessionId.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetCurrentSessionId.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetDeviceLocation.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetDeviceLocation.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetDeviceName.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetDeviceName.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetDeviceOsVersion.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetDeviceOsVersion.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetDeviceUdid.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetDeviceUdid.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetHeightOfElement.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetHeightOfElement.js +23 -0
- package/dist/automation/actions/interaction/get/MOB_GetHeightOfScreen.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetHeightOfScreen.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetHourFromCurrentDeviceTime.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetHourFromCurrentDeviceTime.js +18 -0
- package/dist/automation/actions/interaction/get/MOB_GetLatitude.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetLatitude.js +19 -0
- package/dist/automation/actions/interaction/get/MOB_GetLongitude.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetLongitude.js +19 -0
- package/dist/automation/actions/interaction/get/MOB_GetMinuteFromCurrentDeviceTime.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetMinuteFromCurrentDeviceTime.js +18 -0
- package/dist/automation/actions/interaction/get/MOB_GetSecondFromCurrentDeviceTime.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetSecondFromCurrentDeviceTime.js +17 -0
- package/dist/automation/actions/interaction/get/MOB_GetSizeOfScreen.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetSizeOfScreen.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetSupportedPerformanceDataTypes.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetSupportedPerformanceDataTypes.js +16 -0
- package/dist/automation/actions/interaction/get/MOB_GetTextFromElementAndSetToClipBoard.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetTextFromElementAndSetToClipBoard.js +31 -0
- package/dist/automation/actions/interaction/get/MOB_GetWidthOfElement.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetWidthOfElement.js +23 -0
- package/dist/automation/actions/interaction/get/MOB_GetWidthOfScreen.d.ts +2 -0
- package/dist/automation/actions/interaction/get/MOB_GetWidthOfScreen.js +17 -0
- package/dist/automation/actions/interaction/get/getRect.js +2 -4
- package/dist/automation/actions/interaction/get/getScreenshot.js +23 -18
- package/dist/automation/actions/interaction/get/getScreenshotAs.js +30 -40
- package/dist/automation/actions/interaction/press/pressAnyKeyNTimes.js +8 -1
- package/dist/automation/actions/interaction/press/pressEnterKey.js +1 -1
- package/dist/automation/actions/interaction/set/MOB_SetContext.d.ts +2 -0
- package/dist/automation/actions/interaction/set/MOB_SetContext.js +17 -0
- package/dist/automation/actions/interaction/set/MOB_SetEmulatorPowerPercentage.d.ts +2 -0
- package/dist/automation/actions/interaction/set/MOB_SetEmulatorPowerPercentage.js +24 -0
- package/dist/automation/actions/interaction/set/setClipBoardText.js +1 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyBatteryLevel.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyBatteryLevel.js +22 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfAirplaneModeOff.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfAirplaneModeOff.js +17 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfAirplaneModeOn.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfAirplaneModeOn.js +17 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfAppIsClosed.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfAppIsClosed.js +17 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfDeviceIsLocked.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfDeviceIsLocked.js +16 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfDeviceIsUnlocked.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfDeviceIsUnlocked.js +17 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfGpsOff.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfGpsOff.js +17 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfGpsOn.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfGpsOn.js +17 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfKeyboardIsHidden.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfKeyboardIsHidden.js +17 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfKeyboardIsShown.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfKeyboardIsShown.js +16 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfWifiOff.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfWifiOff.js +17 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfWifiOn.d.ts +2 -0
- package/dist/automation/actions/interaction/verify/MOB_VerifyIfWifiOn.js +17 -0
- package/dist/automation/actions/interaction/verify/VerifyAttributeValue.js +92 -28
- package/dist/automation/actions/interaction/verify/VerifyHeightOfWebElement.js +2 -1
- package/dist/automation/actions/interaction/verify/VerifyListBoxOptionsAreSorted.js +0 -2
- package/dist/automation/actions/interaction/verify/VerifyPartialAttributeValue.js +98 -37
- package/dist/automation/actions/interaction/verify/verifypartialtext.js +1 -1
- package/dist/automation/actions/interaction/verify/verifytext.js +5 -2
- package/dist/automation/actions/interaction/wait/MOB_WaitTillAllElementsAreInvisible.ts.d.ts +2 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillAllElementsAreInvisible.ts.js +25 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillAttributeOfElementContainsString.d.ts +2 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillAttributeOfElementContainsString.js +27 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillElementIsEnabled.d.ts +2 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillElementIsEnabled.js +22 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillElementIsInvisible.d.ts +2 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillElementIsInvisible.js +22 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillElementIsSelected.d.ts +2 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillElementIsSelected.js +22 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillElementIsVisible.d.ts +2 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillElementIsVisible.js +22 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillStalenessOfElement.d.ts +2 -0
- package/dist/automation/actions/interaction/wait/MOB_WaitTillStalenessOfElement.js +22 -0
- package/dist/automation/actions/interaction/wait/waitTillAttributeOfElementIsString.js +1 -1
- package/dist/automation/actions/interaction/wait/waitTillPresenceOfAllElements.js +12 -2
- package/dist/automation/actions/interface/getActionInterface.d.ts +174 -0
- package/dist/automation/actions/interface/setActionInterface.d.ts +12 -0
- package/dist/automation/actions/interface/verifyActionInterface.d.ts +62 -0
- package/dist/automation/actions/interface/waitActionInterface.d.ts +55 -0
- package/dist/core/constants/supportedActions.js +89 -8
- package/dist/core/interfaces/actionInterface.d.ts +53 -0
- package/dist/core/main/actionHandlerFactory.js +162 -0
- package/dist/core/main/executionContext.js +1 -1
- package/dist/core/main/runAutomationScript.js +3 -3
- package/dist/domAnalysis/searchBest.js +4 -2
- package/dist/fireflinkData/fireflinkScript/scriptGenrationData.d.ts +1 -2
- package/dist/fireflinkData/fireflinkScript/scriptGenrationData.js +6 -7
- package/package.json +1 -1
- package/dist/service/scriptRunner.service.d.ts +0 -10
- package/dist/service/scriptRunner.service.js +0 -36
- package/dist/utils/mobileXpath/findXpathFromIndex.d.ts +0 -2
- package/dist/utils/mobileXpath/findXpathFromIndex.js +0 -61
- package/dist/utils/mobileXpath/findXpathFromIndexInterface.d.ts +0 -4
- package/dist/utils/mobileXpath/findXpathFromIndexInterface.js +0 -1
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const MOB_VerifyIfDeviceIsLocked = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const _locked = await args.driver.isLocked();
|
|
4
|
+
args.scriptDataAppender.add(async () => {
|
|
5
|
+
return {
|
|
6
|
+
nlpName: "MOB_VerifyIfDeviceIsLocked",
|
|
7
|
+
stepInputs: [],
|
|
8
|
+
elementsData: []
|
|
9
|
+
};
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
args.scriptDataAppender.setErrorNLP("MOB_VerifyIfDeviceIsLocked");
|
|
14
|
+
throw new Error("MOB_VerifyIfDeviceIsLocked action failed", { cause: error });
|
|
15
|
+
}
|
|
16
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const MOB_VerifyIfDeviceIsUnlocked = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const locked = await args.driver.isLocked();
|
|
4
|
+
const _unlocked = !locked;
|
|
5
|
+
args.scriptDataAppender.add(async () => {
|
|
6
|
+
return {
|
|
7
|
+
nlpName: "MOB_VerifyIfDeviceIsUnlocked",
|
|
8
|
+
stepInputs: [],
|
|
9
|
+
elementsData: []
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
args.scriptDataAppender.setErrorNLP("MOB_VerifyIfDeviceIsUnlocked");
|
|
15
|
+
throw new Error("MOB_VerifyIfDeviceIsUnlocked action failed", { cause: error });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const MOB_VerifyIfGpsOff = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const location = await args.driver.getGeoLocation();
|
|
4
|
+
const _gpsOff = !location;
|
|
5
|
+
args.scriptDataAppender.add(async () => {
|
|
6
|
+
return {
|
|
7
|
+
nlpName: "MOB_VerifyIfGpsOff",
|
|
8
|
+
stepInputs: [],
|
|
9
|
+
elementsData: []
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
args.scriptDataAppender.setErrorNLP("MOB_VerifyIfGpsOff");
|
|
15
|
+
throw new Error("MOB_VerifyIfGpsOff action failed", { cause: error });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const MOB_VerifyIfGpsOn = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const location = await args.driver.getGeoLocation();
|
|
4
|
+
const _gpsOn = !!location;
|
|
5
|
+
args.scriptDataAppender.add(async () => {
|
|
6
|
+
return {
|
|
7
|
+
nlpName: "MOB_VerifyIfGpsOn",
|
|
8
|
+
stepInputs: [],
|
|
9
|
+
elementsData: []
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
args.scriptDataAppender.setErrorNLP("MOB_VerifyIfGpsOn");
|
|
15
|
+
throw new Error("MOB_VerifyIfGpsOn action failed", { cause: error });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const MOB_VerifyIfKeyboardIsHidden = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const shown = await args.driver.isKeyboardShown();
|
|
4
|
+
const _hidden = !shown;
|
|
5
|
+
args.scriptDataAppender.add(async () => {
|
|
6
|
+
return {
|
|
7
|
+
nlpName: "MOB_VerifyIfKeyboardIsHidden",
|
|
8
|
+
stepInputs: [],
|
|
9
|
+
elementsData: []
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
args.scriptDataAppender.setErrorNLP("MOB_VerifyIfKeyboardIsHidden");
|
|
15
|
+
throw new Error("MOB_VerifyIfKeyboardIsHidden action failed", { cause: error });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const MOB_VerifyIfKeyboardIsShown = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const _shown = await args.driver.isKeyboardShown();
|
|
4
|
+
args.scriptDataAppender.add(async () => {
|
|
5
|
+
return {
|
|
6
|
+
nlpName: "MOB_VerifyIfKeyboardIsShown",
|
|
7
|
+
stepInputs: [],
|
|
8
|
+
elementsData: []
|
|
9
|
+
};
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
args.scriptDataAppender.setErrorNLP("MOB_VerifyIfKeyboardIsShown");
|
|
14
|
+
throw new Error("MOB_VerifyIfKeyboardIsShown action failed", { cause: error });
|
|
15
|
+
}
|
|
16
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const MOB_VerifyIfWifiOff = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const connection = await args.driver.getNetworkConnection();
|
|
4
|
+
const _wifiOff = !(connection === 2 || connection === 6);
|
|
5
|
+
args.scriptDataAppender.add(async () => {
|
|
6
|
+
return {
|
|
7
|
+
nlpName: "MOB_VerifyIfWifiOff",
|
|
8
|
+
stepInputs: [],
|
|
9
|
+
elementsData: []
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
args.scriptDataAppender.setErrorNLP("MOB_VerifyIfWifiOff");
|
|
15
|
+
throw new Error("MOB_VerifyIfWifiOff action failed", { cause: error });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const MOB_VerifyIfWifiOn = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const connection = await args.driver.getNetworkConnection();
|
|
4
|
+
const _wifiOn = connection === 2 || connection === 6;
|
|
5
|
+
args.scriptDataAppender.add(async () => {
|
|
6
|
+
return {
|
|
7
|
+
nlpName: "MOB_VerifyIfWifiOn",
|
|
8
|
+
stepInputs: [],
|
|
9
|
+
elementsData: []
|
|
10
|
+
};
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
args.scriptDataAppender.setErrorNLP("MOB_VerifyIfWifiOn");
|
|
15
|
+
throw new Error("MOB_VerifyIfWifiOn action failed", { cause: error });
|
|
16
|
+
}
|
|
17
|
+
};
|
|
@@ -1,28 +1,64 @@
|
|
|
1
1
|
import { logger } from "../../../../utils/logger/logData.js";
|
|
2
2
|
export async function verifyAttributeValue(args) {
|
|
3
3
|
switch (args.platform) {
|
|
4
|
+
// ================= ANDROID =================
|
|
4
5
|
case "android":
|
|
5
6
|
try {
|
|
6
7
|
const element = await args.driver.$(args.selector);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const expectedValue = parts[1].trim();
|
|
10
|
-
const caseSensitive = false;
|
|
11
|
-
const actualValue = (await element.getAttribute(attrName)) ||
|
|
12
|
-
"";
|
|
13
|
-
const isMatched = actualValue.toLowerCase() === expectedValue.toLowerCase();
|
|
14
|
-
logger.info("Attribute value verification result:", { isMatched, actualValue, expectedValue });
|
|
15
|
-
if (isMatched === false) {
|
|
16
|
-
throw new Error(`Attribute value does not match. Expected: ${expectedValue}, Actual: ${actualValue}`);
|
|
8
|
+
if (!element) {
|
|
9
|
+
throw new Error("Element not found");
|
|
17
10
|
}
|
|
11
|
+
// -------- SAFE PARSING --------
|
|
12
|
+
let attrName = "text"; // default for mobile
|
|
13
|
+
let expectedValue = "";
|
|
14
|
+
if (args.value && args.value.includes(",")) {
|
|
15
|
+
const parts = args.value.split(",");
|
|
16
|
+
attrName = parts[0]?.trim() || "text";
|
|
17
|
+
expectedValue = parts[1]?.trim() || "";
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
expectedValue = args.value?.trim() || "";
|
|
21
|
+
}
|
|
22
|
+
// -------- GET ACTUAL VALUE --------
|
|
23
|
+
let actualValue = "";
|
|
24
|
+
switch (attrName.toLowerCase()) {
|
|
25
|
+
case "text":
|
|
26
|
+
actualValue = await element.getText();
|
|
27
|
+
break;
|
|
28
|
+
case "content-desc":
|
|
29
|
+
actualValue = await element.getAttribute("content-desc") || "";
|
|
30
|
+
break;
|
|
31
|
+
case "resource-id":
|
|
32
|
+
actualValue = await element.getAttribute("resource-id") || "";
|
|
33
|
+
break;
|
|
34
|
+
case "enabled":
|
|
35
|
+
actualValue = await element.getAttribute("enabled") || "";
|
|
36
|
+
break;
|
|
37
|
+
default:
|
|
38
|
+
actualValue = await element.getAttribute(attrName) || "";
|
|
39
|
+
}
|
|
40
|
+
// -------- MATCH LOGIC (FLEXIBLE) --------
|
|
41
|
+
const isMatched = actualValue
|
|
42
|
+
.toLowerCase()
|
|
43
|
+
.includes(expectedValue.toLowerCase());
|
|
44
|
+
logger.info("Attribute value verification result:", {
|
|
45
|
+
attrName,
|
|
46
|
+
expectedValue,
|
|
47
|
+
actualValue,
|
|
48
|
+
isMatched
|
|
49
|
+
});
|
|
50
|
+
if (!isMatched) {
|
|
51
|
+
throw new Error(`Attribute value mismatch. Expected to contain: "${expectedValue}", Actual: "${actualValue}"`);
|
|
52
|
+
}
|
|
53
|
+
// -------- APPENDER --------
|
|
18
54
|
args.scriptDataAppender.add(async () => {
|
|
19
55
|
return {
|
|
20
|
-
nlpName:
|
|
21
|
-
stepInputs: [attrName, expectedValue,
|
|
56
|
+
nlpName: "MOB_VerifyAttributeValue",
|
|
57
|
+
stepInputs: [attrName, expectedValue, false],
|
|
22
58
|
elementsData: [{
|
|
23
59
|
name: args.elementName,
|
|
24
60
|
type: args.elementType,
|
|
25
|
-
locators: [{
|
|
61
|
+
locators: [{ xpath: args.selector }],
|
|
26
62
|
platform: args.platform
|
|
27
63
|
}]
|
|
28
64
|
};
|
|
@@ -30,30 +66,58 @@ export async function verifyAttributeValue(args) {
|
|
|
30
66
|
}
|
|
31
67
|
catch (error) {
|
|
32
68
|
args.scriptDataAppender.setErrorNLP("MOB_VerifyAttributeValue");
|
|
33
|
-
throw new Error(`VerifyAttributeValue action failed
|
|
69
|
+
throw new Error(`VerifyAttributeValue action failed`, { cause: error });
|
|
34
70
|
}
|
|
35
71
|
break;
|
|
72
|
+
// ================= WEB =================
|
|
36
73
|
case "web":
|
|
37
74
|
default:
|
|
38
75
|
try {
|
|
39
76
|
const element = await args.driver.$(args.selector);
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
77
|
+
if (!element) {
|
|
78
|
+
throw new Error("Element not found");
|
|
79
|
+
}
|
|
80
|
+
// -------- SAFE PARSING --------
|
|
81
|
+
let attrName = "text";
|
|
82
|
+
let expectedValue = "";
|
|
83
|
+
if (args.value && args.value.includes(",")) {
|
|
84
|
+
const parts = args.value.split(",");
|
|
85
|
+
attrName = parts[0]?.trim() || "text";
|
|
86
|
+
expectedValue = parts[1]?.trim() || "";
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
expectedValue = args.value?.trim() || "";
|
|
90
|
+
}
|
|
91
|
+
// -------- GET VALUE (ATTRIBUTE OR TEXT FALLBACK) --------
|
|
92
|
+
let actualValue = "";
|
|
93
|
+
if (attrName === "text") {
|
|
94
|
+
actualValue = await element.getText();
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
actualValue =
|
|
98
|
+
(await element.getAttribute(attrName)) ||
|
|
99
|
+
(await element.getText()) ||
|
|
100
|
+
"";
|
|
101
|
+
}
|
|
102
|
+
// -------- MATCH LOGIC --------
|
|
103
|
+
const isMatched = actualValue
|
|
104
|
+
.toLowerCase()
|
|
105
|
+
.includes(expectedValue.toLowerCase());
|
|
106
|
+
logger.info("Attribute value verification result:", {
|
|
107
|
+
attrName,
|
|
108
|
+
expectedValue,
|
|
109
|
+
actualValue,
|
|
110
|
+
isMatched
|
|
111
|
+
});
|
|
112
|
+
if (!isMatched) {
|
|
113
|
+
throw new Error(`Attribute value mismatch. Expected to contain: "${expectedValue}", Actual: "${actualValue}"`);
|
|
51
114
|
}
|
|
115
|
+
// -------- APPENDER --------
|
|
52
116
|
args.scriptDataAppender.add(async () => {
|
|
53
117
|
const ffElement = await args.elementGetter.getFireFlinkElement(args.pageDOM, `[ff-inspect="${args.fireflinkIndex}"]`);
|
|
54
118
|
return {
|
|
55
|
-
nlpName:
|
|
56
|
-
stepInputs: [attrName, expectedValue,
|
|
119
|
+
nlpName: "VerifyAttributeValue",
|
|
120
|
+
stepInputs: [attrName, expectedValue, false],
|
|
57
121
|
elementsData: [{
|
|
58
122
|
name: args.elementName,
|
|
59
123
|
type: args.elementType,
|
|
@@ -65,7 +129,7 @@ export async function verifyAttributeValue(args) {
|
|
|
65
129
|
}
|
|
66
130
|
catch (error) {
|
|
67
131
|
args.scriptDataAppender.setErrorNLP("VerifyAttributeValue");
|
|
68
|
-
throw new Error(`VerifyAttributeValue action failed
|
|
132
|
+
throw new Error(`VerifyAttributeValue action failed`, { cause: error });
|
|
69
133
|
}
|
|
70
134
|
break;
|
|
71
135
|
}
|
|
@@ -4,8 +4,9 @@ export async function verifyHeightOfWebElement(args) {
|
|
|
4
4
|
case "android":
|
|
5
5
|
try {
|
|
6
6
|
const element = await args.driver.$(args.selector);
|
|
7
|
-
const expectedHeight =
|
|
7
|
+
const expectedHeight = Number(args.value);
|
|
8
8
|
const size = await element.getSize();
|
|
9
|
+
logger.info(`Expected height :${expectedHeight}`);
|
|
9
10
|
const isMatched = size.height === expectedHeight;
|
|
10
11
|
logger.info("Height verification result:", {
|
|
11
12
|
isMatched,
|
|
@@ -2,12 +2,10 @@ import { logger } from "../../../../utils/logger/logData.js";
|
|
|
2
2
|
export async function verifyListBoxOptionsAreSorted(args) {
|
|
3
3
|
try {
|
|
4
4
|
const element = await args.driver.$(args.selector);
|
|
5
|
-
// Get all <option> elements
|
|
6
5
|
const options = await element.$$("option");
|
|
7
6
|
if (!options || await options.length === 0) {
|
|
8
7
|
logger.info("No dropdown options found.");
|
|
9
8
|
}
|
|
10
|
-
// Extract visible text safely (avoids Promise.all typing issue)
|
|
11
9
|
const optionTexts = [];
|
|
12
10
|
for (const option of options) {
|
|
13
11
|
const text = await option.getText();
|
|
@@ -1,60 +1,121 @@
|
|
|
1
1
|
import { logger } from "../../../../utils/logger/logData.js";
|
|
2
2
|
export async function verifyPartialAttributeValue(args) {
|
|
3
3
|
switch (args.platform) {
|
|
4
|
+
// ================= ANDROID =================
|
|
4
5
|
case "android":
|
|
5
6
|
try {
|
|
6
7
|
const element = await args.driver.$(args.selector);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const expectedValue = parts[1].trim();
|
|
10
|
-
const caseSensitive = false;
|
|
11
|
-
const actualValue = (await element.getAttribute(attrName)) ||
|
|
12
|
-
(await element.getText()) ||
|
|
13
|
-
"";
|
|
14
|
-
const isMatched = actualValue.toLowerCase().includes(expectedValue.toLowerCase());
|
|
15
|
-
logger.info("Attribute value verification result:", { isMatched, actualValue, expectedValue });
|
|
16
|
-
if (isMatched === false) {
|
|
17
|
-
throw new Error(`Attribute "${attrName}" value does not contain expected text. Expected to contain: "${expectedValue}", Actual: "${actualValue}"`);
|
|
8
|
+
if (!element) {
|
|
9
|
+
throw new Error("Element not found");
|
|
18
10
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
11
|
+
// -------- SAFE PARSING --------
|
|
12
|
+
let attrName = "text";
|
|
13
|
+
let expectedValue = "";
|
|
14
|
+
if (args.value && args.value.includes(",")) {
|
|
15
|
+
const parts = args.value.split(",");
|
|
16
|
+
attrName = parts[0]?.trim() || "text";
|
|
17
|
+
expectedValue = parts[1]?.trim() || "";
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
expectedValue = args.value?.trim() || "";
|
|
21
|
+
}
|
|
22
|
+
// -------- GET VALUE --------
|
|
23
|
+
let actualValue = "";
|
|
24
|
+
switch (attrName.toLowerCase()) {
|
|
25
|
+
case "text":
|
|
26
|
+
actualValue = await element.getText();
|
|
27
|
+
break;
|
|
28
|
+
case "content-desc":
|
|
29
|
+
actualValue = await element.getAttribute("content-desc") || "";
|
|
30
|
+
break;
|
|
31
|
+
case "resource-id":
|
|
32
|
+
actualValue = await element.getAttribute("resource-id") || "";
|
|
33
|
+
break;
|
|
34
|
+
default:
|
|
35
|
+
actualValue =
|
|
36
|
+
(await element.getAttribute(attrName)) ||
|
|
37
|
+
(await element.getText()) ||
|
|
38
|
+
"";
|
|
39
|
+
}
|
|
40
|
+
// -------- PARTIAL MATCH --------
|
|
41
|
+
const isMatched = actualValue
|
|
42
|
+
.toLowerCase()
|
|
43
|
+
.includes(expectedValue.toLowerCase());
|
|
44
|
+
logger.info("Partial attribute verification:", {
|
|
45
|
+
attrName,
|
|
46
|
+
expectedValue,
|
|
47
|
+
actualValue,
|
|
48
|
+
isMatched
|
|
30
49
|
});
|
|
50
|
+
if (!isMatched) {
|
|
51
|
+
throw new Error(`Attribute "${attrName}" does not contain "${expectedValue}". Actual: "${actualValue}"`);
|
|
52
|
+
}
|
|
53
|
+
// -------- APPENDER --------
|
|
54
|
+
args.scriptDataAppender.add(async () => ({
|
|
55
|
+
nlpName: "MOB_VerifyPartialAttributeValue",
|
|
56
|
+
stepInputs: [attrName, expectedValue, false],
|
|
57
|
+
elementsData: [{
|
|
58
|
+
name: args.elementName,
|
|
59
|
+
type: args.elementType,
|
|
60
|
+
locators: [{ xpath: args.selector }],
|
|
61
|
+
platform: args.platform
|
|
62
|
+
}]
|
|
63
|
+
}));
|
|
31
64
|
}
|
|
32
65
|
catch (error) {
|
|
33
66
|
args.scriptDataAppender.setErrorNLP("MOB_VerifyPartialAttributeValue");
|
|
34
|
-
throw new Error(`VerifyPartialAttributeValue action failed
|
|
67
|
+
throw new Error(`VerifyPartialAttributeValue action failed`, { cause: error });
|
|
35
68
|
}
|
|
36
69
|
break;
|
|
70
|
+
// ================= WEB =================
|
|
37
71
|
case "web":
|
|
38
72
|
default:
|
|
39
73
|
try {
|
|
40
74
|
const element = await args.driver.$(args.selector);
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
75
|
+
if (!element) {
|
|
76
|
+
throw new Error("Element not found");
|
|
77
|
+
}
|
|
78
|
+
// -------- SAFE PARSING --------
|
|
79
|
+
let attrName = "text";
|
|
80
|
+
let expectedValue = "";
|
|
81
|
+
if (args.value && args.value.includes(",")) {
|
|
82
|
+
const parts = args.value.split(",");
|
|
83
|
+
attrName = parts[0]?.trim() || "text";
|
|
84
|
+
expectedValue = parts[1]?.trim() || "";
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
expectedValue = args.value?.trim() || "";
|
|
88
|
+
}
|
|
89
|
+
// -------- GET VALUE --------
|
|
90
|
+
let actualValue = "";
|
|
91
|
+
if (attrName === "text") {
|
|
92
|
+
actualValue = await element.getText();
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
actualValue =
|
|
96
|
+
(await element.getAttribute(attrName)) ||
|
|
97
|
+
(await element.getText()) ||
|
|
98
|
+
"";
|
|
99
|
+
}
|
|
100
|
+
// -------- PARTIAL MATCH --------
|
|
101
|
+
const isMatched = actualValue
|
|
102
|
+
.toLowerCase()
|
|
103
|
+
.includes(expectedValue.toLowerCase());
|
|
104
|
+
logger.info("Partial attribute verification:", {
|
|
105
|
+
attrName,
|
|
106
|
+
expectedValue,
|
|
107
|
+
actualValue,
|
|
108
|
+
isMatched
|
|
109
|
+
});
|
|
110
|
+
if (!isMatched) {
|
|
111
|
+
throw new Error(`Attribute "${attrName}" does not contain "${expectedValue}". Actual: "${actualValue}"`);
|
|
52
112
|
}
|
|
113
|
+
// -------- APPENDER --------
|
|
53
114
|
args.scriptDataAppender.add(async () => {
|
|
54
115
|
const ffElement = await args.elementGetter.getFireFlinkElement(args.pageDOM, `[ff-inspect="${args.fireflinkIndex}"]`);
|
|
55
116
|
return {
|
|
56
|
-
nlpName:
|
|
57
|
-
stepInputs: [attrName, expectedValue,
|
|
117
|
+
nlpName: "VerifyPartialAttributeValue",
|
|
118
|
+
stepInputs: [attrName, expectedValue, false],
|
|
58
119
|
elementsData: [{
|
|
59
120
|
name: args.elementName,
|
|
60
121
|
type: args.elementType,
|
|
@@ -66,7 +127,7 @@ export async function verifyPartialAttributeValue(args) {
|
|
|
66
127
|
}
|
|
67
128
|
catch (error) {
|
|
68
129
|
args.scriptDataAppender.setErrorNLP("VerifyPartialAttributeValue");
|
|
69
|
-
throw new Error(`VerifyPartialAttributeValue action failed
|
|
130
|
+
throw new Error(`VerifyPartialAttributeValue action failed`, { cause: error });
|
|
70
131
|
}
|
|
71
132
|
break;
|
|
72
133
|
}
|
|
@@ -6,7 +6,7 @@ export async function verifyPartialText(args) {
|
|
|
6
6
|
const element = await args.driver.$(args.selector);
|
|
7
7
|
const actual = await element.getAttribute("text");
|
|
8
8
|
const expected = args.value;
|
|
9
|
-
if (actual
|
|
9
|
+
if (!actual?.includes(expected)) {
|
|
10
10
|
throw new Error(`Element does not contain the expected text. Expected to contain: "${args.value}", Actual: "${actual}"`);
|
|
11
11
|
}
|
|
12
12
|
const caseSensitive = false;
|
|
@@ -7,8 +7,11 @@ export async function verifyText(args) {
|
|
|
7
7
|
const text = (await element.getAttribute("text")) || "";
|
|
8
8
|
const contentDesc = (await element.getAttribute("content-desc")) || "";
|
|
9
9
|
const expected = (args.value || "").toLowerCase();
|
|
10
|
-
const isMatched = text.toLowerCase() === expected ||
|
|
11
|
-
contentDesc.toLowerCase() === expected;
|
|
10
|
+
const isMatched = text.toLowerCase().trim() === expected.trim() ||
|
|
11
|
+
contentDesc.toLowerCase().trim() === expected.trim();
|
|
12
|
+
logger.info("text", { text });
|
|
13
|
+
logger.info("contentDesc", { contentDesc });
|
|
14
|
+
logger.info("expected", { expected });
|
|
12
15
|
logger.info("result of verify text:", { isMatched });
|
|
13
16
|
const caseSensitive = false; // Assuming case-insensitive for logging
|
|
14
17
|
if (isMatched === false) {
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export const MOB_WaitTillAllElementsAreInvisible = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const elements = await args.driver.$$("*");
|
|
4
|
+
for (const element of elements) {
|
|
5
|
+
try {
|
|
6
|
+
await element.waitForDisplayed({ reverse: true, timeout: 5000 });
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
// ignore if element cannot be waited on
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
args.scriptDataAppender.add(async () => {
|
|
14
|
+
return {
|
|
15
|
+
nlpName: "MOB_WaitTillAllElementsAreInvisible",
|
|
16
|
+
stepInputs: [],
|
|
17
|
+
elementsData: []
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
args.scriptDataAppender.setErrorNLP("MOB_WaitTillAllElementsAreInvisible");
|
|
23
|
+
throw new Error("MOB_WaitTillAllElementsAreInvisible action failed", { cause: error });
|
|
24
|
+
}
|
|
25
|
+
};
|
package/dist/automation/actions/interaction/wait/MOB_WaitTillAttributeOfElementContainsString.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export const MOB_WaitTillAttributeOfElementContainsString = async (args) => {
|
|
2
|
+
try {
|
|
3
|
+
const attributeName = args.attributeName || "text";
|
|
4
|
+
const expectedValue = args.value;
|
|
5
|
+
const element = await args.driver.$(args.selector);
|
|
6
|
+
await args.driver.waitUntil(async () => {
|
|
7
|
+
const attrValue = await element.getAttribute(attributeName);
|
|
8
|
+
return attrValue && attrValue.includes(expectedValue);
|
|
9
|
+
}, { timeout: 5000 });
|
|
10
|
+
args.scriptDataAppender.add(async () => {
|
|
11
|
+
return {
|
|
12
|
+
nlpName: "MOB_WaitTillAttributeOfElementContainsString",
|
|
13
|
+
stepInputs: [attributeName, expectedValue],
|
|
14
|
+
elementsData: [{
|
|
15
|
+
name: args.elementName,
|
|
16
|
+
type: args.elementType,
|
|
17
|
+
locators: [{ xpath: args.selector }],
|
|
18
|
+
platform: args.platform
|
|
19
|
+
}]
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
args.scriptDataAppender.setErrorNLP("MOB_WaitTillAttributeOfElementContainsString");
|
|
25
|
+
throw new Error("MOB_WaitTillAttributeOfElementContainsString action failed", { cause: error });
|
|
26
|
+
}
|
|
27
|
+
};
|