【问题标题】:Selenium WebDriver jQuerySelenium WebDriver jQuery
【发布时间】:2013-07-07 11:25:36
【问题描述】:

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

您能否提供一个链接来帮助我,我可以在其中找到有关如何在 Selenium WebDriver 中使用 jQuery 的一些基本信息?

【问题讨论】:

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

标签: java jquery selenium selenium-webdriver webdriver


【解决方案1】:

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

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


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

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

如果您想支持所有浏览器,该解决方案很快就会成为一种负担,您可以做的最好的事情是为 WebDriver 编写一个装饰器,它会尝试在任何 findElements() 和/或 @ 之前将 JQuery 注入页面987654324@ 电话,如果它不存在的话。

请参阅this question 了解有关注入 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) 方法,但这取决于您的方便和懒惰,我们让它工作...


我认为最好的方法是创建一个名为ByJQuery 的新By 实现。请参阅 this answer 了解如何创建 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 + ")\"";
    }
}

【讨论】:

  • 谢谢,太好了。我发现它唯一的错误是 JQuery 选择器中没有任何引号。我不得不将其更改为 return new ByJavaScript( "return $(\"" + query + "\")" ).findElements( context ); 显然那么您需要注意初始引号是双引号。
【解决方案2】:

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);
    }

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      下面是使用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();", "");
      

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

      【讨论】:

        猜你喜欢
        • 2012-01-14
        • 1970-01-01
        • 2023-03-20
        • 2016-01-14
        • 2011-06-18
        • 2016-05-21
        • 2015-05-15
        • 2013-05-20
        • 2011-12-21
        相关资源
        最近更新 更多