web-dev-qa-db-ja.com

Webdriverの公式ロケーター戦略

W3c webdirverの公式ドキュメント では、ロケーション戦略は次のように明記されています。

State   Keyword
CSS selector    "css selector"
Link text selector  "link text"
Partial link text selector  "partial link text"
Tag name    "tag name"
XPath selector  "xpath"

ただし、 Seleniumのワイヤプロトコル は許可されます。

class name  
css selector
id  
name
link text
partial link text
tag name
xpath

THEORYでは、Seleniumのドキュメントは廃止され、「実際の」ストーリーは新しいスペックドキュメントに含まれています。しかしながら...

最新のChrome独自のWebdriverでいくつかのテストを実行したところ、nameclass name両方とも機能します。ただし、仕様には含まれていません。

Chromiumの問題については、公式のWebdriver仕様のみを実装することを読んだことを覚えています。

さて:私はknow「仕様が常に100%続くとは限らない」などの一般的な答えなどです。しかし、私が知りたいことは次のとおりです。

  • これを実装するChromiumのコードを見つけることができますか? (リンクは大歓迎です)
  • これらについてChromiumメーリングリストで議論されましたか?
  • 「非公式」コマンド(「古い」Selenium仕様ファイルに記載されている)は残りますか?どこで読んだの?
18
Merc

はい、あなたはそれを正しく見ました。

現在のようにWebDriver - W3C Candidate RecommendationLocator Strategies 参加するのは次のとおりです。

  • "css selector":CSSセレクタ
  • "link text":リンクテキストセレクター
  • "partial link text":部分リンクテキストセレクター
  • "tag name":タグ名
  • "xpath":XPathセレクター

スナップショット:

Locator Strategies

ただし、 JsonWireProtocol は、Locatorをサポートするために使用されていました戦略は以下にリストされていますが、現在のドキュメントでは、Status[〜#〜] obsolete [〜 #〜]

  • class name:クラス名に検索値が含まれる要素を返します。複合クラス名は許可されていません。
  • css selector:CSSセレクタに一致する要素を返します。
  • id:ID属性が検索値と一致する要素を返します。
  • name:NAME属性が検索値と一致する要素を返します。
  • link text:表示されているテキストが検索値と一致するアンカー要素を返します。
  • partial link text:表示テキストが検索値と部分的に一致するアンカー要素を返します。
  • tag name:タグ名が検索値と一致する要素を返します。
  • xpath:XPath式に一致する要素を返します。提供されたXPath式は「そのまま」サーバーに適用する必要があります。式が要素のルートに関連していない場合、サーバーはそれを変更しないでください。その結果、XPathクエリは、ルート要素のサブツリーに含まれていない要素を返す場合があります。

スナップショット:

Locator Strategies

変更は、それぞれのclient特定のバインディングを介して伝播されました。 Selenium-Javaクライアントは クライアントコード であり、ユーザーのためにスイッチケースが機能しています。

        switch (using) {
          case "class name":
            toReturn.put("using", "css selector");
            toReturn.put("value", "." + cssEscape(value));
            break;

          case "id":
            toReturn.put("using", "css selector");
            toReturn.put("value", "#" + cssEscape(value));
            break;

          case "link text":
            // Do nothing
            break;

          case "name":
            toReturn.put("using", "css selector");
            toReturn.put("value", "*[name='" + value + "']");
            break;

          case "partial link text":
            // Do nothing
            break;

          case "tag name":
            toReturn.put("using", "css selector");
            toReturn.put("value", cssEscape(value));
            break;

          case "xpath":
            // Do nothing
            break;
        }
        return toReturn;

スナップショット:

Java_classname_id_name_tagname

さて、あなたの質問は、なぜW3C Specsおよびclients内。 #1042 によると、WebDriver Contributorsからの回答は次のように非常に単純でした:

This keeps the specification simple as these can be implemented using the CSS selector, which maps down to querySelector/querySelectorAll.

20
DebanjanB