Selenium Webdriver JQUERY

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

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

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

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


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

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

如果你想支持所有的浏览器,那么这个解决方案很快就会成为一种负担,你可以做的最好的事情就是为WebDriver写一个装饰器,试图在任何findElements()和/或executeScript()调用之前将JQuery注入到页面中,如果它还没有出现。

请参阅此问题以了解有关注入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 elements = (List)js.executeScript("$('div.account').get()"); 

您可以轻松地将这些行包装到新的By对象中,或者为您的装饰WebDriver findElement(String jQuerySelector)一个新的findElement(String jQuerySelector)方法,但这取决于您的方便和懒惰,我们让它工作……


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

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

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

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

下面是使用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()。