4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

UiPath (produced with UiPath Friends) Advent Calendar 2023

Day 15

【UiPath】コード化されたワークフローで RPA Challenge を動かす その3 - 爆速化編

Last updated at Posted at 2023-12-14

はじめに

前回前々回の記事でコード化されたワークフローで RPA Challenage の自動化処理を実装することができました。

しかし、RPA Challenge と言えば爆速化です。RPA Challenge に挑むものとして爆速化は避けて通れない道です。

というわけで今回は、コード化されたワークフローでどこまで爆速化できるか試してみたいと思います。

この記事は、UiPath (produced with UiPath Friends) Advent Calendar 2023 の 15日目です。

リファクタリングしてみる

いきなりですが、こちらが修正後のコードになります。

RPAChallenge.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using UiPath.CodedWorkflows;
using UiPath.Core;
using UiPath.Core.Activities.Storage;
using UiPath.Orchestrator.Client.Models;
using UiPath.Testing;
using UiPath.Testing.Activities.TestData;
using UiPath.Testing.Activities.TestDataQueues.Enums;
using UiPath.Testing.Enums;
using UiPath.UIAutomationNext.API.Contracts;
using UiPath.UIAutomationNext.API.Models;
using UiPath.UIAutomationNext.Enums;
using CodedWorkflow_RPAChallenge.ObjectRepository;

namespace CodedWorkflow_RPAChallenge
{
    public class RPAChallenge : CodedWorkflow
    {
        public TargetAppOptions targetAppOptions => new TargetAppOptions() {
            InteractionMode = NInteractionMode.Simulate,
            OpenMode = NAppOpenMode.IfNotOpen,
            AttachMode = NAppAttachMode.SingleWindow
        };

        // TypeInto のプロパティ (DelayBefore と DelayAfter を 0秒にする)
        public TypeIntoOptions typeIntoOptions => new TypeIntoOptions() {
            DelayBefore = 0,
            DelayAfter = 0
        };

        // Click のプロパティ (DelayBefore と DelayAfter を 0秒にする)
        public ClickOptions clickOptions => new ClickOptions() {
            DelayBefore = 0,
            DelayAfter = 0
        };

        [Workflow]
        public void Execute()
        {
            UiTargetApp screen = uiAutomation.Open(Descriptors.Chrome__Rpa_Challenge_app.Chrome__Rpa_Challenge, targetAppOptions);

            // 開始ボタンのクリック前に移動
            IDictionary<string, object> args = RunWorkflow("GetExcelData.xaml");
            DataTable dataTable =  (DataTable) args["out_テーブルデータ"];

            // TypeInto で使う要素名の配列
            string[] columns = new string[] {"苗字", "名前", "会社名", "部署", "住所", "メールアドレス", "電話番号"};

            // 同時実行タスクの最大数を 7 (テキストボックス数分)に設定
            ParallelOptions parallelOptions = new ParallelOptions();
            parallelOptions.MaxDegreeOfParallelism = 7;

            // clickOptions を渡して DelayBefore, DelayAfter を変更
            screen.Click(Descriptors.Chrome__Rpa_Challenge_app.Chrome__Rpa_Challenge.開始, clickOptions);

            foreach(DataRow row in dataTable.Rows) {
                // テキストボックスの入力を並行で行う
                Parallel.ForEach(columns, parallelOptions, x =>
                {
                    // typeIntoOptions を渡せるように修正
                    screen.TypeInto(x, typeIntoOptions.WithText(row[x].ToString()));
                });
                // clickOptions を渡して DelayBefore, DelayAfter を変更
                screen.Click(Descriptors.Chrome__Rpa_Challenge_app.Chrome__Rpa_Challenge.登録, clickOptions);
            }
        }
    }
}

以下、要点のみ説明します。

「実行前の待機時間(Delay After)」, 「 実行後の待機時間(Delay Before)」の調整

クリックや文字を入力アクティビティに該当するメソッドのプロパティを変更することができます。変更は各メソッド毎に用意されている メソッド名Options というクラスを用いて行います。今回のコードでは、ClickTypeInto が該当するのでそれぞれ、ClickOptionsTypeIntoOptions クラスを使います。

// TypeInto のプロパティ (DelayBefore と DelayAfter を 0秒にする)
public TypeIntoOptions typeIntoOptions => new TypeIntoOptions() {
    DelayBefore = 0,
    DelayAfter = 0
};

// Click のプロパティ (DelayBefore と DelayAfter を 0秒にする)
public ClickOptions clickOptions => new ClickOptions() {
    DelayBefore = 0,
    DelayAfter = 0
};

メソッドの第二引数で渡してあげると設定値に基づいて動作するようになります。

// clickOptions を渡して DelayBefore, DelayAfter を変更
screen.Click(Descriptors.Chrome__Rpa_Challenge_app.Chrome__Rpa_Challenge.開始, clickOptions);

TypeInto メソッドには TypeInto(Descriptorsのクラス, 入力する文字列, TypeIntoOptions) のパターンがなかったため書き方を変更しています。

第一引数にオブジェクトリポジトリの要素名の文字列、第二引数に TypeIntoOptions を指定しつつ WithText で入力する文字列も渡しています。

// typeIntoOptions を渡せるように修正
screen.TypeInto(x, typeIntoOptions.WithText(row[x].ToString()));

文字入力の並列実行
RPA Challenge の爆速化といえば、並列 アクティビティによる文字入力の同時実行です。C# では Parallel というその名もズバリなクラスが用意されているのでこちらを使って同時実行を実現しています。

ParallelOptions を使うと並列実行の同時タスクの最大数を設定できます。こちら使わなくてもそこまで速度に影響はなかったのですが念のため入れています。

// using ディレクティブへの追加が必要
using System.Threading.Tasks;

// TypeInto で使う要素名の配列
string[] columns = new string[] {"苗字", "名前", "会社名", "部署", "住所", "メールアドレス", "電話番号"};

// 同時実行タスクの最大数を 7 (テキストボックス数分)に設定
ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 7;

// テキストボックスの入力を並行で行う
Parallel.ForEach(columns, parallelOptions, x =>
{
    // typeIntoOptions を渡せるように修正
    screen.TypeInto(x, typeIntoOptions.WithText(row[x].ToString()));
});

実行してみる

約50秒かかっていたものが 4秒台になりました。

image.png

おわりに

プロセス爆速化のためのTIPS では平均 1824.8 ミリ秒という驚異的な数値が出ていますが、今回のリファクタリングでは 4秒を切ることが出来ませんでした。精進します。

皆さんも是非コード化されたオートメーションをお試しください!

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?