web-dev-qa-db-ja.com

特定の文字列を含む属性をどのように照らし合わせますか?

属性に複数のWordが含まれていると、属性でノードを選択できません。例えば:

<div class="atag btag" />

これが私のxpath式です。

//*[@class='atag']

式はで動作します

<div class="atag" />

しかし前の例ではそうではありません。どうやって<div>を選択できますか?

414
crazyrails

これは属性の位置に関係なくそれらすべてを選択します

//div[contains(@class, 'atag') and contains(@class ,'btag')]
456
surupa123

mjvの答えは良いスタートですが、atagがリストの最初のクラス名でない場合は失敗します。

通常のアプローチはかなり扱いにくいです。

//*[contains(concat(' ', @class, ' '), ' atag ')]

これは、クラスがスペースでのみ区切られ、他の形式の空白ではない限り機能します。これはほとんど常にそうです。そうでないかもしれないなら、あなたはまだそれをもっと扱いにくくしなければなりません:

//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]

(クラス名のようにスペースで区切られた文字列で選択するのは、CSS3の '[class〜= "atag"]'のように、特別なXPath関数がないのは驚くべきことです)

291
bobince

_ edit _ start - with ではなく contains を使用するbobinceの解決方法を参照し、完全なトークンのレベルで比較が行われるようにします。 'atag'パターンが他の 'tag'の一部として見つけられないようにします。

"atag btag"はclass属性には奇数の値ですが、それ以上になることはありません。

//*[starts-with(@class,"atag")]
36
mjv

これを試してください://*[contains(@class, 'atag')]

30
SelenUser

動作する2.0 XPath。

//*[tokenize(@class,'\s+')='atag']

または変数を使って:

//*[tokenize(@class,'\s+')=$classname]
27
Daniel Haley

あなたが興味を持っているクラス名が他の可能なクラス名のサブストリングではないと仮定することができるならば、bobinceの答えは非常に複雑かもしれないことに注意してください これが当てはまる場合は、contains関数を使用して単純に部分文字列マッチングを使用できます。以下は、クラスが部分文字列 'atag'を含むすべての要素に一致します。

//*[contains(@class,'atag')]

上記の仮定が成り立たない場合、部分文字列の一致は意図しない要素と一致します。この場合は、Wordの境界を見つける必要があります。スペース区切り文字を使ってクラス名の境界を見つけることで、bobinceの2番目の答えは完全に一致するものを見つけます。

//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]

これはatagではなくmatagと一致します。

20
Brent Atkinson

Bobinceの答えに付け加えるなら...あなたが使っているツール/ライブラリがXpath 2.0を使っているなら、あなたはこれをやることができます。

//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]

index-of()は、文字列内で一致する各インデックスのシーケンスを返すため、count()が必要になります。

7

あなたは以下を試すことができます

By.CssSelector("div.atag.btag")

4
Umesh Chhabra

一般的なURLが含まれているリンクの場合は、変数でコンソール入力する必要があります。それからそれを順次試みなさい。

webelements allLinks=driver.findelements(By.xpath("//a[contains(@href,'http://122.11.38.214/dl/appdl/application/apk')]"));
int linkCount=allLinks.length();
for(int i=0; <linkCount;i++)
{
    driver.findelement(allLinks[i]).click();
}
0
user3906232