XPath を使用した部分文字列の比較は、動的な属性値の処理に役立ちます。
多くの場合、要素ロケーターでは等価比較を行います。たとえば、"id" 属性が "foo" に正確に一致する、テキストが "hello world" に正確に一致する (空白を無視する場合はあります) などです。
しかしときには、属性値またはテキスト コンテンツの一部だけを比較したい場合もあるでしょう。
例
たとえば、"transid_2010" のように、"固定値_動的値" という形式で "id" または "name" 属性値を生成する Web フレームワークもあります。属性値は常に "transid_" で始まりますが、"2010" の部分は動的値であり、次にページをロードしたときには "1984" である可能性があります。
固定された "transid_" という接頭辞だけで、要素をページ内でユニークに識別できるものと仮定します。その場合、"transid_" と比較を行い、属性値の動的部分を無視する簡単な XPath ロケーターを作成できます。
上で記したように、入力要素に "固定値_動的値" という形式の "name" 属性がある場合を考えてみます。/descendant::input[starts-with(@name, 'transid_')]
この XPath は、ドキュメント内のすべての場所を検索し、"name" 属性が "transid_" という文字列で始まる最初の <input> 要素を見つけます。XPath は "transid_" より後ろの文字を無視します。"starts-with" 関数や、その他の XPath 1.0 の関数は、http://www.w3.org/TR/xpath/ の W3C 勧告で説明されています (ブラウザーはバージョン 1.0 の XPath を使用します。従って SOAtest のブラウザー テストもバージョン 1.0 の XPath を使用します)。
文字列関数は、特に属性値またはテキスト コンテンツの一部を比較するために使用できます。文字列関数については、http://www.w3.org/TR/xpath/#section-String-Functions で説明されています。
たとえば、"contains" 関数は "starts-with" 関数と似ていますが、より寛容です。"contains" 関数は文字列の任意の位置にある部分文字列と一致します。次の XPath は、"something.transid_xyz" のような name 属性値が存在しない場合は、目的の入力要素に一致します。/descendant::input[contains(@name, 'transid_')]
他の XPath サンプルを参照したい場合、SOAtest が要素のプロパティ ロケーターに対して作成する XPath を確認できます。要素のプロパティ ロケーターを保存したら、ロケーターを [XPath の使用] に変更できます。
すると、SOAtest は保存された要素プロパティ ロケーターと同等に機能する XPath を表示します。
スクリプト作成か XPath かの選択
XPath になじみがない場合、わかりやすい要素プロパティ ロケーターがないときは、スクリプトを使用して DOM にアクセスしようと真っ先に考えるかもしれません。つまり、要素プロパティ ロケーターに対してスクリプトで記述された「属性値」を使用するか、「スクリプトの使用」ロケーターを使用するかです。
しかし、スクリプトの使用を考える前に、まず XPath ロケーターを作成できないかを検討してください。XPath ではさまざまな検索手段を使用できるほか、通常はスクリプトよりも XPath 式のほうが作成や保守が容易です。
特定の動的属性の使用を避ける
ロケーターで動的な "name" 属性 (またはその他の任意の属性) をまったく使用しないようにしたい場合、記録中にロケーターを生成する際、"name" 属性を使用しないように SOAtest を構成できます。これを行う方法については、「記録オプションのカスタマイズ」を参照してください。
たとえば一部の Web フレームワークは、SOAtest の観点からするとまったくランダムな値を "id" 値として生成します (たとえば "gwt-123" など)。そのような場合、ロケーターを作成する際に "id" を無視するとよいでしょう。