问题 Selenium Webdriver JQUERY


我是Selenium WebDriver的新手,我正在学习Selenium WebDriver,了解如何使用jQuery选择器来处理元素而不是XPath表达式,ID等...

你能否帮我提供链接,在那里我可以找到有关如何在Selenium WebDriver中使用jQuery的基本信息?


2007
2017-07-09 18:11


起源

我不认为选择器会在不同的框架上发生变化..它会是相同的 - Sushanth --
谢谢。但是我的一些选择器使用xpath,id并不适用于所有浏览器。我用Google搜索并得到了一个信息。使用JQUERY将解决所有问题。所以我想到了学习Javascriptexecutor - Venkatesh Lakshmanan
谷歌搜索告诉你什么?我谷歌“selenium jquery”并得到了大量的结果,特别是一些堆栈溢出帖子和b)为什么你需要使用jQuery?我理解在某些情况下,但在99%的情况下,你应该逃避本机定位器。什么不起作用?为什么?怎么不行?你有没有尝试过CSS和XPath选择器?如果是的话,他们为什么不工作?你用的是什么?给我们看一些代码。什么地方出了错。怎么出错了你期望发生什么。 - Arran
第一个Google结果页面已经给了我足够的答案。但真正的问题是你是否正朝着正确的方向前进?如果您仍然可以说服自己在回答所有Arran的问题后需要使用JQuery,那么我们可以继续。 - Yi Zeng
谢谢!。这个问题的缩进是学习如何在Selenium Webdriver中使用JQUERY。我只是想知道是否有任何链接供初学者开始学习如何在Selenium Webdriver中使用jquery。在什么情况下我们应该使用?等等.. - Venkatesh Lakshmanan


答案:


你不应该。 JQuery选择器提供了CSS 2和CSS 3选择器的大部分功能,还有更多功能,但你可能没有它。如果您了解JQuery选择器,那么您已经了解了CSS选择器。

尽可能使用CSS选择器并使用XPath表达式,但这还不够(它们更强大)。我怀疑你会发现许多真正的用法,这两个是不够的(然后,通常的方法是获得你能做的,并迭代集合,手动过滤结果)。


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

如果您只想支持一个或两个浏览器,最简单的方法可能是在该浏览器上编写一个简单的插件,如果它不存在,它会将JQuery注入每个页面。然后,您可以强制将此插件用于您正在使用的浏览器。

如果你想支持所有的浏览器,那么这个解决方案很快就会成为一种负担,你可以做的最好的事情就是为WebDriver编写一个装饰器,它会尝试在任何浏览器之前将JQuery注入到页面中 findElements() 和/或 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 对象或新的 findElement(String jQuerySelector) 你喜欢的装饰WebDriver的方法,但这取决于你的方便和懒惰,我们让它工作......


我认为最好的方法是创建一个新方法 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 + ")\"";
    }
}

9
2017-07-22 10:01



谢谢,这很棒。我发现它唯一错误的是JQuery选择器中没有任何引号。我不得不改变它来阅读 return new ByJavaScript( "return $(\"" + query + "\")" ).findElements( context ); 显然,你需要知道最初的引号是双引号。 - mrswadge


iWebdriver jQuery扩展,这将适用于所有浏览器。复制并粘贴到您的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
2018-05-16 13:04





我用 find_element_by_css_selector() 它给了我所需要的一切。

根据 这篇博文,selenium使用与jquery相同的css引擎。


1
2018-04-13 18:30





下面是使用jquery选择器将click操作用于元素选择的代码块

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();", "");

您可以使用任何jquery选择器而不是1.并且可以使用任何事件代替click()。


0
2017-11-11 07:25