T-PlanによるSelenium WebDriver自動化
1. はじめに
バージョン5.0では、Selenium WebDriverとの統合が導入され、単一のスクリプトから画像ベースの自動化とWebブラウザ自動化を組み合わせて実行できるようになりました。主な機能:
-
Robot 9.0.1以降は、Selenium Java Client 4.43とそのSelenium Managerを利用しており、ブラウザドライバの手動ダウンロードが不要です。
-
Robot 8はSelenium 4.25を使用し、Robot 7.xはSelenium Java Client 3.141.59と統合されています。使用中のバージョンは、Browserコマンドの設定画面(下記参照)で確認できます。ファイルは
selenium/フォルダにインストールされ、必要に応じて新しいバージョンに手動で置き換えることができます。 -
サポートされるブラウザ:
-
GUIモードでは、一度に自動化できるローカルブラウザは1つのみです。v7.2.6以降、CLIモードでは複数の並列ブラウザを起動できます。
-
リリース8以降、同じブラウザインスタンスの複数のタブやウィンドウを自動化できます。ただし、一度に自動化できるタブまたはウィンドウは1つのみであるため、これは並列テストではありません。詳細はBrowserコマンドを参照してください。
-
リモートブラウザ(Selenium Grid)の自動化は、v6.3以降でサポートされています。
2. セットアップ手順
ローカルブラウザを開くには、Selenium → Open Browser...を選択するか、Browser ツールバーボタンをクリックします。ドロップダウンで対象のブラウザを選択し、必要に応じて対象URLを入力します。Open をクリックして開始します。
Robot 9.0.1以降は、お使いのブラウザのバージョンに一致するブラウザドライバのバイナリを自動的にダウンロードします。バイナリは、繰り返し使用できるように<userHome>/.tplanrobot/seleniumフォルダにキャッシュされます。
Robot 9.0以前を使用している場合、環境がインターネットに接続されていない場合、またはドライバの自動ダウンロードを避けたい場合は、次のように手動でセットアップします:
-
Selenium Downloadsページを開き、「Third Party Drivers, Bindings, and Plugins」セクションまでスクロールします。対象のブラウザドライバをダウンロードし、ハードドライブに展開します。
-
RobotメニューでSelenium → Configure Seleniumを選択し、ドライバの実行ファイルへのパスを設定します。
重要: ドライバの実行ファイルのバージョンはブラウザのバージョンと一致している必要があります。一致しない場合、接続に失敗することがあります。例えば、Chromeバージョン101を自動化するには、バージョン101のchromedriver.exeが必要です。自動化を安定させるには、ブラウザの自動更新を無効にするか、ブラウザを更新するたびにドライバも更新してください。
注: Robot v7では、ブラウザの設定を指定する機能が導入されました。これは、Seleniumを通じてこの機能をサポートするブラウザ、すなわちFirefoxとChromeでのみ利用できます。
リモートブラウザに接続するには:
-
まずSelenium Gridをセットアップします。
-
Selenium → Open Browser...を選択するか、Browser ツールバーボタンをクリックします。
-
ウィンドウのRemoteタブを選択し、hub URLを入力して対象のブラウザタイプを選択します。Openをクリックして開始します。
ブラウザが起動して実行されたら、それを操作するスクリプトコードの作成を開始できます。現在のページ内の要素を表示するには、Selenium → View Elementsメニュー項目を開きます。
3. Seleniumの設定
Browserコマンドの設定画面では、いくつかのSelenium設定オプションがサポートされています:
-
特定のドライバに渡すコマンドライン(CLI)引数を指定できます。Chromeの場合、これはコミュニティで報告されている数々の問題を回避する手段になります。引数は、Browser openコマンドの"args"パラメータを使用してスクリプトから渡すこともできます。現在の状況:
-
Firefoxのオプションはこちらに記載されています。
-
Chromeのオプションは公式には文書化されていませんが、Chromiumエンジンのソースコードから取得できます
-
Chromiumのオプションは基本的にChromeと同じですが、エンジン自体に実装されているものに限られます。
-
MS Internet Explorerのオプションはサポートされていません。
-
MS Edgeのオプションはリリース8で完全にサポートされる予定です。v7.2.6以降、ブラウザウィンドウを最大化する
--start-maximizedオプションのみ使用できます。 -
Safariのオプションは完全にはサポートされていません。v7.2.6以降、ブラウザウィンドウを最大化する
--start-maximizedオプションのみ使用できます。
-
-
システムのポップアップ(アラート)の処理方法を指定するオプションがあります。
-
デフォルトの動作はDISMISSで、これによりドライバは最初のオプション(ボタン)を選択し、ウィンドウを即座に閉じます。
-
アラートを画面に残しておくには、値をIGNOREに設定します。
-
4. 自動化
Robotのスクリプト言語には、次の2つの新しい要素があります:
-
「browser」比較方式を使用すると、標準のCompareToおよびWaitforコマンドを使用してWebページ内の要素を検索できます。
-
「Browser」コマンドを使用すると、Selenium駆動のブラウザを管理・操作できます。コマンドの正式な仕様については、Language Referenceを参照してください。
-
「Browser open」を使用して、対象のブラウザとWebサイトを開きます。それを閉じるには「Browser close」を呼び出します。
-
「Browser find」を使用して、ページ内の要素(HTMLタグ)を検索し、任意のアクション(click、type、submit、clear、select)を適用します。対象の要素は、次のように識別できます:
-
FAST: XPath、CSS、または1つ以上の要素属性を入力し、Verifyをクリックします。条件に一致する要素が複数ある場合は、ポップアップウィンドウの「Choose in viewer」ボタンを選択します。ビューアで対象の要素を選択し、識別するための条件にチェックを入れます。
-
SLOW: コマンドのプロパティウィンドウで「Choose in viewer」を選択して、要素ビューアを開きます。これは現在のWebページ内のすべての要素を読み込むため、低速になりがちです。ビューアで対象の要素を選択し、識別するための条件にチェックを入れます。
注: 「Text」および「Partial text」の条件だけでは、通常は不十分です。Seleniumは、それを含む要素だけでなく、そのすべての親要素(div、formなど)も返すためです。これは、上位の要素やページ全体のテキストを取得するために利用できます。例えば、ページ内のすべてのテキストを取得するには、「Tag Name」を「body」に設定します。呼び出し元のスクリプトは、_WEB_TEXT変数からテキストを取得できます。
-
-
条件を設計したら、Perform Actionボタンを選択して、選択したアクションを対象の要素に適用できます。これにより、ブラウザと直接やり取りすることなく、期待どおりに動作することを確認できます。
-
OK を選択すると、コマンドがアクティブなスクリプトエディタに保存されます。次の行に別の「Browser find」コマンドを設計したい場合は、代わりに「OK & Create New」ボタンをクリックします。
-
「Browser find」コマンドは、見つかった要素の数とその一部の属性を、一連の変数を通じて公開します:
|
変数名 |
説明 |
|---|---|
|
_WEB_COUNT=<number> |
「Browser find」によって取得された要素の数 |
|
_WEB_X_<n>=<x-coordinate>
|
n番目の要素のX座標とY座標、幅、高さ。 |
|
_WEB_TEXT=<text> |
n番目の要素のテキスト(すべての子要素のテキストを含む累積テキスト)。 |
また、 コマンドは、最初の最大30個の要素のHTML属性を、_WEB_を接頭辞とする変数に格納します。例えば、リンク(「a」タグ)を検索する場合、2番目の要素の「href」属性は_WEB_HREF_2変数として利用できます。30個という上限は、パフォーマンス上の理由により設定されており、変更できません。
4.1 自動化の例
簡単な例を使って、Robotの機能を紹介しましょう:
-
FirefoxでWikipediaのホームページを開く
-
検索フィールドに「automation」と入力して送信し、Automationのトピックを開く。
純粋なSeleniumによるJavaでの実装は、次のようになります:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.By;
public class WikipediaAutomation {
public static void main(String args[]) {
// Set path to the Firefox/Gecko driver
System.setProperty("webdriver.gecko.driver", "C:\\Selenium\\geckodriver.exe");
// Create the driver and execute the script
WebDriver driver = new FirefoxDriver();
// Open the Wikipedia home page
driver.get("https://www.wikipedia.org");
WikipediaAutomation script = new WikipediaAutomation();
script.automate(driver);
}
public void automate(WebDriver driver) {
// Enter 'automation' into the search field
driver.findElement(By.id("searchInput")).sendKeys("automation");
// Submit the form using the button next to the field
driver.findElement(By.xpath("//button")).submit();
}
}
Robotで同じスクリプトを設計するには、前章で説明したBrowser openおよびBrowser findのプロパティウィンドウを使用します。
-
スクリプトがRobotのTPRスクリプトの場合、対応するコードは次のようになります:
Browser "open" browser="firefox" url="https://www.wikipedia.org"
Browser "find" id="searchInput" elaction="type" eltext="automation"
Browser "find" tagname="button" elaction="submit"
-
スクリプトがRobotのJavaスクリプトの場合、プロパティウィンドウは以下と同様の自動化コードを生成します。Javaスクリプトクラスの残りの部分は、簡潔にするため省略しています。
browserOpen("firefox", "https://www.wikipedia.org");
browserFindAndType("automation", "id", "searchInput");
browserFindAndSubmit("tagname", "button");
4.2 Selenium APIへのアクセス
Robotは、Seleniumのすべての機能をまだサポートしていません。サポートされていないSeleniumの機能には、RobotのJavaテストスクリプトからJavaコードのレベルで、次のようにアクセスできます:
WebDriverAdapter adapter = WebDriverAdapterFactory.getInstance().getAdapter(getContext(), WebDriverAdapter.ADAPTER_NAME_SELENIUM);
org.openqa.selenium.WebDriver driver = (org.openqa.selenium.WebDriver) adapter.getDriver();
例えば、TPRテストスクリプトからJavaScriptのポップアップを承認して閉じるには、次のJavaコードブロックを使用します:
java {
import com.tplan.robot.remoteclient.webdriver.WebDriverAdapter;
import com.tplan.robot.remoteclient.webdriver.WebDriverAdapterFactory;
WebDriverAdapter adapter = WebDriverAdapterFactory.getInstance().getAdapter(getContext(), WebDriverAdapter.ADAPTER_NAME_SELENIUM);
org.openqa.selenium.WebDriver driver = (org.openqa.selenium.WebDriver) adapter.getDriver();
driver.switchTo().alert().accept();
} endjava
4.3 既存のSeleniumスクリプトの統合
既存のSeleniumのJavaコードは、Robotスクリプトと自由に組み合わせることができます。両者が共有する必要があるのは、SeleniumのWebドライバオブジェクト(org.openqa.selenium.WebDriverインスタンス)のみです。Robotフレームワークの中心となるクラスはcom.tplan.robot.remoteclient.webdriver.WebDriverAdapterFactoryで、実行中のスクリプトに割り当てられたドライバのラッパークラス(WebDriverAdapter)にアクセスできます。
例えば、RobotにFirefoxでWikipediaのホームページを開かせ、その後で上記の純粋なSeleniumの例を使用して自動化を実行させるには、次のようなRobotのJavaスクリプトを作成します:
package test;
import com.tplan.robot.scripting.*;
import com.tplan.robot.*;
import com.tplan.robot.remoteclient.webdriver.*;
import java.io.*;
public class RobotWikipediaScript extends DefaultJavaTestScript {
public void test() {
try {
// Call "Browser open" to create the driver
browserOpen("firefox", "https://www.wikipedia.org");
// Obtain a reference to the Selenium driver from the Robot framework
WebDriverAdapter adapter = WebDriverAdapterFactory.getInstance().getAdapter(getContext(), WebDriverAdapter.ADAPTER_NAME_SELENIUM);
org.openqa.selenium.WebDriver driver = (org.openqa.selenium.WebDriver) adapter.getDriver();
// Call the existing example Selenium script
WikipediaAutomation seleniumScript = new WikipediaAutomation();
seleniumScript.automate(driver);
} catch (StopRequestException ex) {
throw ex;
} catch (IOException ex) {
ex.printStackTrace();
throw new IllegalStateException(ex);
}
}
public static void main(String args[]) {
RobotWikipediaScript script = new RobotWikipediaScript();
ApplicationSupport robot = new ApplicationSupport();
AutomatedRunnable runnable = robot.createAutomatedRunnable(script, "RobotWikipediaScript@" + Integer.toHexString(script.hashCode()), args, System.out, false);
new Thread(runnable).start();
}
}
既存のSeleniumスクリプトをTPRスクリプトから直接呼び出すことはできません。Seleniumの実行をRobotのJavaスクリプトでラップし、それをRunコマンドを使用して呼び出す必要があります。
例えば、TPRスクリプトから今回の自動化を実行するには、上記のRobotWikipediaScriptの例から「browserOpen("firefox", "https://www.wikipedia.org")」メソッド呼び出しを削除し、TPRから次のように呼び出します:
Browser "open" browser="firefox" url="https://www.wikipedia.org"
Run "test.RobotWikipediaScript"
上記の例を動作させるには、コンパイル済みのSeleniumコード(JARファイル、またはコンパイル済みのWikipediaAutomationクラスを含むクラスパス)をRobotのクラスパスに追加してください。
4.4 並列ブラウザ自動化(負荷テスト)
並列ブラウザ自動化のサポートは、リリース7.2.6で導入されました。その目的は、ストレステストや負荷テストの目的で、1つのRobotセッションから複数のブラウザを並列に操作できるようにすることです。主な機能:
-
ブラウザは、Selenium APIのみに依存するオブジェクト指向と画像ベースの両方の方式で操作できます。SeleniumベースのBrowserコマンドだけでなく、Mouse、CompareTo、Waitfor match、Click、MoveTo、Press、Type/Typelineといった従来のデスクトップコマンドを使用しても、Local Desktop接続に接続する必要なくブラウザを操作できます。
-
ただし、スクリプトの記録を有効にするには、依然としてLocal Desktop接続が必要です。スクリプトがブラウザのコンテンツのみを自動化する場合、生成されたスクリプトはその接続なしでも正常に動作するはずです。
-
画像ベースのテストは、表示されているブラウザのコンテンツのみに適用されます。一貫した結果を得るために、CLIオプションの
--start-maximizedを使用してブラウザウィンドウを最大化することを検討してください。 -
リソースの競合を避けるため、ブラウザは常に順次(1つずつ)起動されます。起動して実行された後は、自動化を並列に実行できます。
-
1つのテストスクリプト(.tprまたは.java)が操作できるのは一度に1つのブラウザのみです。Robot GUIは一度に1つのスクリプトしか実行できないため、起動できるブラウザも1つだけです。並列テストを実現するには、並列タスクを持つワークアイテムを作成し、CLIモード、すなわち-n/--nodisplayオプション付きで実行します。以下の例を参照してください。
-
並列テストはSafariではサポートされていません。Appleによる制限により、一度に実行できるSafariドライバのインスタンスは1つのみです。
-
ブラウザ接続は、当社のライセンス条項の対象となります。すなわち、ライセンスシートを消費します。
例:
T-Plazaというデモ用のWebアプリケーションを使って、ダミーの登録を自動化してみましょう。対象システムはMS Windows上のMS Edgeブラウザです。登録フォームを開き、個人データを入力して送信します。データは、共有のExcelシートの1行から読み込まれます:
行番号は、スクリプト内でROWという変数を通じて指定されます。この設計により、-v/--variable CLIスイッチを使用して、外部から行(すなわち登録する人)を設定できます。また、容易にスケールアップできます。別の人を登録するには、シートに個人データを含む新しい行を追加し、その新しい行を処理する別のタスク(スクリプトの実行)を作成するだけです。
スクリプトに進む前に、次を確認してください:
-
Robot 7.2.6以降で、少なくとも3つのライセンスシートがあること。確信が持てない場合は、Tools→License Key Managerウィンドウの表示内容を確認してください。
-
Robot 9.0以前を使用している場合は、お使いのEdgeブラウザに対応するバージョンのEdge web driverをダウンロードし、そのパスをSeleniumの設定に指定してください。
準備ができたら、サンプルプロジェクトをダウンロードしてください。アーカイブを展開し、File→Openプロジェクトメニュー項目を使用してRobotで開きます。このプロジェクトには、主に3つのファイルが含まれています:
-
tpr\data.xlsMS Excelファイルには、個人データが含まれています。 -
tpr\TPlaza.tprスクリプトは、ブラウザを操作して1件の登録を実行します。すぐに実行して、お使いの環境で正常に動作することを確認できます。 -
schedules\TPlaza.xmlワークアイテムは、TPlaza.tprスクリプトの3つのインスタンス(タスク)を並列に開始します。以下のスクリーンショットに示すように、各タスクは、スクリプトのCLIオプションを通じて渡される一意のExcel行番号を処理します:
すでに説明したとおり、Robot GUIは一度に1つのスクリプトと1つのブラウザしか操作できません。ここでワークアイテムを開始すると、タスクが並列ではなく順番に実行されるのが確認できます。実際に並列実行を実現するには、-nオプションを使用してCLIモードに切り替える必要があります。コマンドプロンプトを開き、Robotのインストールフォルダに移動して、次を実行します:
C:\Program Files (x86)\T-Plan\Robot> robot.bat -r C:\ParallelBrowserExample\schedules\TPlaza.xml -n
RobotはGUIなしで実行され、3つのブラウザを起動して自動化を並列に実行します。その後、GUIを起動して、プロジェクトツリーでレポートを確認できます。
ヒント: ワークアイテムエディタで