1

要素に緑色の境界線があるかどうかを Selenium でチェックインしようとしています。

を使用して、解析済みのスタイル文字列を適用することができます...そして、文字列検索を使用して境界線を検索します...短縮形 ( ) を表示するブラザーと展開された ( ) を表示する他の//div[@id="target"]/@styleブラザーを回避する必要があります ...しかし、どうすればよいでしょうか私はそれをもっときれいにしますか?border: solid 3px greenborder-style: solid; border-color: green....

理想的には次のようなものです://div[@id="target"]/@style.borderColor

containsまた、構文がひどいため、セレクターの使用は避けたいと思います。しかし、それが唯一の方法なら、それでいいのです。もちろん。

4

1 に答える 1

4

XPath は CSS スタイルについて何も知りません。属性を理解せず、単純な文字列として受け取ります。XML クエリ言語が CSS スタイルを理解するのは奇妙ですよね?

さらに、 はXPath にgetAttribute()た構造を使用しますが、 XPath は使用しません! また、記号を介して属性を選択します。しかし、このロケーターを考えてみてください: . それは機能しますが、間違いなく XPath ではありません。@"id=target@style"

また、内部で計算された値ではなく、明示的に設定された属性を返すstyleため、実際にstyle要素に属性がない限り役に立ちません。style属性が定義されている場合は、それを選択します。

Selenium 自体は正しい答えを提供できません (WebDriver にはgetCssValue()がありますが、Selenium RC には対応するものはありません)。

したがって、Selenium RC で要素の計算されたスタイル (すべてのソースから計算された最終的な値) を取得する唯一の方法は、JavaScript を使用することです。

(少し編集した後) 何年もの間私のために働いていたスクリプトはこれです ( quirksmode.orgから):

function getStyle(id, stylePropJs, stylePropCss) {
    var x = document.getElementById(id);
    if (x.currentStyle)
        var y = x.currentStyle[stylePropJs];
    else if (window.getComputedStyle)
        var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(stylePropCss);
    return y;
}

IE ではプロパティの JavaScript 名が必要ですが、他のすべてのブラウザでは CSS 名が使用されることに注意してください。また、省略形のプロパティを使用することはできず、拡張されたプロパティを必ず使用する必要があります。したがって、あなたの場合:

String script = "var x = document.getElementById('target');" +
                "if (x.currentStyle) var y = x.currentStyle['borderTopColor'];" +
                "else if (window.getComputedStyle) var y = document.defaultView.getComputedStyle(x,null).getPropertyValue('border-top-color');" +
                "y;";
String color = selenium.getEval(script);

これは、要素の上境界線の色を返します (境界線全体を取得するには、4 回呼び出す必要があります) target。しかし、何を推測します!すべてのブラウザーは、異なる形式で色を返します。幸いなことに、少なくとも Java では、Color簡単に再フォーマットできるクラスがあります。

String color = Color.fromString(color).asHex();

16 進数でエンコードされた色が格納されたので、それが緑色かどうかを簡単に確認できます。

于 2012-06-29T23:42:33.083 に答える