diff --git a/packages/basic.gblib/services/DialogKeywords.ts b/packages/basic.gblib/services/DialogKeywords.ts index 7de3ba80..9075d759 100644 --- a/packages/basic.gblib/services/DialogKeywords.ts +++ b/packages/basic.gblib/services/DialogKeywords.ts @@ -42,8 +42,11 @@ import { SystemKeywords } from './SystemKeywords'; import { GBMinService } from '../../core.gbapp/services/GBMinService'; import { HubSpotServices } from '../../hubspot.gblib/services/HubSpotServices'; import { WhatsappDirectLine } from '../../whatsapp.gblib/services/WhatsappDirectLine'; +import { GBAdminService } from '../../admin.gbapp/services/GBAdminService'; +import * as fs from 'fs'; const DateDiff = require('date-diff'); const puppeteer = require('puppeteer'); +const Path = require('path'); /** * Base services of conversation to be called by BASIC which @@ -74,7 +77,7 @@ export class DialogKeywords { /** * The number used in this execution for HEAR calls (useful for SET SCHEDULE). */ - hrOn: string; + hrOn: string; /** * When creating this keyword facade, a bot instance is @@ -101,16 +104,15 @@ export class DialogKeywords { */ public async getPage(step, url) { - if (!this.browser) - { + if (!this.browser) { this.browser = await puppeteer.launch({ args: [ - '--ignore-certificate-errors', - '--no-sandbox', - '--disable-setuid-sandbox', - '--window-size=1920,1080', - "--disable-accelerated-2d-canvas", - "--disable-gpu"], + '--ignore-certificate-errors', + '--no-sandbox', + '--disable-setuid-sandbox', + '--window-size=1920,1080', + "--disable-accelerated-2d-canvas", + "--disable-gpu"], ignoreHTTPSErrors: true, headless: false, }); @@ -125,20 +127,33 @@ export class DialogKeywords { * * @example GET page, "elementName", "text" */ - private async getByIDOrName(page, elementName) { - + public async getBySelector(page, elementName) { await page.waitForSelector(elementName) let element = await page.$(elementName); return element; } + /** + * Find element on page DOM. + * + * @example GET page, "frameSelector, "elementSelector" + */ + public async getByFrame(page, frame, selector) { + await page.waitForSelector(frame) + let frameHandle = await page.$(frame); + const f = await frameHandle.contentFrame(); + await f.waitForSelector(selector); + const element = await f.$(selector); + return element; + } + /** * Returns the today data filled in dd/mm/yyyy or mm/dd/yyyy. * * @example x = TODAY */ public async click(step, page, idOrName) { - const e = await this.getByIDOrName(page, idOrName); + const e = await this.getBySelector(page, idOrName); await Promise.all([ page.waitForNavigation(), @@ -153,7 +168,7 @@ export class DialogKeywords { * @example file = SCREENSHOT page */ public async screenshot(step, page, idOrName, localName) { - const e = await this.getByIDOrName(page, idOrName); + const e = await this.getBySelector(page, idOrName); await e.screenshot({ path: localName }); } @@ -164,7 +179,7 @@ export class DialogKeywords { */ public async download(step, page, idOrName, localName) { - const e = await this.getByIDOrName(page, idOrName); + const e = await this.getBySelector(page, idOrName); const context = await this.browser.newContext({ acceptDownloads: true }); var cells = e.rows[0].cells; @@ -184,8 +199,8 @@ export class DialogKeywords { * * @example TYPE page, "elementName", "text" */ - public async type( step, page, idOrName, text) { - const e = await this.getByIDOrName(page, idOrName); + public async type(step, page, idOrName, text) { + const e = await this.getBySelector(page, idOrName); await e.type(text); } @@ -579,7 +594,7 @@ export class DialogKeywords { * */ public async transferTo(step, to: string = null) { - return await step.beginDialog('/t', {to: to}); + return await step.beginDialog('/t', { to: to }); } /** @@ -607,14 +622,13 @@ export class DialogKeywords { }; // Waits for next message in HEAR delegated context. - + const mobile = await this.userMobile(step); - while (true){ - if (WhatsappDirectLine.state[mobile] === 3) - { + while (true) { + if (WhatsappDirectLine.state[mobile] === 3) { break; } - sleep (5000); + sleep(5000); } const result = WhatsappDirectLine.lastMessage[mobile]; opts = await promise(step, result); @@ -665,7 +679,7 @@ export class DialogKeywords { } private static getChannel(step): string { - if(!step) return 'whatsapp'; + if (!step) return 'whatsapp'; if (!isNaN(step.context.activity['mobile'])) { return 'webchat'; } else { @@ -681,7 +695,30 @@ export class DialogKeywords { * Processes the sending of the file. */ private async internalSendFile(step, mobile, filename, caption) { - if (filename.indexOf('.md') > -1) { + + // Handles SEND FILE TO mobile, element in Web Automation. + + + const page = filename._page; + if (page) { + const gbaiName = `${this.min.botId}.gbai`; + const localName = Path.join( 'work', gbaiName,'cache', `img${GBAdminService.getRndReadableIdentifier()}.jpg`); + await filename.screenshot({ path: localName }); + + const url = urlJoin( + GBServer.globals.publicAddress, + this.min.botId, + 'cache', + Path.basename(localName) + ); + + GBLog.info(`BASIC: WebAutomation: Sending the file ${url} to mobile ${mobile}.`); + await this.min.conversationalService.sendFile(this.min, step, mobile, url, caption); + } + + // Handles Markdown. + + else if (filename.indexOf('.md') > -1) { GBLog.info(`BASIC: Sending the contents of ${filename} markdown to mobile ${mobile}.`); const md = await this.min.kbService.getAnswerTextByMediaName(this.min.instance.instanceId, filename); if (!md) { @@ -690,6 +727,7 @@ export class DialogKeywords { await this.min.conversationalService['playMarkdown'](this.min, md, DialogKeywords.getChannel(step), step, mobile); + } else { GBLog.info(`BASIC: Sending the file ${filename} to mobile ${mobile}.`); const url = urlJoin( diff --git a/packages/basic.gblib/services/GBVMService.ts b/packages/basic.gblib/services/GBVMService.ts index df459a58..a9e847a9 100644 --- a/packages/basic.gblib/services/GBVMService.ts +++ b/packages/basic.gblib/services/GBVMService.ts @@ -311,11 +311,27 @@ export class GBVMService extends GBService { if ($2.indexOf('http') !== -1) { return `${$1} = sys().getByHttp (${$2}, headers, httpUsername, httpPs)`; } else { - if ($2.indexOf(',') !== -1) { - const values = $2.split(','); + const count=($2.match(/\,/g) || []).length; + const values = $2.split(','); + + // Handles GET page, "selector". + + if (count == 1) { + return `${$1} = this.getByIDOrName(${values[0]}, ${values[1]} )`; } + + // Handles GET page, "frameSelector", "selector" + + else if (count == 2) { + + return `${$1} = this.getByFrame(${values[0]}, ${values[1]}, ${values[2]} )`; + } + + // Handles the GET http version. + else { + return `${$1} = sys().get (${$2})`; } } diff --git a/packages/basic.gblib/services/SystemKeywords.ts b/packages/basic.gblib/services/SystemKeywords.ts index 7fd42b30..6db515d2 100644 --- a/packages/basic.gblib/services/SystemKeywords.ts +++ b/packages/basic.gblib/services/SystemKeywords.ts @@ -895,9 +895,6 @@ export class SystemKeywords { // Checks if the destination contains subfolders that // need to be created. - // Checks if the destination contains subfolders that - // need to be created. - let folder; if (dest.indexOf('/') !== -1) { const pathOnly = path.dirname(dest);