首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Selenium WebDriver jQuery

Selenium WebDriver jQuery
EN

Stack Overflow用户
提问于 2013-07-10 02:11:27
回答 4查看 34.3K关注 0票数 13

我对Selenium WebDriver非常陌生,我正在学习如何使用jQuery选择器来处理元素,而不是使用XPath表达式、I等……

您能帮我提供一个链接,在那里我可以找到一些关于如何在Selenium WebDriver中使用jQuery的基本信息吗?

EN

回答 4

Stack Overflow用户

发布于 2013-07-22 18:01:47

JQuery选择器提供了CSS2和CSS3选择器的大部分功能,还提供了更多功能,但你可能没有它也能活下去。如果你知道JQuery选择器,你就已经知道了。

尽可能使用CSS选择器,在不够的地方使用XPath表达式(它们更强大)。我怀疑您会发现这两种方法不够用的实际用法(然后,通常的方法是获取您所能获得的东西并迭代集合,手动过滤结果)。

也就是说,您也可以强制WebDriver接受JQuery选择器:

如果您只想支持一个或两个浏览器,最简单的方法可能是为该浏览器编写一个简单的插件,该插件将把JQuery注入到每个页面中。然后,您将强制该插件被您使用的浏览器使用。

如果您希望支持所有浏览器,那么该解决方案很快就会成为一种负担,最好的做法是为WebDriver编写一个装饰器,尝试在任何findElements()和/或executeScript()调用之前将JQuery注入页面。

有关注入JQuery的概念,请参阅this question

注入之后,您只能通过JavaScript再次使用它:

代码语言: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)方法,但这取决于您的便利性和惰性,我们让它正常工作……

我认为,最好的方法是创建一个名为ByJQuery的新By实现。有关如何创建ByJavaScript的信息,请参阅this answer --重用它、将JQuery注入页面并运行实际的查询只需很小的一步。

代码语言:javascript
复制
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 + ")\"";
    }
}
票数 11
EN

Stack Overflow用户

发布于 2014-05-16 21:04:17

iWebdriver jQuery扩展,这将适用于所有浏览器。复制并粘贴到您的webdriver扩展。

代码语言:javascript
复制
  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);
    }
票数 2
EN

Stack Overflow用户

发布于 2016-04-14 02:30:18

我使用find_element_by_css_selector(),它为我提供了所需的一切。

根据this blog post的说法,selenium使用与jquery相同的css引擎。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17555280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档