Как я могу автоматизировать создание и передачу SFTP снимка в Acumatica? - PullRequest
1 голос
/ 25 февраля 2020

Я хотел бы создать ночной снимок некоторых таблиц в моем экземпляре Acumatica, размещенном на SAAS, и в результате получить SFTP-файл XML в указанном месте. (Я создал пользовательский параметр «Режим экспорта» только для интересующих таблиц.)

Я хотел бы выполнить этот процесс с помощью расписания автоматизации Acumatica, пользовательского действия, которое я могу вызвать через API, или Вызов API для существующих действий Acumatica или какой-либо из перечисленных выше комбинаций.

Однако не представляется возможным, чтобы мне были доступны следующие опции:

  • Автоматическое планирование не поддерживает создание снимка (https://feedback.acumatica.com/ideas/ACU-I-570)
  • Я попытался добавить действие для создания снимка в конечную точку веб-службы, но не похоже, что я могу передать параметры, которые мне понадобятся управлять всплывающими окнами
  • Пытаясь создать пользовательскую кнопку Acumatica, я также пытаюсь понять, как вызывать и управлять всплывающими окнами.

Как только я получу созданный снимок, я полагаю, мне нужно будет иметь возможность загрузить его локально, чтобы переместить его в нужное место; Я не дошел до того, чтобы узнать, вызываю ли я кнопку загрузки снимка через API, где полученный файл будет go.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Июнь. Когда я застреваю с вещами, которые я не могу вызвать с помощью ReST или других методов интеграции, я обычно обращаюсь к Selenium как пути наименьшего сопротивления. Я хочу отметить, что я всегда ошибаюсь в связи с использованием селена в качестве крайней меры. Я обычно люблю использовать модуль селена PowerShell для подобных вещей. Как только ваш скрипт заработает, вы сможете легко подключить его к стандартному планировщику Windows. Это может быть не самый элегантный способ сделать это, но он, безусловно, сделает работу. если вам интересно, вы можете начать с этим

https://github.com/adamdriscoll/selenium-powershell/blob/master/README.md

Как только вы ознакомитесь с ним, вы будете использовать инструмент проверки chrome, чтобы разобраться в элементах, которые Вы должны нацелиться. диалоговые окна, которые вы открываете, часто встречаются на странице как iframes.

Я могу поделиться некоторыми из моих скриптов, чтобы помочь вам начать работу, если вы хотите попробовать этот маршрут.

Я надеюсь, что это помогает. Роберт

0 голосов
/ 04 марта 2020

В итоге я создал простое консольное приложение, так как оно больше соответствовало другим нашим приложениям, и я больше знаком с C#, чем с PowerShell. Роберт, твой проект был неоценим, чтобы понять, как ссылаться на более сложные элементы.

Я рассчитываю настроить запланированные задачи, которые будут вызывать мое приложение с именем метода каждого шага с соответствующими задержками между каждым - например, создание снимка занимает около 25 минут. Существуют отдельные методы для создания снимка, загрузки снимка, удаления снимка, и затем я работаю над SFTP-загрузкой загруженного снимка до конечного пункта назначения. Я засыпаю, чтобы дать время сайту наверстать упущенное; Существуют методы Waits и WaitForExpectedCondition, но я не стал их использовать в этой быстрой и грязной версии.

Вот в чем смысл моего кода. (Я добавил WebDriver и ChromeDriver в приложение через Nuget.)

using System;
using System.Collections.Generic;
using System.Linq;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System.Threading;

namespace InfiniteExport
{
   class Program
    {
        static string connectorInfo;
        static void Main(string[] args)
        {
            string method = "";
            if (args.Count() >= 1)
            {
                method = args[0].ToLower();
            }

            IWebDriver driver = new ChromeDriver(); 
            try
            {
                switch (method)
                {
                    case "createsnapshot":                        
                        Login(driver);                        
                        CreateSnapshot(driver);
                        break;
                    case "downloadsnapshot":
                        Login(driver);
                        DownloadSnapshot(driver);
                        break;
                    case "deletesnapshot":
                        Login(driver);
                        DeleteSnapshot(driver);
                        break;
                    default:
                        break;
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                driver.Quit();
            }
        }

        static void Login(IWebDriver driver)
        {
            //This login actually results in a 404 error because there's no redirect embedded in it, but the login itself is successful and creates the session used by the next method navigation 
            driver.Navigate().GoToUrl(InfiniteExport.Properties.Settings.Default.BaseAcumaticaURL + "/Frames/Login.aspx");
            driver.FindElement(By.Id("form1")).Click();
            driver.FindElement(By.Id("txtUser")).SendKeys(InfiniteExport.Properties.Settings.Default.AcumaticaUserName);
            driver.FindElement(By.Id("txtPass")).SendKeys(InfiniteExport.Properties.Settings.Default.AcumaticaPassword);
            driver.FindElement(By.Id("btnLogin")).Click();
            driver.Manage().Window.Maximize();
            Thread.Sleep(5000);
        }

        static void CreateSnapshot(IWebDriver driver)
        {
            driver.Navigate().GoToUrl(@InfiniteExport.Properties.Settings.Default.BaseAcumaticaURL + "/Main?ScreenId=SM203520&_CompanyID=2");
            Thread.Sleep(2000);
            driver.SwitchTo().Frame("main");
            //Click the @$@#%*! unnamed create snapshot button
            driver.FindElement(By.CssSelector(".toolsBtn[data-cmd=exportSnapshotCommand]")).Click();
            Thread.Sleep(2000);
            //Switch to the modal popup to start clicking items on it (this is the "Warning not in maintenance mode" popup)
            driver.SwitchTo().ActiveElement();
            driver.FindElement(By.Id("messageBox_0")).Click();
            Thread.Sleep(2000);
            //Switch to the modal popup with the export options
            driver.SwitchTo().ActiveElement();
            driver.FindElement(By.Id("ctl00_phF_pnlExportSnapshot_frmExportSnapshot_edDescription")).SendKeys("InfiniteExport");

            //Select the dropdown option for the InfiniteExport
            driver.FindElement(By.Id("ctl00_phF_pnlExportSnapshot_frmExportSnapshot_edExportMode_text")).Click();
            driver.FindElement(By.Id("ctl00_phF_pnlExportSnapshot_frmExportSnapshot_edExportMode_text")).SendKeys("InfiniteExport");
            Thread.Sleep(2000);
            driver.FindElement(By.ClassName("ddSelection")).Click();

            driver.FindElement(By.Id("ctl00_phF_pnlExportSnapshot_frmExportSnapshot_chkPrepare")).Click();

            //Select the dropdown option for XML
            driver.FindElement(By.Id("ctl00_phF_pnlExportSnapshot_frmExportSnapshot_edPrepareMode")).Click();
            driver.FindElement(By.Id("ctl00_phF_pnlExportSnapshot_frmExportSnapshot_edPrepareMode_text")).SendKeys("XML");
            Thread.Sleep(2000);
            driver.FindElement(By.ClassName("ddSelection")).Click();
            Thread.Sleep(2000);

            //Click the OK button to start the export
            driver.FindElement(By.Id("ctl00_phF_pnlExportSnapshot_btnExportSnapshotOK")).Click();

            //Wait long enough for the process to start, then quit and come back later to download
            Thread.Sleep(10000);
        }

        static void DownloadSnapshot(IWebDriver driver)
        {
            driver.Navigate().GoToUrl(@InfiniteExport.Properties.Settings.Default.BaseAcumaticaURL + "/Main?ScreenId=SM203520&_CompanyID=2");
            Thread.Sleep(2000);
            driver.SwitchTo().Frame("main");
            //Unless this is made fancier, it will download the active grid row, which is the most recent snapshot created
            driver.FindElement(By.CssSelector(".toolsBtn[data-cmd=downloadSnapshotCommand]")).Click();
            Thread.Sleep(10000);
        }

        static void DeleteSnapshot(IWebDriver driver)
        {
            driver.Navigate().GoToUrl(@InfiniteExport.Properties.Settings.Default.BaseAcumaticaURL + "/Main?ScreenId=SM203520&_CompanyID=2");
            Thread.Sleep(2000);
            driver.SwitchTo().Frame("main");
            //Unless this is made fancier, it will delete the active grid row, which is the most recent snapshot created
            driver.FindElement(By.CssSelector(".toolsBtn[data-cmd=Delete]")).Click();
            Thread.Sleep(2000);
            driver.FindElement(By.CssSelector(".toolsBtn[data-cmd=saveCompanyCommand]")).Click();
            Thread.Sleep(10000);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...