ff-automationv2 2.2.30 → 2.2.32-beta.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.
- package/dist/ai/llmprompts/llmPromptTypes/systemPromptTypes.d.ts +3 -0
- package/dist/ai/llmprompts/promptRegistry.js +10 -2
- package/dist/ai/llmprompts/systemPrompts/actionExtractorPrompt.js +83 -27
- package/dist/ai/llmprompts/systemPrompts/fileVerifyActionExtractorPrompt.d.ts +2 -0
- package/dist/ai/llmprompts/systemPrompts/fileVerifyActionExtractorPrompt.js +35 -0
- package/dist/ai/llmprompts/systemPrompts/fireflinkElementIndexExtactors.js +35 -0
- package/dist/ai/llmprompts/systemPrompts/fireflinkElementIndexExtractor_Mob.js +5 -2
- package/dist/ai/llmprompts/systemPrompts/getActionExtractorPrompt.js +4 -2
- package/dist/ai/llmprompts/systemPrompts/getActionExtractorPromptMob.js +3 -1
- package/dist/ai/llmprompts/systemPrompts/inputContextPrompt.d.ts +2 -0
- package/dist/ai/llmprompts/systemPrompts/inputContextPrompt.js +54 -0
- package/dist/ai/llmprompts/systemPrompts/mobileKeywordExtractor.js +53 -8
- package/dist/ai/llmprompts/systemPrompts/verifyActionExtractorPrompt.js +5 -4
- package/dist/ai/llmprompts/systemPrompts/verifyActionExtractorPromptMob.js +1 -1
- package/dist/ai/llmprompts/userPrompts/userPrompt.js +2 -0
- package/dist/automation/actions/executor.d.ts +14 -6
- package/dist/automation/actions/executor.js +968 -251
- package/dist/automation/actions/interaction/alert/enterDataToAlert.js +3 -1
- package/dist/automation/actions/interaction/alert/getTextPresentOnAlertPopup.js +4 -0
- package/dist/automation/actions/interaction/alert/verifyAlertPopUpMessageContainsString.js +1 -1
- package/dist/automation/actions/interaction/alert/verifyAlertPopupIsDisplayed.js +1 -1
- package/dist/automation/actions/interaction/alert/verifyTextPresentOnAlertPopup.js +1 -1
- package/dist/automation/actions/interaction/clear/clearAndEnter.js +6 -3
- package/dist/automation/actions/interaction/elementlessActions/getOtp.js +25 -24
- package/dist/automation/actions/interaction/enterActions/EnterInputIntoElementFromClipBoardInterface_mob.js +3 -1
- package/dist/automation/actions/interaction/enterActions/enterInput.js +5 -2
- package/dist/automation/actions/interaction/enterActions/enterInputAndPress.js +5 -2
- package/dist/automation/actions/interaction/enterActions/enterUrl.js +5 -2
- package/dist/automation/actions/interaction/enterActions/enterusingJs.js +3 -1
- package/dist/automation/actions/interaction/enterActions/waitAndEnter.js +5 -2
- package/dist/automation/actions/interaction/files/VerifyPDF.d.ts +2 -0
- package/dist/automation/actions/interaction/files/VerifyPDF.js +171 -0
- package/dist/automation/actions/interaction/get/MOB_GetADBLogsForGivenAppPackage.js +4 -1
- package/dist/automation/actions/interaction/get/MOB_GetAllContexts.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetAllWindowHandles.d.ts +1 -1
- package/dist/automation/actions/interaction/get/MOB_GetAllWindowHandles.js +10 -6
- package/dist/automation/actions/interaction/get/MOB_GetAltitude.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetBatteryPercentage.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetBatteryStatus.d.ts +1 -1
- package/dist/automation/actions/interaction/get/MOB_GetBatteryStatus.js +7 -3
- package/dist/automation/actions/interaction/get/MOB_GetClipBoardText.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetCurrentActivity.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetCurrentAppPackage.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetCurrentContext.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceDate.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceSettings.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceStatus.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceSystemBars.js +5 -2
- package/dist/automation/actions/interaction/get/MOB_GetCurrentDeviceTime.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetCurrentOrientation.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetCurrentSessionId.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetDeviceLocation.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetDeviceName.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetDeviceOsVersion.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetDeviceUdid.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetHeightOfElement.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetHeightOfScreen.js +4 -0
- package/dist/automation/actions/interaction/get/MOB_GetHourFromCurrentDeviceTime.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetLatitude.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetLongitude.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetMinuteFromCurrentDeviceTime.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetSecondFromCurrentDeviceTime.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetSizeOfScreen.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetSupportedPerformanceDataTypes.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetTextFromElementAndSetToClipBoard.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetWidthOfElement.js +5 -1
- package/dist/automation/actions/interaction/get/MOB_GetWidthOfScreen.js +5 -1
- package/dist/automation/actions/interaction/get/browserWindowGetPosition.js +5 -0
- package/dist/automation/actions/interaction/get/getAllBrokenImages.js +9 -0
- package/dist/automation/actions/interaction/get/getAllBrokenLinkCount.js +9 -0
- package/dist/automation/actions/interaction/get/getAllBrokenLinks.js +10 -1
- package/dist/automation/actions/interaction/get/getAllConsoleErrors.js +11 -0
- package/dist/automation/actions/interaction/get/getAllConsoleInformation.js +12 -1
- package/dist/automation/actions/interaction/get/getAllConsoleLogs.js +11 -1
- package/dist/automation/actions/interaction/get/getAllConsoleWarnings.js +12 -1
- package/dist/automation/actions/interaction/get/getAllCookieNames.js +6 -1
- package/dist/automation/actions/interaction/get/getAllCookieValues.js +6 -1
- package/dist/automation/actions/interaction/get/getAllSelectedOptions.js +8 -1
- package/dist/automation/actions/interaction/get/getAllTheOptionsFromListBoxAsText.js +4 -1
- package/dist/automation/actions/interaction/get/getAllTheOptionsFromListBoxAsTextInSortedOrder.js +4 -1
- package/dist/automation/actions/interaction/get/getAllTheSelectedOptionsFromListBoxAsText.js +4 -1
- package/dist/automation/actions/interaction/get/getAllWindowHandles.js +5 -1
- package/dist/automation/actions/interaction/get/getAttribute.js +19 -14
- package/dist/automation/actions/interaction/get/getAudioCurrentPlaybackRate.js +4 -1
- package/dist/automation/actions/interaction/get/getAudioCurrentSeekTime.js +4 -1
- package/dist/automation/actions/interaction/get/getAudioCurrentVolume.js +4 -1
- package/dist/automation/actions/interaction/get/getAudioDecodedByte.js +4 -1
- package/dist/automation/actions/interaction/get/getAudioDefaultPlaybackRate.js +4 -1
- package/dist/automation/actions/interaction/get/getAudioMediaLength.js +4 -1
- package/dist/automation/actions/interaction/get/getAudioMediaSource.js +4 -1
- package/dist/automation/actions/interaction/get/getBestPracticesScore.js +11 -3
- package/dist/automation/actions/interaction/get/getBrowserCount.js +5 -0
- package/dist/automation/actions/interaction/get/getBrowserVersion.js +5 -0
- package/dist/automation/actions/interaction/get/getCapabilityNames.js +5 -0
- package/dist/automation/actions/interaction/get/getClipBoardText.js +13 -0
- package/dist/automation/actions/interaction/get/getCollectiveApiResponseTime.js +4 -1
- package/dist/automation/actions/interaction/get/getCollectiveApiStatusCode.js +4 -1
- package/dist/automation/actions/interaction/get/getCssValue.js +5 -1
- package/dist/automation/actions/interaction/get/getCurrentDayOfTheWeek.js +4 -0
- package/dist/automation/actions/interaction/get/getCurrentSecondsFromCurrentSystemTime.js +5 -1
- package/dist/automation/actions/interaction/get/getCurrentSystemDate.js +4 -0
- package/dist/automation/actions/interaction/get/getCurrentSystemDay.js +5 -1
- package/dist/automation/actions/interaction/get/getCurrentSystemMonth.js +5 -1
- package/dist/automation/actions/interaction/get/getCurrentSystemTime.js +5 -1
- package/dist/automation/actions/interaction/get/getCurrentSystemYear.js +5 -1
- package/dist/automation/actions/interaction/get/getCurrentWindowHandle.js +13 -26
- package/dist/automation/actions/interaction/get/getDataFromApiRequestHeaderForJsonPath.js +5 -4
- package/dist/automation/actions/interaction/get/getDataFromApiResponseForJsonPath.js +5 -4
- package/dist/automation/actions/interaction/get/getDateWithGivenFormat.js +13 -16
- package/dist/automation/actions/interaction/get/getDriverInstance.js +13 -28
- package/dist/automation/actions/interaction/get/getFirstContentfulPaint.js +8 -1
- package/dist/automation/actions/interaction/get/getFirstSelectedOption.js +5 -1
- package/dist/automation/actions/interaction/get/getFullPaintTime.js +8 -1
- package/dist/automation/actions/interaction/get/getHTMLCodeOfPage.js +4 -0
- package/dist/automation/actions/interaction/get/getHeightOfBrowserWindow.js +5 -0
- package/dist/automation/actions/interaction/get/getHeightOfWebElement.js +4 -1
- package/dist/automation/actions/interaction/get/getHourFromCurrentSystemTime.js +4 -0
- package/dist/automation/actions/interaction/get/getImplicitTimeOut.js +15 -28
- package/dist/automation/actions/interaction/get/getLargestContentfulPaint.js +7 -0
- package/dist/automation/actions/interaction/get/getListBoxSize.d.ts +1 -1
- package/dist/automation/actions/interaction/get/getListBoxSize.js +4 -2
- package/dist/automation/actions/interaction/get/getListOfElementsFromLocatorTypeLocatorValue.js +7 -2
- package/dist/automation/actions/interaction/get/getLocation.js +14 -8
- package/dist/automation/actions/interaction/get/getMinuteFromCurrentSystemTime.js +4 -0
- package/dist/automation/actions/interaction/get/getNetworkRouteTime.js +7 -0
- package/dist/automation/actions/interaction/get/getNumberOfBrokenImages.js +7 -0
- package/dist/automation/actions/interaction/get/getNumberOfLinksPresentInCurrentPage.js +5 -0
- package/dist/automation/actions/interaction/get/getNumberOfWorkingLinksFromCurrentPage.js +9 -0
- package/dist/automation/actions/interaction/get/getOptions.js +4 -1
- package/dist/automation/actions/interaction/get/getPageTitle.js +5 -1
- package/dist/automation/actions/interaction/get/getPerformanceMetrics.js +12 -1
- package/dist/automation/actions/interaction/get/getPwaScore.js +11 -3
- package/dist/automation/actions/interaction/get/getRect.js +9 -2
- package/dist/automation/actions/interaction/get/getScreenshot.js +13 -28
- package/dist/automation/actions/interaction/get/getScreenshotAs.js +14 -44
- package/dist/automation/actions/interaction/get/getSeoScore.js +15 -3
- package/dist/automation/actions/interaction/get/getSingleApiRequestPayload.js +5 -3
- package/dist/automation/actions/interaction/get/getSingleApiResponse.js +9 -8
- package/dist/automation/actions/interaction/get/getSingleApiResponseTime.js +9 -9
- package/dist/automation/actions/interaction/get/getSingleApiStatusCode.d.ts +1 -1
- package/dist/automation/actions/interaction/get/getSingleApiStatusCode.js +10 -17
- package/dist/automation/actions/interaction/get/getSize.js +7 -2
- package/dist/automation/actions/interaction/get/getSizeOfBrowserWindow.js +5 -4
- package/dist/automation/actions/interaction/get/getStringDataFromLocalFile.js +10 -7
- package/dist/automation/actions/interaction/get/getSystemProperty.js +6 -4
- package/dist/automation/actions/interaction/get/getTagName.js +9 -2
- package/dist/automation/actions/interaction/get/getText.js +7 -2
- package/dist/automation/actions/interaction/get/getTheFirstSelectedOptionFromListBoxAsText.js +5 -1
- package/dist/automation/actions/interaction/get/getTotalNumberOfCookies.js +6 -1
- package/dist/automation/actions/interaction/get/getTunnelIdentifier.js +5 -8
- package/dist/automation/actions/interaction/get/getURLPresentInAddressBar.js +5 -1
- package/dist/automation/actions/interaction/get/getUserHomeDirectory.js +9 -1
- package/dist/automation/actions/interaction/get/getValueByCookieName.js +7 -4
- package/dist/automation/actions/interaction/get/getValueFromLocalStorage.js +6 -4
- package/dist/automation/actions/interaction/get/getValueOfSystemVariable.js +6 -4
- package/dist/automation/actions/interaction/get/getVideoCurrentPlaybackRate.js +4 -1
- package/dist/automation/actions/interaction/get/getVideoCurrentSeekTime.js +4 -1
- package/dist/automation/actions/interaction/get/getVideoCurrentVolume.js +4 -1
- package/dist/automation/actions/interaction/get/getVideoDecodedByte.js +4 -1
- package/dist/automation/actions/interaction/get/getVideoDefaultPlaybackRate.js +4 -1
- package/dist/automation/actions/interaction/get/getVideoMediaLength.js +4 -1
- package/dist/automation/actions/interaction/get/getVideoMediaSource.js +5 -1
- package/dist/automation/actions/interaction/get/getWidthOfBrowser.js +6 -1
- package/dist/automation/actions/interaction/get/getWidthOfWebElement.js +4 -1
- package/dist/automation/actions/interaction/get/getWorkingLinksFromCurrentPage.js +10 -1
- package/dist/automation/actions/interaction/get/getWrappedElement.js +5 -1
- package/dist/automation/actions/interaction/get/getWrappedOptionFromListBoxAsText.d.ts +1 -1
- package/dist/automation/actions/interaction/get/getWrappedOptionFromListBoxAsText.js +4 -2
- package/dist/automation/actions/interaction/get/getXLocationOfBrowserWindow.js +4 -3
- package/dist/automation/actions/interaction/get/getXLocationOfWebElement.js +7 -2
- package/dist/automation/actions/interaction/get/getYLocationOfBrowserWindow.js +6 -1
- package/dist/automation/actions/interaction/get/getYLocationOfWebElement.js +7 -2
- package/dist/automation/actions/interaction/shadowDom/shadowDomEnter.js +2 -0
- package/dist/automation/actions/interaction/shadowDom/shadowDomGetText.js +5 -2
- package/dist/automation/actions/interaction/verify/MOB_VerifyBatteryLevel.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyAttributeValue.js +2 -2
- package/dist/automation/actions/interaction/verify/VerifyBrowserHtmlCodeContainsString.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyBrowserWindowHeight.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyBrowserWindowTitleContainsString.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyBrowserWindowTitleIsString.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyBrowserWindowUrlContainsExpectedUrl.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyBrowserWindowUrlIsString.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyBrowserWindowWidth.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyBrowserWindowXLocation.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyBrowserWindowYLocation.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyCssAttributeValue.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyElementNotContainsText.js +2 -2
- package/dist/automation/actions/interaction/verify/VerifyHeightOfWebElement.js +2 -2
- package/dist/automation/actions/interaction/verify/VerifyHexCodeForGivenXYCoordinates.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfAllCookiesAreDeleted.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfCookieNameIsAdded.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfCookieNameIsDeleted.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfCookieObjectIsPresent.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfGivenOptionIsDuplicate.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfImageIsBroken.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfLinkIsBroken.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfLinkIsWorking.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfLinksAreBroken.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfLinksAreWorking.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfOptionWithTextIsDeselected.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfOptionWithValueIsDeselected.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfOptionWithValueIsSelected.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfOptionWithVisibleTextIsSelected.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyIfSpecifiedOptionIsSelected.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyNavigateURL.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyPartialAttributeValue.js +2 -2
- package/dist/automation/actions/interaction/verify/VerifyPartialTitleOfCurrentPage.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyTagName.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyThatSpecifiedOptionIsNotSelected.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyTitleInAllPage.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyTitleOfCurrentPage.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyValueOfElementContainsString.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyValueOfElementIsString.js +1 -1
- package/dist/automation/actions/interaction/verify/VerifyWidthOfElement.js +2 -2
- package/dist/automation/actions/interaction/verify/VerifyXLocationOfElement.js +2 -2
- package/dist/automation/actions/interaction/verify/VerifyYLocationOfElement.js +2 -2
- package/dist/automation/actions/interaction/verify/checkIfElementIsDisplayed.js +2 -2
- package/dist/automation/actions/interaction/verify/verifypartialtext.js +2 -2
- package/dist/automation/actions/interaction/verify/verifytext.js +2 -2
- package/dist/automation/actions/interface/FireFlinkResponseSchema.d.ts +22 -1
- package/dist/automation/actions/interface/FireFlinkResponseSchema.js +18 -4
- package/dist/automation/actions/interface/alertActionInterface.d.ts +11 -0
- package/dist/automation/actions/interface/clearActionInterface.d.ts +4 -0
- package/dist/automation/actions/interface/getActionInterface.d.ts +150 -141
- package/dist/automation/actions/interface/getOtpInterface.d.ts +5 -0
- package/dist/automation/actions/interface/interactionActionInterface.d.ts +14 -7
- package/dist/automation/actions/interface/shadowDomInterface.d.ts +10 -0
- package/dist/automation/actions/interface/verifyActionInterface.d.ts +100 -0
- package/dist/core/Errors/InvalidFileTypeError.d.ts +5 -0
- package/dist/core/Errors/InvalidFileTypeError.js +14 -0
- package/dist/core/constants/supportedActions.js +4 -0
- package/dist/core/helpers/elementSelectorResolver.d.ts +11 -0
- package/dist/core/helpers/elementSelectorResolver.js +102 -0
- package/dist/core/helpers/runnerDomPipeline.d.ts +9 -0
- package/dist/core/helpers/runnerDomPipeline.js +97 -0
- package/dist/core/helpers/runnerKafkaReporter.d.ts +17 -0
- package/dist/core/helpers/runnerKafkaReporter.js +71 -0
- package/dist/core/helpers/runnerPostActionHelper.d.ts +2 -0
- package/dist/core/helpers/runnerPostActionHelper.js +30 -0
- package/dist/core/helpers/stepActionInspector.d.ts +5 -0
- package/dist/core/helpers/stepActionInspector.js +113 -0
- package/dist/core/helpers/visionFallbackHandler.d.ts +3 -0
- package/dist/core/helpers/visionFallbackHandler.js +138 -0
- package/dist/core/interfaces/actionInterface.d.ts +7 -5
- package/dist/core/interfaces/automationRunnerInterface.d.ts +56 -1
- package/dist/core/interfaces/fireflinkScriptPayloadInterface.d.ts +2 -0
- package/dist/core/interfaces/llmResponseInterface.d.ts +5 -0
- package/dist/core/interfaces/promptInterface.d.ts +9 -2
- package/dist/core/interfaces/scriptGenrationDataInterface.d.ts +4 -0
- package/dist/core/main/actionHandlerFactory.js +37 -7
- package/dist/core/main/executionContext.d.ts +2 -1
- package/dist/core/main/executionContext.js +7 -5
- package/dist/core/main/runAutomationScript.d.ts +1 -0
- package/dist/core/main/runAutomationScript.js +390 -1008
- package/dist/core/types/llmResponseType.d.ts +2 -2
- package/dist/core/types/promptType.d.ts +3 -1
- package/dist/core/types/promptType.js +2 -0
- package/dist/fireflinkData/fireflinkScript/appendScriptData.js +3 -0
- package/dist/utils/browserCap/capability.js +17 -0
- package/dist/utils/helpers/getHelper.d.ts +8 -0
- package/dist/utils/helpers/getHelper.js +115 -0
- package/dist/utils/helpers/platformSyntax.d.ts +1 -1
- package/package.json +2 -1
- package/dist/ai/llmprompts/systemPrompts/combinedActionExtractorPrompt.d.ts +0 -2
- package/dist/ai/llmprompts/systemPrompts/combinedActionExtractorPrompt.js +0 -36
|
@@ -28,6 +28,7 @@ exports.ELEMENTLESS_ACTION = [
|
|
|
28
28
|
"SwitchToParentWindow",
|
|
29
29
|
"SwitchToWindowIfTitleContainsString",
|
|
30
30
|
"SwitchToNewWindowIfUrlContainsString",
|
|
31
|
+
"ScrollPageToSpecificLocation",
|
|
31
32
|
"GetPageTitle",
|
|
32
33
|
"GetBrowserVersion",
|
|
33
34
|
"GetAllWindowHandles",
|
|
@@ -68,6 +69,9 @@ exports.ELEMENTLESS_ACTION = [
|
|
|
68
69
|
"GetNetworkRouteTime",
|
|
69
70
|
"GetPerformanceMetrics",
|
|
70
71
|
"GetUserHomeDirectory",
|
|
72
|
+
"ConcatString",
|
|
73
|
+
"GetLastModifiedFile",
|
|
74
|
+
"VerifyPDF",
|
|
71
75
|
"MOB_GetCurrentWindowHandle",
|
|
72
76
|
"MOB_GetDriverInstance",
|
|
73
77
|
"MOB_GetADBLogsForGivenAppPackage",
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { platform as PlatformType } from "../types/scriptTypesType.js";
|
|
2
|
+
import { ShadowIframeResult } from "../interfaces/automationRunnerInterface.js";
|
|
3
|
+
export { ShadowIframeResult };
|
|
4
|
+
export declare function generateUniqueName(currentName: string | undefined, usedNames: string[]): string | undefined;
|
|
5
|
+
export declare function normalizeSvgSelector(selector: string): string;
|
|
6
|
+
export declare function resolveElementSelector(doc: any, domInfo: any, fireflinkIndex: string, platform: PlatformType, driver: any): Promise<{
|
|
7
|
+
selector: string;
|
|
8
|
+
doc: any;
|
|
9
|
+
domInfo: any;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function handleShadowAndIframe(driver: any, stepAction: string, selector: string, fireflinkIndex: string, domInfo: any, actionHandlers: Record<string, any>, elementName: string, elementType: string): Promise<ShadowIframeResult>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateUniqueName = generateUniqueName;
|
|
4
|
+
exports.normalizeSvgSelector = normalizeSvgSelector;
|
|
5
|
+
exports.resolveElementSelector = resolveElementSelector;
|
|
6
|
+
exports.handleShadowAndIframe = handleShadowAndIframe;
|
|
7
|
+
const xpathcreation_js_1 = require("../../utils/helpers/xpathcreation.js");
|
|
8
|
+
const jsForAttributeInjection_js_1 = require("../../utils/DomExtraction/jsForAttributeInjection.js");
|
|
9
|
+
const jsFindElement_js_1 = require("../../utils/javascript/jsFindElement.js");
|
|
10
|
+
const runnerDomPipeline_js_1 = require("./runnerDomPipeline.js");
|
|
11
|
+
const logData_js_1 = require("../../utils/logger/logData.js");
|
|
12
|
+
function generateUniqueName(currentName, usedNames) {
|
|
13
|
+
if (!currentName) {
|
|
14
|
+
return currentName;
|
|
15
|
+
}
|
|
16
|
+
const baseName = currentName;
|
|
17
|
+
let newName = baseName;
|
|
18
|
+
let count = 0;
|
|
19
|
+
while (usedNames.includes(newName)) {
|
|
20
|
+
count++;
|
|
21
|
+
newName = `${baseName}_${count}`;
|
|
22
|
+
}
|
|
23
|
+
usedNames.push(newName);
|
|
24
|
+
return newName;
|
|
25
|
+
}
|
|
26
|
+
function normalizeSvgSelector(selector) {
|
|
27
|
+
if (selector.includes("svg")) {
|
|
28
|
+
const match = /svg\[(\d+)\]/.exec(selector);
|
|
29
|
+
const svgIndex = match ? match[1] : "1";
|
|
30
|
+
return selector.replace(/svg\[\d+\]/, `*[name()='svg'][${svgIndex}]`);
|
|
31
|
+
}
|
|
32
|
+
return selector;
|
|
33
|
+
}
|
|
34
|
+
async function resolveElementSelector(doc, domInfo, fireflinkIndex, platform, driver) {
|
|
35
|
+
let selector;
|
|
36
|
+
let updatedDoc = doc;
|
|
37
|
+
let updatedDomInfo = domInfo;
|
|
38
|
+
if (platform === "web") {
|
|
39
|
+
if (!updatedDoc) {
|
|
40
|
+
logData_js_1.logger.info("doc is undefined. Rebuilding document from domInfo.");
|
|
41
|
+
if (!updatedDomInfo || !updatedDomInfo.dom) {
|
|
42
|
+
updatedDomInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOM)(driver);
|
|
43
|
+
}
|
|
44
|
+
updatedDoc = runnerDomPipeline_js_1.RunnerDomPipeline.parseDomDocument(updatedDomInfo.dom, "web");
|
|
45
|
+
}
|
|
46
|
+
const ele = updatedDoc.querySelector(`[ff-inspect="${fireflinkIndex}"]`);
|
|
47
|
+
if (ele) {
|
|
48
|
+
selector = ele.getAttribute("ff-xpath") || "";
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const result = (0, xpathcreation_js_1.getWebXPathByFFIndex)(updatedDomInfo.dom, fireflinkIndex);
|
|
52
|
+
selector = result.xpathPath;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const result = await (0, xpathcreation_js_1.getFFIndexAndXPath)(updatedDomInfo.dom, fireflinkIndex);
|
|
57
|
+
selector = result.xpathPath;
|
|
58
|
+
}
|
|
59
|
+
selector = normalizeSvgSelector(selector);
|
|
60
|
+
return { selector, doc: updatedDoc, domInfo: updatedDomInfo };
|
|
61
|
+
}
|
|
62
|
+
async function handleShadowAndIframe(driver, stepAction, selector, fireflinkIndex, domInfo, actionHandlers, elementName, elementType) {
|
|
63
|
+
let updatedStepAction = stepAction;
|
|
64
|
+
let updatedSelector = selector;
|
|
65
|
+
let iframeDomHtml = null;
|
|
66
|
+
if (updatedSelector.includes("shadow")) {
|
|
67
|
+
updatedStepAction = updatedStepAction + "_shadow";
|
|
68
|
+
logData_js_1.logger.info(updatedStepAction);
|
|
69
|
+
}
|
|
70
|
+
else if (updatedSelector.includes("iframe")) {
|
|
71
|
+
const defaultHandler = actionHandlers["switchToDefaultContent"];
|
|
72
|
+
await defaultHandler({ driver });
|
|
73
|
+
const result_if = await driver.executeAsyncScript(jsFindElement_js_1.Find_element_by_ff_js_script, [fireflinkIndex]);
|
|
74
|
+
if (!result_if?.success) {
|
|
75
|
+
logData_js_1.logger.info("Not found");
|
|
76
|
+
return {
|
|
77
|
+
stepAction: updatedStepAction,
|
|
78
|
+
selector: updatedSelector,
|
|
79
|
+
iframeDomHtml: null,
|
|
80
|
+
handled: false,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const { xpath_if, frames, iframe_dom_html } = result_if;
|
|
84
|
+
updatedSelector = xpath_if;
|
|
85
|
+
iframeDomHtml = iframe_dom_html;
|
|
86
|
+
const frameHandler = actionHandlers["switchToFrame"];
|
|
87
|
+
await frameHandler({
|
|
88
|
+
selector: updatedSelector,
|
|
89
|
+
frames: frames,
|
|
90
|
+
elementName,
|
|
91
|
+
elementType,
|
|
92
|
+
pageDOM: domInfo.dom,
|
|
93
|
+
fireflinkIndex,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
stepAction: updatedStepAction,
|
|
98
|
+
selector: updatedSelector,
|
|
99
|
+
iframeDomHtml,
|
|
100
|
+
handled: true,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DomProcessingEngine } from "../../domAnalysis/getRelaventElements.js";
|
|
2
|
+
import { platform as PlatformType } from "../types/scriptTypesType.js";
|
|
3
|
+
import { DomCaptureResult, DomProcessResult } from "../interfaces/automationRunnerInterface.js";
|
|
4
|
+
export { DomCaptureResult, DomProcessResult };
|
|
5
|
+
export declare class RunnerDomPipeline {
|
|
6
|
+
static parseDomDocument(domHtml: string, platform: PlatformType): any;
|
|
7
|
+
static captureAndParseDom(driver: any, platform: PlatformType, stepCount: number, action: string, isRetry?: boolean): Promise<DomCaptureResult>;
|
|
8
|
+
static processRelevantDom(domProcessor: DomProcessingEngine, domInfo: any, keywords: any, stepCount: number, action: string, currentStep: string, platform: PlatformType, driver: any, isRetry?: boolean): Promise<DomProcessResult>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunnerDomPipeline = void 0;
|
|
4
|
+
const jsdom_1 = require("jsdom");
|
|
5
|
+
const toon_1 = require("@toon-format/toon");
|
|
6
|
+
const jsForAttributeInjection_js_1 = require("../../utils/DomExtraction/jsForAttributeInjection.js");
|
|
7
|
+
const domSanitizer_js_1 = require("../../utils/helpers/domSanitizer.js");
|
|
8
|
+
const logData_js_1 = require("../../utils/logger/logData.js");
|
|
9
|
+
class RunnerDomPipeline {
|
|
10
|
+
static parseDomDocument(domHtml, platform) {
|
|
11
|
+
if (platform === "web") {
|
|
12
|
+
const parser = new jsdom_1.JSDOM((0, domSanitizer_js_1.sanitizeWebDom)(domHtml));
|
|
13
|
+
return parser.window.document;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
const parser = new jsdom_1.JSDOM(domHtml, {
|
|
17
|
+
contentType: "text/xml",
|
|
18
|
+
});
|
|
19
|
+
return parser.window.document;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
static async captureAndParseDom(driver, platform, stepCount, action, isRetry = false) {
|
|
23
|
+
try {
|
|
24
|
+
let domInfo;
|
|
25
|
+
let doc;
|
|
26
|
+
if (platform === "web") {
|
|
27
|
+
domInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOM)(driver);
|
|
28
|
+
const fileName = isRetry
|
|
29
|
+
? `annotated-dom-retry-${stepCount}`
|
|
30
|
+
: `annotated-dom-${stepCount}`;
|
|
31
|
+
logData_js_1.logger.saveDOM(domInfo.dom, fileName);
|
|
32
|
+
doc = RunnerDomPipeline.parseDomDocument(domInfo.dom, "web");
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
domInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOMForMobile)(driver);
|
|
36
|
+
const fileName = isRetry
|
|
37
|
+
? `annotated-dom-Mob-retry-${stepCount}`
|
|
38
|
+
: `annotated-dom-Mob-${stepCount}`;
|
|
39
|
+
logData_js_1.logger.saveDOM(domInfo.dom, fileName);
|
|
40
|
+
doc = RunnerDomPipeline.parseDomDocument(domInfo.dom, platform);
|
|
41
|
+
}
|
|
42
|
+
return { domInfo, doc };
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (action === "verify") {
|
|
46
|
+
return { domInfo: null, doc: null };
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
static async processRelevantDom(domProcessor, domInfo, keywords, stepCount, action, currentStep, platform, driver, isRetry = false) {
|
|
52
|
+
try {
|
|
53
|
+
let extractedRelevantDom;
|
|
54
|
+
let toonDom;
|
|
55
|
+
if (platform === "web") {
|
|
56
|
+
extractedRelevantDom = await domProcessor.webProcess({
|
|
57
|
+
keywords: keywords,
|
|
58
|
+
rawDom: domInfo?.dom,
|
|
59
|
+
stepCount: stepCount,
|
|
60
|
+
stepAction: action,
|
|
61
|
+
step: currentStep,
|
|
62
|
+
platform: platform,
|
|
63
|
+
driver: driver,
|
|
64
|
+
});
|
|
65
|
+
toonDom = (0, toon_1.encode)(extractedRelevantDom || []);
|
|
66
|
+
const fileName = isRetry
|
|
67
|
+
? `relevant-dom-toon-retry-${stepCount}`
|
|
68
|
+
: `relevant-dom-toon-${stepCount}`;
|
|
69
|
+
logData_js_1.logger.saveText(toonDom, fileName);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
extractedRelevantDom = await domProcessor.mobileProcess({
|
|
73
|
+
keywords: keywords,
|
|
74
|
+
rawDom: domInfo?.dom,
|
|
75
|
+
stepCount: stepCount,
|
|
76
|
+
stepAction: action,
|
|
77
|
+
step: currentStep,
|
|
78
|
+
platform: platform,
|
|
79
|
+
driver: driver,
|
|
80
|
+
});
|
|
81
|
+
toonDom = (0, toon_1.encode)(extractedRelevantDom || []);
|
|
82
|
+
const fileName = isRetry
|
|
83
|
+
? `relevant-dom-toon-Mob-retry-${stepCount}`
|
|
84
|
+
: `relevant-dom-toon-Mob-${stepCount}`;
|
|
85
|
+
logData_js_1.logger.saveText(toonDom, fileName);
|
|
86
|
+
}
|
|
87
|
+
return { extractedRelevantDom, toonDom };
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (action === "verify") {
|
|
91
|
+
return { extractedRelevantDom: null, toonDom: undefined };
|
|
92
|
+
}
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
exports.RunnerDomPipeline = RunnerDomPipeline;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { fireflinkService } from "../../service/fireflink.service.js";
|
|
2
|
+
import { AutomationRequest } from "../interfaces/executionDetails.js";
|
|
3
|
+
import { IKafkaPayload } from "../interfaces/fireflinkScriptPayloadInterface.js";
|
|
4
|
+
export declare class RunnerKafkaReporter {
|
|
5
|
+
private fireflinkServiceInstance;
|
|
6
|
+
private request;
|
|
7
|
+
constructor(fireflinkServiceInstance: fireflinkService, request: AutomationRequest);
|
|
8
|
+
sendLiveLog(message: any, messageType: string): Promise<void>;
|
|
9
|
+
sendOngoing(message: string): Promise<void>;
|
|
10
|
+
sendRetry(message: string): Promise<void>;
|
|
11
|
+
sendTermination(): Promise<void>;
|
|
12
|
+
sendError(errorDescription?: string): Promise<void>;
|
|
13
|
+
sendExecutionStopped(): Promise<void>;
|
|
14
|
+
sendNextBatch(): Promise<void>;
|
|
15
|
+
sendCompleted(): Promise<void>;
|
|
16
|
+
sendMetadata(kafkaPayload: IKafkaPayload): Promise<void>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunnerKafkaReporter = void 0;
|
|
4
|
+
const messageType_js_1 = require("../types/messageType.js");
|
|
5
|
+
const logData_js_1 = require("../../utils/logger/logData.js");
|
|
6
|
+
class RunnerKafkaReporter {
|
|
7
|
+
constructor(fireflinkServiceInstance, request) {
|
|
8
|
+
this.fireflinkServiceInstance = fireflinkServiceInstance;
|
|
9
|
+
this.request = request;
|
|
10
|
+
}
|
|
11
|
+
async sendLiveLog(message, messageType) {
|
|
12
|
+
await this.fireflinkServiceInstance.produceMessageToKafka(this.request.kafkaMessageKey, {
|
|
13
|
+
topic: this.request.topic,
|
|
14
|
+
message: {
|
|
15
|
+
topic: "",
|
|
16
|
+
service: "",
|
|
17
|
+
chatId: "",
|
|
18
|
+
aiPromptPayload: {
|
|
19
|
+
display: false,
|
|
20
|
+
message: "",
|
|
21
|
+
messageId: "",
|
|
22
|
+
branchId: "",
|
|
23
|
+
userId: this.request.userId,
|
|
24
|
+
scriptId: "",
|
|
25
|
+
scriptType: "",
|
|
26
|
+
type: "logs",
|
|
27
|
+
sessionId: "",
|
|
28
|
+
licenseId: this.request.licenseId,
|
|
29
|
+
projectId: this.request.projectId,
|
|
30
|
+
liveLogs: {
|
|
31
|
+
executionId: this.request.kafkaMessageKey,
|
|
32
|
+
message,
|
|
33
|
+
messageType,
|
|
34
|
+
},
|
|
35
|
+
attachment: [],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async sendOngoing(message) {
|
|
41
|
+
await this.sendLiveLog(message, messageType_js_1.MessageType.LiveLog.Ongoing);
|
|
42
|
+
logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.LiveLog.Ongoing })}`);
|
|
43
|
+
}
|
|
44
|
+
async sendRetry(message) {
|
|
45
|
+
await this.sendLiveLog(message, messageType_js_1.MessageType.LiveLog.retry);
|
|
46
|
+
}
|
|
47
|
+
async sendTermination() {
|
|
48
|
+
logData_js_1.logger.info(`Execution terminated successfully. Script: ${this.request.scriptName}, Test Case ID: ${this.request.testCaseId}`);
|
|
49
|
+
await this.sendLiveLog("Execution terminated by the user", messageType_js_1.MessageType.LiveLog.Termination);
|
|
50
|
+
}
|
|
51
|
+
async sendError(errorDescription) {
|
|
52
|
+
await this.sendLiveLog(errorDescription ?? "errorDescription unknown", messageType_js_1.MessageType.LiveLog.Error);
|
|
53
|
+
logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.LiveLog.Error })}`);
|
|
54
|
+
}
|
|
55
|
+
async sendExecutionStopped() {
|
|
56
|
+
await this.sendLiveLog("Execution stopped", messageType_js_1.MessageType.LiveLog.ExecutionStopped);
|
|
57
|
+
logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.LiveLog.ExecutionStopped })}`);
|
|
58
|
+
}
|
|
59
|
+
async sendNextBatch() {
|
|
60
|
+
await this.sendLiveLog("Invoke the generate_script_from_scenario tool with the remaining test steps to continue the automation execution from where it left off.", messageType_js_1.MessageType.nextBatch);
|
|
61
|
+
logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.nextBatch })}`);
|
|
62
|
+
}
|
|
63
|
+
async sendCompleted() {
|
|
64
|
+
await this.sendLiveLog("Execution completed", messageType_js_1.MessageType.LiveLog.Completed);
|
|
65
|
+
logData_js_1.logger.info(`Message produced to Kafka topic - ${JSON.stringify({ messageType: messageType_js_1.MessageType.LiveLog.Completed })}`);
|
|
66
|
+
}
|
|
67
|
+
async sendMetadata(kafkaPayload) {
|
|
68
|
+
await this.sendLiveLog(kafkaPayload, messageType_js_1.MessageType.AutomationScriptMetaData);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.RunnerKafkaReporter = RunnerKafkaReporter;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handlePostActionWeb = handlePostActionWeb;
|
|
4
|
+
const isAlertPresent_js_1 = require("../../utils/alertPopup/isAlertPresent.js");
|
|
5
|
+
const jsForToaster_js_1 = require("../../utils/javascript/jsForToaster.js");
|
|
6
|
+
const jsForAttributeInjection_js_1 = require("../../utils/DomExtraction/jsForAttributeInjection.js");
|
|
7
|
+
const newTabTracker_js_1 = require("../../utils/newTab/newTabTracker.js");
|
|
8
|
+
const logData_js_1 = require("../../utils/logger/logData.js");
|
|
9
|
+
async function handlePostActionWeb(platform, driver, action, beforeHandles, scriptAppender, stepCount) {
|
|
10
|
+
let preCapturedDomInfo = null;
|
|
11
|
+
if (platform === "web") {
|
|
12
|
+
const alertPresent = await (0, isAlertPresent_js_1.isAlertPresent)(driver);
|
|
13
|
+
if (!alertPresent) {
|
|
14
|
+
if (action === "click") {
|
|
15
|
+
await driver.executeScript(jsForToaster_js_1.TOAST_WATCHER_JS, []);
|
|
16
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
17
|
+
const postClickToastDetected = await driver.executeScript("return window.__toastDetected === true;", []);
|
|
18
|
+
if (postClickToastDetected) {
|
|
19
|
+
logData_js_1.logger.info("Toast detected after click");
|
|
20
|
+
preCapturedDomInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOM)(driver);
|
|
21
|
+
logData_js_1.logger.saveDOM(preCapturedDomInfo.dom, `toaster-dom-${stepCount}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (beforeHandles?.length > 0) {
|
|
26
|
+
await (0, newTabTracker_js_1.newTabTracker)(driver, action, beforeHandles, scriptAppender);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return preCapturedDomInfo;
|
|
30
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { StepProcessor } from "../main/stepProcessor.js";
|
|
2
|
+
import { platform as PlatformType } from "../types/scriptTypesType.js";
|
|
3
|
+
import { ResolvedStepAction } from "../interfaces/automationRunnerInterface.js";
|
|
4
|
+
export { ResolvedStepAction };
|
|
5
|
+
export declare function resolveStepActionFromDom(stepProcessor: StepProcessor, platform: PlatformType, action: string, toonDom: any, priorAndNextSteps: string[], currentStep: string, fileType?: string | null): Promise<ResolvedStepAction>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveStepActionFromDom = resolveStepActionFromDom;
|
|
4
|
+
const promptType_js_1 = require("../types/promptType.js");
|
|
5
|
+
const sameActionsHelper_js_1 = require("../../utils/helpers/sameActionsHelper.js");
|
|
6
|
+
const InvalidFileTypeError_js_1 = require("../Errors/InvalidFileTypeError.js");
|
|
7
|
+
async function resolveStepActionFromDom(stepProcessor, platform, action, toonDom, priorAndNextSteps, currentStep, fileType) {
|
|
8
|
+
let stepResult;
|
|
9
|
+
let stepAction;
|
|
10
|
+
if (action === "verify") {
|
|
11
|
+
if (fileType) {
|
|
12
|
+
const normalizedFileType = fileType.toLowerCase();
|
|
13
|
+
if (normalizedFileType !== "pdf") {
|
|
14
|
+
throw new InvalidFileTypeError_js_1.InvalidFileTypeError(normalizedFileType);
|
|
15
|
+
}
|
|
16
|
+
stepResult = await stepProcessor.getLLMResponse({
|
|
17
|
+
platform,
|
|
18
|
+
type: promptType_js_1.PromptType.FILE_VERIFY_PROMPT,
|
|
19
|
+
args: {
|
|
20
|
+
extractedDomJson: toonDom,
|
|
21
|
+
priorAndNextSteps,
|
|
22
|
+
},
|
|
23
|
+
input: { currentStep },
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
stepResult = await stepProcessor.getLLMResponse({
|
|
28
|
+
platform,
|
|
29
|
+
type: promptType_js_1.PromptType.VERIFY_PROMPT,
|
|
30
|
+
args: {
|
|
31
|
+
extractedDomJson: toonDom,
|
|
32
|
+
priorAndNextSteps,
|
|
33
|
+
},
|
|
34
|
+
input: { currentStep },
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
stepAction = stepResult.response.nlpName;
|
|
38
|
+
}
|
|
39
|
+
else if (action === "get") {
|
|
40
|
+
stepResult = await stepProcessor.getLLMResponse({
|
|
41
|
+
platform,
|
|
42
|
+
type: promptType_js_1.PromptType.GET_PROMPT,
|
|
43
|
+
args: {
|
|
44
|
+
extractedDomJson: toonDom,
|
|
45
|
+
priorAndNextSteps,
|
|
46
|
+
},
|
|
47
|
+
input: { currentStep },
|
|
48
|
+
});
|
|
49
|
+
stepAction = stepResult.response.nlpName;
|
|
50
|
+
}
|
|
51
|
+
else if (action === "wait") {
|
|
52
|
+
stepResult = await stepProcessor.getLLMResponse({
|
|
53
|
+
platform,
|
|
54
|
+
type: promptType_js_1.PromptType.WAIT_ACTION_EXTRACTOR_PROMPT,
|
|
55
|
+
args: {
|
|
56
|
+
extractedDomJson: toonDom,
|
|
57
|
+
priorAndNextSteps,
|
|
58
|
+
},
|
|
59
|
+
input: { currentStep },
|
|
60
|
+
});
|
|
61
|
+
stepAction = stepResult.response.nlpName;
|
|
62
|
+
}
|
|
63
|
+
else if (action === "combined") {
|
|
64
|
+
stepResult = await stepProcessor.getLLMResponse({
|
|
65
|
+
platform,
|
|
66
|
+
type: promptType_js_1.PromptType.COMBINED_ACTION_EXTRACTOR_PROMPT,
|
|
67
|
+
args: {
|
|
68
|
+
extractedDomJson: toonDom,
|
|
69
|
+
priorAndNextSteps,
|
|
70
|
+
},
|
|
71
|
+
input: { currentStep },
|
|
72
|
+
});
|
|
73
|
+
stepAction = stepResult.response.nlpName;
|
|
74
|
+
}
|
|
75
|
+
else if (action === "drag_and_drop") {
|
|
76
|
+
stepResult = await stepProcessor.getLLMResponse({
|
|
77
|
+
platform,
|
|
78
|
+
type: promptType_js_1.PromptType.FF_INSPECTOR,
|
|
79
|
+
args: {
|
|
80
|
+
extractedDomJson: toonDom,
|
|
81
|
+
priorAndNextSteps,
|
|
82
|
+
isDrag: true,
|
|
83
|
+
isAlert: false,
|
|
84
|
+
},
|
|
85
|
+
input: { currentStep },
|
|
86
|
+
});
|
|
87
|
+
stepAction = stepResult.response.nlpName;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
stepResult = await stepProcessor.getLLMResponse({
|
|
91
|
+
platform,
|
|
92
|
+
type: promptType_js_1.PromptType.FF_INSPECTOR,
|
|
93
|
+
args: {
|
|
94
|
+
stepAction: action,
|
|
95
|
+
extractedDomJson: toonDom,
|
|
96
|
+
priorAndNextSteps,
|
|
97
|
+
isAlert: false,
|
|
98
|
+
isDrag: false,
|
|
99
|
+
},
|
|
100
|
+
input: { currentStep },
|
|
101
|
+
});
|
|
102
|
+
if (platform === "web") {
|
|
103
|
+
stepAction = stepResult.response.action;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
stepAction = stepResult.response.nlpName;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (platform === "android" || platform === "ios") {
|
|
110
|
+
stepAction = sameActionsHelper_js_1.sameActionHelper[stepAction] || stepAction;
|
|
111
|
+
}
|
|
112
|
+
return { stepResult, stepAction };
|
|
113
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.executeVisionFallback = executeVisionFallback;
|
|
4
|
+
const generateAnnotatedScreenshots_js_1 = require("../../imageAnalysisWeb/generateAnnotatedScreenshots.js");
|
|
5
|
+
const jsForAttributeInjection_js_1 = require("../../utils/DomExtraction/jsForAttributeInjection.js");
|
|
6
|
+
const annotatedScreenshotMobile_js_1 = require("../../imageAnalysisMobile/annotatedScreenshotMobile.js");
|
|
7
|
+
const xpathcreation_js_1 = require("../../utils/helpers/xpathcreation.js");
|
|
8
|
+
const promptType_js_1 = require("../types/promptType.js");
|
|
9
|
+
const runnerPostActionHelper_js_1 = require("./runnerPostActionHelper.js");
|
|
10
|
+
const runnerDomPipeline_js_1 = require("./runnerDomPipeline.js");
|
|
11
|
+
const logData_js_1 = require("../../utils/logger/logData.js");
|
|
12
|
+
async function executeVisionFallback(params) {
|
|
13
|
+
const { driver, platform, action, step, stepAction, inputValue, stepCount, fallbackAttempt, priorAndNextSteps, listOfSteps, currentElementName, extractorElementName, stepElementType, iframeDomHtml, beforeHandles, context, stepProcessor, actionHandlers, reporter, causeError, } = params;
|
|
14
|
+
let domInfo = params.domInfo;
|
|
15
|
+
let doc = params.doc;
|
|
16
|
+
logData_js_1.logger.error(`execution failed for step "${step}": ${causeError} and going for vision`);
|
|
17
|
+
try {
|
|
18
|
+
let annotatedScreenshot;
|
|
19
|
+
let bounds;
|
|
20
|
+
if (action === "scroll") {
|
|
21
|
+
throw new Error("Scroll action failed element not found", { cause: causeError });
|
|
22
|
+
}
|
|
23
|
+
if (platform === "web") {
|
|
24
|
+
annotatedScreenshot = await (0, generateAnnotatedScreenshots_js_1.generateAnnotatedScreenshots)(driver);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
domInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOMForMobile)(driver);
|
|
28
|
+
let visionResult;
|
|
29
|
+
if (platform === "android") {
|
|
30
|
+
visionResult = await (0, annotatedScreenshotMobile_js_1.annotateScreenshot)(driver, domInfo.dom);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
visionResult = await (0, annotatedScreenshotMobile_js_1.annotateIosScreenshot)(driver, domInfo.dom);
|
|
34
|
+
}
|
|
35
|
+
annotatedScreenshot = visionResult.boxedImageBuffer;
|
|
36
|
+
bounds = visionResult.boxes;
|
|
37
|
+
}
|
|
38
|
+
let stepResultVision;
|
|
39
|
+
if (platform === "web") {
|
|
40
|
+
stepResultVision = await stepProcessor.getLLMResponse({
|
|
41
|
+
platform,
|
|
42
|
+
type: promptType_js_1.PromptType.VISION_PROMPT,
|
|
43
|
+
args: { priorAndNextSteps },
|
|
44
|
+
input: { currentStep: step, annotatedScreenshot: annotatedScreenshot.primary },
|
|
45
|
+
isVision: true,
|
|
46
|
+
});
|
|
47
|
+
if (stepResultVision.response.fireflinkIndex === "Fire-Flink-0") {
|
|
48
|
+
stepResultVision = await stepProcessor.getLLMResponse({
|
|
49
|
+
platform,
|
|
50
|
+
type: promptType_js_1.PromptType.VISION_PROMPT,
|
|
51
|
+
args: { priorAndNextSteps },
|
|
52
|
+
input: { currentStep: step, annotatedScreenshot: annotatedScreenshot.secondary },
|
|
53
|
+
isVision: true,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
stepResultVision = await stepProcessor.getLLMResponse({
|
|
59
|
+
platform,
|
|
60
|
+
type: promptType_js_1.PromptType.VISION_PROMPT,
|
|
61
|
+
args: { priorAndNextSteps },
|
|
62
|
+
input: { currentStep: step, annotatedScreenshot },
|
|
63
|
+
isVision: true,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
let fireflinkIndex = stepResultVision.response.fireflinkIndex;
|
|
67
|
+
logData_js_1.logger.info(`fireflinkIndex: ${fireflinkIndex}`);
|
|
68
|
+
if (fireflinkIndex === "Fire-Flink-0") {
|
|
69
|
+
logData_js_1.logger.error(`vision unable to find element for step "${step}"`);
|
|
70
|
+
if (platform === "web") {
|
|
71
|
+
context.scriptAppender.setErrorNLP(stepAction);
|
|
72
|
+
}
|
|
73
|
+
throw new Error(`vision unable to find element for step "${step}"`, { cause: causeError });
|
|
74
|
+
}
|
|
75
|
+
let xpath;
|
|
76
|
+
if (platform === "android" || platform === "ios") {
|
|
77
|
+
const index = Number(fireflinkIndex.split("-").pop());
|
|
78
|
+
const box = bounds[index - 1];
|
|
79
|
+
if (!box) {
|
|
80
|
+
throw new Error(`No bounds found for index ${index}`, { cause: causeError });
|
|
81
|
+
}
|
|
82
|
+
const { x1, y1, x2, y2 } = box;
|
|
83
|
+
const boundsStr = `[${x1},${y1}][${x2},${y2}]`;
|
|
84
|
+
const result = (0, xpathcreation_js_1.getFFIndexAndXPath)(domInfo.dom, boundsStr, platform);
|
|
85
|
+
xpath = result.xpathPath;
|
|
86
|
+
fireflinkIndex = result.ffInspector ?? fireflinkIndex;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
if (!domInfo || !domInfo.dom || !doc) {
|
|
90
|
+
logData_js_1.logger.info("Re-fetching annotated DOM for vision fallback");
|
|
91
|
+
domInfo = await (0, jsForAttributeInjection_js_1.getAnnotatedDOM)(driver);
|
|
92
|
+
doc = runnerDomPipeline_js_1.RunnerDomPipeline.parseDomDocument(domInfo.dom, "web");
|
|
93
|
+
}
|
|
94
|
+
const ele = doc.querySelector(`[ff-inspect="${fireflinkIndex}"]`);
|
|
95
|
+
if (ele) {
|
|
96
|
+
xpath = ele.getAttribute("ff-xpath") || "";
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const result = (0, xpathcreation_js_1.getWebXPathByFFIndex)(domInfo.dom, fireflinkIndex);
|
|
100
|
+
xpath = result.xpathPath;
|
|
101
|
+
}
|
|
102
|
+
if (!xpath) {
|
|
103
|
+
context.scriptAppender.setErrorNLP(stepAction);
|
|
104
|
+
throw new Error(`Unable to resolve xpath for ${fireflinkIndex}`, { cause: causeError });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const pageDOM = iframeDomHtml ?? domInfo.dom;
|
|
108
|
+
const handler = actionHandlers[stepAction];
|
|
109
|
+
await handler({
|
|
110
|
+
selector: xpath,
|
|
111
|
+
value: inputValue,
|
|
112
|
+
fireflinkIndex,
|
|
113
|
+
pageDOM,
|
|
114
|
+
elementName: currentElementName || extractorElementName,
|
|
115
|
+
elementType: stepElementType,
|
|
116
|
+
stepIndex: params.stepIndex ?? stepCount,
|
|
117
|
+
currentStep: params.currentStep ?? step,
|
|
118
|
+
manualStep: params.manualStep ?? step,
|
|
119
|
+
stepsInputData: params.stepsInputData,
|
|
120
|
+
filteredSteps: listOfSteps,
|
|
121
|
+
returnTypeVariableName: params.returnTypeVariableName,
|
|
122
|
+
...(params.variableName ? { variableName: params.variableName } : {}),
|
|
123
|
+
});
|
|
124
|
+
const preCapturedDomInfo = await (0, runnerPostActionHelper_js_1.handlePostActionWeb)(platform, driver, action, beforeHandles, context.scriptAppender, stepCount);
|
|
125
|
+
if (fallbackAttempt === 2) {
|
|
126
|
+
await reporter.sendRetry("Retry successful. Moving on to the next step.");
|
|
127
|
+
}
|
|
128
|
+
return { preCapturedDomInfo, retryNeeded: false };
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
logData_js_1.logger.error(`vision execution failed for step "${step}": ${error}`);
|
|
132
|
+
if (fallbackAttempt < 2) {
|
|
133
|
+
await reporter.sendRetry("Step failed to execute. Waiting a few seconds before reattempting the same step.");
|
|
134
|
+
return { preCapturedDomInfo: null, retryNeeded: true };
|
|
135
|
+
}
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|