2013-07-09 15 views
11

Ich bin sehr neu für Selen WebDriver und ich lerne Selenium WebDriver wie jQuery Selektoren zu verwenden, um mit Elementen anstelle von XPath-Ausdrücken arbeiten, IDs, etc ...Selen WebDriver JQUERY

Könnten Sie bitte helfen Ich über den Link, wo ich die grundlegenden Informationen zur Verwendung von jQuery im Selenium WebDriver finden kann?

+0

Ich glaube nicht, Selektoren auf einem anderen Rahmen ändern .. Es wäre das gleiche –

+0

danke. Aber einige meiner Selektor mit Xpath, ID funktioniert nicht alle Browser. und ich habe es gegoogelt und eine Information bekommen. Mit JQUERY lösen Sie alle Probleme. Also dachte ich daran Javascriptxecutor zu lernen –

+2

Was hat Ihnen Googeln gesagt? Ich google "Selen Jquery" und bekomme eine Menge Ergebnisse, vor allem eine Reihe von Stack-Überlauf Beiträge und b) Warum genau müssen Sie jQuery verwenden? Ich verstehe in einigen Fällen, aber in 99% der Fälle sollten Sie mit den nativen Locators durchkommen. Was funktioniert nicht? Warum? Wie funktioniert es nicht? Haben Sie CSS- und XPath-Selektoren ausprobiert? Wenn ja, warum haben sie nicht gearbeitet? Was hast du benutzt? Zeig uns etwas Code. Was schief gelaufen ist. Wie es schief gelaufen ist. Was Sie erwartet haben. – Arran

Antwort

9

Sie sollten nicht. JQuery-Selektoren bieten das meiste, was CSS 2 und CSS 3 Selektoren tun, plus etwas mehr, aber Sie können wahrscheinlich ohne es leben. Wenn Sie JQuery-Selektoren kennen, kennen Sie bereits CSS-Selektoren.

Verwenden Sie CSS-Selektoren, wo Sie können und verwenden Sie XPath-Ausdrücke, wo es nicht genug ist (sie sind stärker). Ich bezweifle, dass Sie viele echte Verwendungen finden, wo diese beiden nicht genug sind (und dann ist der übliche Ansatz, um zu bekommen, was Sie können und über die Sammlung iterieren, die Ergebnisse manuell filtern).


Das heißt, Sie möglicherweise WebDriver zwingen könnte JQuery Selektoren zu akzeptieren, auch:

Wenn Sie nur ein oder zwei Browser unterstützen möchten, ist der einfachste Weg, um ein einfaches Add-on zu diesem Browser schreiben könnte zu Das würde JQuery auf jeder Seite einfügen, wenn es nicht bereits vorhanden ist. Sie würden dann erzwingen, dass dieses Add-On für den von Ihnen verwendeten Browser verwendet wird.

Wenn Sie allen Browsern unterstützt werden soll, diese Lösung wird schnell eine Last und das Beste, was Sie tun können, ist ein Dekorateur für WebDriver zu schreiben, die versuchen würde, JQuery in die Seite, bevor eine findElements() und/oder executeScript() Anruf zu injizieren wenn es nicht schon vorhanden ist.

Siehe this question, um eine Vorstellung über die Injektion von JQuery zu erhalten.

Nachdem Sie es injiziert haben, können Sie es verwenden, wieder nur über 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()"); 

Sie können ganz einfach diese Zeilen in eine neue By Objekt wickeln oder eine neue findElement(String jQuerySelector) Methode für Ihre dekoriert WebDriver wenn Sie wollen, aber das ist bis zu Ihrer Bequemlichkeit und Faulheit, haben wir es arbeitet ...


Der beste Ansatz, glaube ich, wäre eine neue By Implementierung ByJQuery genannt zu erstellen. Siehe this answer zum Erstellen eines ByJavaScript - es ist ein kleiner Schritt von dort, es wieder zu verwenden, JQuery in die Seite zu injizieren und die eigentliche Abfrage auszuführen.

+1

Danke, das ist großartig. Einzig was ich falsch fand, war, dass es im JQuery-Selektor keine Anführungszeichen gibt. Ich musste es ändern, um 'return new ByJavaScript 'zu lesen (" return $ (\ "" + query + "\") ") .findElements (context);' Offensichtlich müssen Sie dann wissen, dass die ersten Anführungszeichen doppelte Anführungszeichen sind. – mrswadge

1

iWebdriver jQuery Erweiterung, Dies funktioniert über alle Browser. Kopieren Sie und fügen Sie sie in Ihre Webdriver-Erweiterung ein.

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

Ich benutze find_element_by_css_selector() und es gibt mir alles, was ich brauche.

Laut this blog post verwendet Selen die gleiche css-Engine wie jQuery.

0

Unten ist der Codeblock für den Einsatz der Klick-Aktion auf das Element mit dem Wählschalter jquery Auswählen

1) .overlay-Selektor-indicator.ui-draggable.selected-Overlay.ui-resizable

Webdriver driver = new SafariDriver(); 
JavascriptExecutor jse = (JavascriptExecutor)driver; 
jse.executeScript("$('.overlay-selector-indicator.ui-draggable.selected-overlay.ui-resizable').click();", ""); 

Sie alle jQuery-Selektor statt 1 verwenden können und jedes Ereignis statt Klick können().