2013-07-09 148 views
11

我很新的硒的webdriver和我学习硒的webdriver如何使用jQuery选择与元素,而不是XPath表达式,标识等工作......硒的webdriver JQUERY

能否请您帮助我提供的链接,我可以找到关于如何在Selenium WebDriver中使用jQuery的基本信息?

+0

我不认为选择器在不同的框架上改变..这将是相同的 –

+0

谢谢。但是我的一些使用xpath,id的选择器并不适用于所有的浏览器。我搜索了它并获得了一个信息。使用JQUERY将解决所有问题。所以我想到学习Javascriptexecutor –

+2

谷歌搜索告诉你什么?我谷歌“硒jquery”,并得到大量的结果,特别是一些堆栈溢出帖子和b)为什么你需要使用jQuery?我理解在某些情况下,但在99%的情况下,你应该逃避本地定位器。什么不起作用?为什么?它怎么不起作用?你有没有试过CSS和XPath选择器?如果是的话,他们为什么不工作?你用了什么?向我们展示一些代码。什么地方出了错。它是怎么出错的。你预计会发生什么。 – Arran

回答

9

你不应该。 JQuery选择器提供了CSS 2和CSS 3选择器所做的大部分工作,还有更多的东西,但是你可能没有它。如果你知道JQuery选择器,你已经知道CSS选择器。

在可以的地方使用CSS选择器,并在XPath表达式不够用(它们更强大)的情况下使用XPath表达式。我怀疑你会发现许多真正的用法,其中这两个是不够的(然后,通常的做法是得到你可以和迭代集合,手动过滤结果)。


这就是说,你可能迫使webdriver的接受jQuery选择,太:

如果你只是想支持一个或两个浏览器,最简单的方法可能会写一个简单的插件到浏览器如果它不存在,它会将JQuery注入到每个页面。然后你会强制这个插件被你使用的浏览器使用。

如果你想支持所有的浏览器,该解决方案迅速成为一种负担,你能做的最好的就是写webdriver的一个装饰,将尝试任何findElements()和/或executeScript()调用之前jQuery注入的页面,如果它不存在。

查看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对象或新findElement(String jQuerySelector)方法为您装修的webdriver ,如果你想要,但是这取决于你的方便和懒惰,我们得到了它的工作...


最好的方法,我认为,是创建一个新的By实现所谓ByJQuery。有关如何制作ByJavaScript的信息,请参阅this answer - 从此处重新使用它只需一小步,将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 + ")\""; 
    } 
} 
+1

谢谢,这太棒了。只有我发现错误的是,在JQuery选择器中没有任何引号。我不得不改变它以读取'返回新的ByJavaScript(“return $(\”“+ query +”\“)”).findElements(context);'显然你需要知道最初的引号是双引号。 – mrswadge

1

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

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

我使用find_element_by_css_selector()它给我所有我需要的。

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

0

下面是用于使用点击动作的元件与jQuery选择

1).overlay选择器-indicator.ui-draggable.selected叠加选择所述代码块。UI调整大小

Webdriver driver = new SafariDriver(); 
JavascriptExecutor jse = (JavascriptExecutor)driver; 
jse.executeScript("$('.overlay-selector-indicator.ui-draggable.selected-overlay.ui-resizable').click();", ""); 

您可以使用任何jQuery选择,而不是1,可以在地方点击使用任何事件()。