これが私が使用しようとしているXPathです:
//div[contains(@class='xyz ng-binding ng-scope') and not(contains(@class = 'ng-hide'))]
これの正しい構文が何かはわかりません。基本的に、HTMLは次のようになります。
class="xyz ng-binding ng-scope typeA ng-hide"
class="xyz ng-binding ng-scope typeB ng-hide"
HTMLがtypeA
またはtypeB
であるがng-hide
がない場合を選択します。
あなたはこのようなことをすることができます:
_//div[(contains(@class,'typeA') or contains(@class,'typeB')) and not(contains(@class,'ng-hide'))]
_
上記のcontains()
が意図したものと正確に一致しない理由を確認するには、 特定の文字列を含む属性でどのように一致させることができますか? も確認する必要があります。
たとえば、意図したものと完全に一致させるには、次のように使用できます。
_//div[(contains(concat(' ',@class,' '),' typeA ') or contains(concat(' ',@class,' '),' typeB ')) and not(contains(concat(' ',@class,' '),' ng-hide '))]
_
XPath 2.0の方がはるかに簡単ですが、qtpがサポートしているかどうかはわかりません。 concat(' ',@class,' ')
を変数にできれば、XPathもクリーンアップできます。
念のために2.0の例を示します。
_//div[tokenize(@class,'\s')=('typeA','typeB') and not(tokenize(@class,'\s')='ng-hide')]
_
contains()
は2つの引数を取る関数です。contains(A、B)は、BがAのサブストリングである場合にtrueを返します。
したがって、「=」を「、」に置き換えた場合、構文は有効になります:contains(@class, 'X')
の代わりにcontains(@class = 'X')
。しかし、それがすべての可能な入力データに対してあなたが望むことを行うかどうかはわかりません-それは別の質問です。
あなたの質問では、Michael Kayが指摘したように、構文は正しくありません。
あなたの質問を正しく理解した場合、「typeA」、「typeB」を含むかどうかに関係なく、「xyz ng-binding ng-scope」を含み、「ng-hide」を含まないクラスを選択する必要があります。
私はこのようなものを使用します:
//div[contains(normalize-space(@class), 'xyz ng-binding ng-scope') and not(contains(@class, 'ng-hide'))]
この状況ではスペースが問題を引き起こすことがよくあります。途中に先行および/または後続のスペースおよび/または複数の連続するスペース文字がある属性を見てきました。正規化スペースを使用すると、その問題が解消されます。
もう1つは、QTPで複数の一致エラーが発生した場合、このトリックを使用して、xpathが機能しているかどうかを確認できます。次に、正しいものを見つけるために作業を続けます。
(//div[contains(normalize-space(@class), 'xyz ng-binding ng-scope') and not(contains(@class, 'ng-hide'))])[1]
この式をXPATHに使用でき、以下が含まれます。
_//div[contains(@class, 'xyz ng-binding ng-scope')]
_
containsで_,
_の代わりに_=
_を使用するだけです。
そして、それを_not contain
_と組み合わせる場合は、この式をnot contains:not(expression)
関数に使用できます。最後に:
_//div[contains(@class, 'xyz ng-binding ng-scope') and not(contains(@class , 'ng-hide'))]
_