2013-07-09 146 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,可以在地方點擊使用任何事件()。