2013-07-09 14 views
11

私はセレンwebdriverをに非常に新しいですし、私が代わりにXPath式、IDは、などの要素を操作するためのjQueryのセレクタを使用する方法についてセレンwebdriverを学んでいる...セレンwebdriverをjQueryの

あなたが助けてもらえSelenium WebDriverでjQueryを使用する方法に関する基本情報を見つけることができるリンクを提供していますか?

+0

セレクタが別のフレームワーク上で変更されるとは思わない。同じ –

+0

になります。しかし、xpathを使用している私のセレクタのいくつかは、すべてのブラウザで動作していません。私はそれをgoogledと情報を得た。 JQUERYを使用すると、すべての問題が解決されます。だから私はJavascriptexecutorを学ぶことを考えた –

+2

グーグルはあなたに何を伝えましたか?私はgoogle "selenium jquery"と結果のトン、特にいくつかのスタックオーバーフローポストを取得し、b)jQueryを使う必要があるのはなぜですか?私はいくつかのケースでは理解していますが、99%のケースでは、ネイティブのロケータを手に入れなければなりません。何が効いていないのですか?どうして?どのように動作していないのですか? CSSとXPathセレクタを試しましたか?はいの場合、なぜ彼らは働かなかったのですか?あなたは何を使いましたか?いくつかのコードを見せてください。何が悪かったのか。どのように間違っていた。あなたは何が起こると思いますか? – Arran

答えて

9

あなたはしません。 JQueryセレクタは、CSS 2セレクタやCSS 3セレクタの機能の大部分を提供していますが、それ以上の機能を備えている可能性もあります。 JQueryセレクタが分かっている場合、CSSセレクタはすでに分かっています。

XPath式が十分でない(より強い)場所で使用できるCSSセレクタを使用します。私はあなたがこれらの2つで十分ではない多くの実際の使用法を見つけることは疑いの余地があります(そして、通常のアプローチは、あなたができるものを手に入れてコレクションを繰り返し、結果を手作業でフィルタリングすることです)。

あなたはおそらくあまりにも、jQueryのセレクタを受け入れるようにwebdriverを強制でき、言っ

を使用すると、1つのまたは2つのブラウザをサポートしたい場合は、最も簡単な方法は、そのブラウザに簡単なアドオンを書くことかもしれませんJQueryがまだ存在しない場合は、すべてのページにJQueryを挿入します。このアドオンは、使用しているブラウザで強制的に使用されます。

すべてのブラウザをサポートしたい場合は、その解決方法はすぐに負担になります。できるだけ早くWebDriverのデコレーターを書くと、findElements()および/またはexecuteScript()の前にJQueryをページに挿入しようとします、それがまだ存在しないならば。

this questionを参照すると、JQueryの注入に関するアイデアが得られます。あなたはそれを注入した後は

、あなただけのJavaScriptを経由して、再び、それを使用することができます。

// earlier 
if (driver instanceof JavascriptExecutor) { 
    js = (JavascriptExecutor)driver; 
} else { 
    throw new IllegalStateException("This driver cannot run JavaScript."); 
} 

WebElement element = (WebElement)js.executeScript("$('div.account').get(0)"); 
// or 
List<WebElement> elements = (List<WebElement>)js.executeScript("$('div.account').get()"); 

をあなたが簡単に装飾されたwebdriverをするための新しいByオブジェクト、または新しいfindElement(String jQuerySelector)方法にそれらの行を折り返すことができますあなたがしたいが、それはあなたの利便性と怠惰次第です場合、我々はそれがByJQueryと呼ば


最善のアプローチは、私が思うに、新しいBy実装を作成することです...働いてました。 ByJavaScriptの作成方法については、this answerを参照してください。再利用し、JQueryをページに挿入し、実際のクエリを実行するための小さなステップです。

class ByJQuery extends By implements Serializable { 
    private final String query; 

    public ByJQuery(String query) { 
     checkNotNull(query, "Cannot find elements with a null JQuery expression."); 
     this.query = query; 
    } 

    @Override 
    public List<WebElement> findElements(SearchContext context) { 
     WebDriver driver = getWebDriverFromSearchContext(context); 

     if (!isJQueryInThisPage(driver)) { 
      injectJQuery(driver); 
     } 

     return new ByJavaScript("return $(" + query + ")").findElements(context); 
    } 

    private static WebDriver getWebDriverFromSearchContext(SearchContext context) { 
     if (context instanceof WebDriver) { 
      return (WebDriver)context; 
     } 
     if (context instanceof WrapsDriver) { 
      return ((WrapsDriver)context).getWrappedDriver(); 
     } 
     throw new IllegalStateException("Can't access a WebDriver instance from the current search context."); 
    } 

    private static boolean isJQueryInThisPage(WebDriver driver) { 
     // TODO Some JavaScript test for a JQuery object. 
    } 

    private static void injectJQuery(WebDriver driver) { 
     // TODO Load JQuery from a file, inject it into the page via JS. 
    } 

    @Override 
    public String toString() { 
     return "By.jQuery: \"$(" + query + ")\""; 
    } 
} 
+1

ありがとう、これは素晴らしいです。私が間違って見つけたのは、JQueryセレクタに引用符がないということだけでした。 .findElements(context); '明らかに、最初の引用符が二重引用符であることを認識する必要があります。 – mrswadge

1

iWebdriver jQuery Extension、これはすべてのブラウザで機能します。コピーしてあなたのwebdriver拡張機能に貼り付けます。

public static IWebElement FindByTextJQuery(this IWebDriver driver, string Tagname, string Text) 
    { 
     IJavaScriptExecutor js = (IJavaScriptExecutor)driver; 
     bool flag = (bool)js.ExecuteScript("return typeof jQuery == 'undefined'"); 
     if (flag) 
     { 
      js.ExecuteScript("var jq = document.createElement('script');jq.src = '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js';document.getElementsByTagName('head')[0].appendChild(jq);"); 
     } 
     driver.WaitForAjax(); 
     js.ExecuteScript("$('" + Tagname + ":contains(" + Text + ")').css('background-color', '')"); 
     IWebElement elements = (IWebElement)js.ExecuteScript(@"return $('"+Tagname+":contains("+Text+")')[0]"); 
     return elements; 
    } 

public static string getTextByJquery(this IWebDriver driver, string jquery) 
    { 
     IJavaScriptExecutor js = (IJavaScriptExecutor)driver; 
     string elementsText = (string)js.ExecuteScript("return $('" + jquery + "').text()"); 
     return elementsText; 
    } 

public static int returnIndexByJquery(this IWebDriver driver, string jQuery) 
    { 

     IJavaScriptExecutor js = (IJavaScriptExecutor)driver; 
     bool flag = (bool)js.ExecuteScript("return typeof jQuery == 'undefined'"); 
     if (flag) 
     { 
      js.ExecuteScript("var jq = document.createElement('script');jq.src = '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js';document.getElementsByTagName('head')[0].appendChild(jq);"); 
     } 
     driver.WaitForAjax(); 
     // js.ExecuteScript(@"return $('" + Tagname + ":contains(" + Text + ")').css('background-color', 'blue')"); 
     Int64 elementIndex = (Int64)js.ExecuteScript(@"return $('"+jQuery+"').index()[0]"); 
     return Convert.ToInt32(elementIndex);      
    } 

    public static int returnCountByJquery(this IWebDriver driver, string jQuery) 
    { 
     IJavaScriptExecutor js = (IJavaScriptExecutor)driver; 
     bool flag = (bool)js.ExecuteScript("return typeof jQuery == 'undefined'"); 
     if (flag) 
     { 
      js.ExecuteScript("var jq = document.createElement('script');jq.src = '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js';document.getElementsByTagName('head')[0].appendChild(jq);"); 
     } 
     driver.WaitForAjax(); 
     // js.ExecuteScript(@"return $('" + Tagname + ":contains(" + Text + ")').css('background-color', 'blue')"); 
     Int64 elementCount = (Int64)js.ExecuteScript(@"return $('" + jQuery + "').size()"); 
     return Convert.ToInt32(elementCount); 
    } 
1

私はfind_element_by_css_selector()を使用しています。私は必要なものすべてを提供します。

this blog postによれば、セレンはjqueryと同じCSSエンジンを使用します。

0

以下はjqueryのセレクタ

1).overlayセレクタ-indicator.ui-draggable.selectedオーバーレイと選択素子にクリック動作を使用するためのコードブロックです。UI-サイズ変更可能な

Webdriver driver = new SafariDriver(); 
JavascriptExecutor jse = (JavascriptExecutor)driver; 
jse.executeScript("$('.overlay-selector-indicator.ui-draggable.selected-overlay.ui-resizable').click();", ""); 
あなたは1ではなく、任意のjQueryのセレクタを使用することができ、クリックの代わりに任意のイベントを使用することができます

()。

関連する問題