2017-03-26 11 views
1

私はCSSセレクタを持っていて、セレンでそれを適用しようとしていました。 CSSセレクターは.parentclass:not(:has(.childclass))です。クラスchildclassを持つ子孫要素を持たないすべての親要素を取得しようとしています。これはjQueryで完璧に動作します。しかし、セレンではうまくいかないようです。特定のクラスの子孫のないすべての要素のXPath?

私はXPathを試してみることにしました。上記のCSSセレクタとXPathの同等の機能は何ですか?私は次のように働くことができました: //*[contains(@class, 'parentclass')]。しかし、これは状態の最初の部分です。 XPathで、CSSクラスの子クラスを持つ子を含んでいない親だけが必要であると私はどのように言えますか?

答えて

1

このXPathの、

//*[contains(@class, 'parentclass') and not(*[contains(@class, 'childclass')])] 

@class属性"parentclass"が含まれており、その子供"childclass"を含む@class属性を持たないすべての要素を選択します。

space-padding trickを適用して、必要に応じて偽の部分文字列の一致を避けます。 OPのコメントあたり


更新:

:上記のXPathは簡単ではなく子供よりも、その子孫それらの要素を除外するように適合させることができる

、述べた条件を満たしています

//*[contains(@class, 'parentclass') and not(.//*[contains(@class, 'childclass')])] 
+0

残念ながら、推奨される解決策は機能しません。それでも、すべての親を返す。ここに私のXPath: '// li [contains(@class、 's-result-item')]ではなく' * '(@class、' s-sponsored-list-header '))] 'があります。このクエリは、クラス 's-sponsored-list-header'を持つ子要素を持つものであっても、クラス' s-result-item'を持つすべての 'li'を返します。しかし、クラス 's-sponsored-list-header'を持つ子要素を一切含まない親だけが必要です。 –

+0

ところで、子要素は第1レベルの子供を意味しません。それは、親の中のどのレベルでも可能です。たぶん、これが私がすべての親を得ている理由です。 –

+0

次のXPathの動作がうまくいきます: '// li [contains(@class、 's-result-item')ではなく、(.//* [@class、 's-sponsored-list-header' )] '。違いは、私はこの場合、私は親の中の任意のレベルで子要素を見つけることを試みていると信じている第二の条件にのみです。私は正しい?それは正しいクエリですか? –

関連する問題