XPath のパフォーマンス問題のトラブルシューティング

複雑な Web アプリケーションの場合など、オブジェクトの構造が複雑なアプリケーションをテストする場合、パフォーマンスの問題や、スクリプトの信頼性に関連する問題が発生することがあります。このトピックでは、Silk4J が記録中に自動的に生成したロケーターとは異なるロケーターを使用して、スクリプトのパフォーマンスを向上させる方法について説明します。

注: 一般に、複雑なロケーターを使用することは推奨しません。複雑なロケーターを使用すると、テストの信頼性を損なう恐れがあります。複雑なロケーターは、テスト アプリケーションの構造をほんの少し変更しただけで機能しなくなってしまう可能性があります。それにもかかわらず、スクリプトのパフォーマンスが要求を満たしていない場合には、より固有のロケーターを使用することによってテストのパフォーマンスを向上できる可能性があります。
例として、MyApplication アプリケーションの要素ツリーを以下に示します。
Root
  Node id=1
    Leaf id=2
    Leaf id=3
    Leaf id=4
    Leaf id=5
  Node id=6
    Node id=7
      Leaf id=8
      Leaf id=9
    Node id=9
      Leaf id=10
以下の最適化手法のいくつかを使用して、スクリプトのパフォーマンスを改善させることができます。
  • 複雑なオブジェクト構造内の要素を特定したい場合は、オブジェクト構造全体ではなく、その特定の部分だけを検索するようにします。たとえば、サンプル ツリーの識別子 4 を持つ要素を検索する場合に Root.Find("//Leaf[@id='4']") というクエリーを使用している場合、Root.Find("/Node[@id='1']/Leaf[@id='4']") というクエリーで置き換えます。最初のクエリーでは、識別子 4 を持つリーフが、アプリケーションの要素ツリー全体から検索されます。そして、最初のリーフが見つかった時点で返されます。2 番目のクエリーでは、識別子 1 を持つノードと識別子 6 を持つノードがある最初のレベルのノードがまず検索された後、識別子 4 を持つすべてのリーフが識別子 1 を持つノードのサブツリー内から検索されます。
  • 同じ階層内の複数の項目を特定したい場合は、まずは階層を特定してからループ内で項目を特定します。Root.FindAll("/Node[@id='1']/Leaf") というクエリーを使用している場合、次のようなループで置き換えます。
    public void test() {
      TestObject node;
      int i;
        
      node = desktop.find("//Node[@id='1']");
      for (i=1; i<=4; i++)
      node.find("/Leaf[@id='"+i+"']"); 
    }