web-dev-qa-db-fra.com

Sélénium Webdriver JQUERY

Je suis très nouveau sur Selenium WebDriver et je découvre Selenium WebDriver sur l’utilisation des sélecteurs jQuery pour utiliser des éléments au lieu d’expressions XPath, d’ID, etc. 

Pourriez-vous s'il vous plaît m'aider à fournir le lien où je peux trouver les informations de base sur l'utilisation de jQuery dans Selenium WebDriver?

12

Vous ne devriez pas. Les sélecteurs JQuery offrent la plupart des fonctions des sélecteurs CSS 2 et CSS 3, plus encore, mais vous pouvez probablement vous en passer. Si vous connaissez les sélecteurs JQuery, vous connaissez déjà les sélecteurs CSS.

Utilisez des sélecteurs CSS là où vous le pouvez et des expressions XPath où ce n’est pas suffisant (ils sont plus forts). Je doute que vous trouviez de nombreux usages réels dans lesquels ces deux solutions ne suffisent pas (puis, l'approche habituelle consiste à obtenir ce que vous pouvez et à parcourir la collection, en filtrant les résultats manuellement).


Cela dit, vous pouvez éventuellement forcer WebDriver à accepter les sélecteurs JQuery:

Si vous souhaitez uniquement prendre en charge un ou deux navigateurs, le moyen le plus simple consiste à écrire dans ce navigateur un simple addon qui injecterait JQuery sur chaque page si elle n’est pas déjà présente. Vous forceriez alors cet addon à être utilisé par le navigateur que vous utilisez.

Si vous souhaitez prendre en charge tous les navigateurs, cette solution devient rapidement un fardeau et le mieux que vous puissiez faire est d'écrire un décorateur pour WebDriver qui tenterait d'injecter JQuery dans la page avant tout appel findElements() et/ou executeScript(), si ce n'est pas le cas. déjà présent.

Voir cette question pour vous faire une idée de l’injection de JQuery.

Une fois que vous l'avez injecté, vous pouvez l'utiliser à nouveau, uniquement via 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()");

Vous pouvez facilement envelopper ces lignes dans un nouvel objet By ou une nouvelle méthode findElement(String jQuerySelector) pour votre WebDriver décoré, si vous le souhaitez, mais cela dépend de votre convenance et de votre paresse, nous l'avons fait fonctionner ...


Je pense que la meilleure approche serait de créer une nouvelle implémentation de By appelée ByJQuery. Voir cette réponse sur la façon de créer une ByJavaScript - il suffit ensuite de la réutiliser, d’injecter JQuery dans la page et d’exécuter la requête.

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 + ")\"";
    }
}
10
Petr Janeček

iWebdriver jQuery Extension, cela fonctionnera sur tous les navigateurs. Copiez et collez dans votre 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
user3644719

J'utilise find_element_by_css_selector() et il me donne tout ce dont j'ai besoin.

Selon cet article de blog , Selenium utilise le même moteur CSS que jquery.

1
guettli

Vous trouverez ci-dessous le bloc de code permettant d'utiliser l'action de clic sur l'élément sélectionné avec le sélecteur jQuery

1) .overlay-selector-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();", "");

Vous pouvez utiliser n'importe quel sélecteur jquery au lieu de 1. et tout événement à la place de click ().

0
Ali Azam