web-dev-qa-db-ja.com

Selenium WebDriver jQuery

私はSelenium WebDriverを初めて使用し、XPath式やIDなどを使用する代わりにjQueryセレクターを使用して要素を操作する方法を学んでいます...

Selenium WebDriverでjQueryを使用する方法についての基本的な情報を見つけることができるリンクを提供することで、私を助けていただけませんか?

13

あなたはすべきではない。 jQueryセレクターは、CSS 2およびCSS 3セレクターのほとんどの機能に加えて、さらに多くの機能を提供しますが、おそらくそれがなくても問題ありません。 JQueryセレクターを知っている場合は、CSSセレクターをすでに知っています。

可能な場合はCSSセレクターを使用し、不十分な場合(より強力な場合)はXPath式を使用します。これら2つでは不十分な実際の使用法がたくさんあるとは思えません(そして、通常のアプローチは、できることを取得してコレクションを反復処理し、結果を手動でフィルター処理することです)。


つまり、WebDriverがJQueryセレクターを受け入れるように強制することもできます。

1つまたは2つのブラウザーのみをサポートする場合、最も簡単な方法は、そのブラウザーに単純なアドオンを記述して、JQueryがまだ存在しない場合にすべてのページにJQueryを挿入することです。次に、このアドオンを、使用しているブラウザで使用するように強制します。

すべてのブラウザーをサポートする場合、そのソリューションはすぐに負担となり、最善の方法は、findElements()の前にJQueryをページに挿入しようとするWebDriverのデコレーターを作成することです。 executeScript()呼び出し(まだ存在しない場合)。

この質問 を参照して、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()");
_

必要に応じて、これらの行を新しいByオブジェクト、または装飾されたWebDriverの新しいfindElement(String jQuerySelector)メソッドに簡単にラップできますが、それは、利便性と遅延にかかっているため、機能します...


最善の方法は、Byという新しいByJQuery実装を作成することだと思います。 ByJavaScriptの作成方法については この答え を参照してください。これを再利用して、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 + ")\"";
    }
}
_
10
Petr Janeček

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
user3644719

私はfind_element_by_css_selector()を使用しており、必要なものがすべて提供されます。

このブログ投稿 によると、Seleniumはjqueryと同じcssエンジンを使用しています。

1
guettli

以下は、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();", "");

1の代わりに任意のjqueryセレクターを使用でき、click()の代わりに任意のイベントを使用できます。

0
Ali Azam