Selenium Webdriver JQUERY

Eu sou muito novo para Selenium WebDriver e estou aprendendo Selenium WebDriver sobre como usar seletores de jQuery para trabalhar com elementos em vez de expressões XPath, IDs, etc …

Você poderia, por favor, me ajudar fornecendo o link onde eu posso encontrar as informações básicas sobre como usar o jQuery no Selenium WebDriver?

Você não deveria. Os seletores JQuery oferecem a maioria dos seletores CSS 2 e CSS 3, além de algo mais, mas você provavelmente pode viver sem ele. Se você conhece os seletores da JQuery, já conhece os seletores CSS.

Use seletores CSS onde você pode e use expressões XPath onde não é suficiente (elas são mais fortes). Eu duvido que você encontre muitos usos reais onde estes dois não são suficientes (e então, a abordagem usual é obter o que você pode e iterar sobre a coleção, filtrando os resultados manualmente).


Dito isso, você poderia forçar o WebDriver a aceitar seletores JQuery também:

Se você deseja apenas suportar um ou dois navegadores, a maneira mais fácil seria escrever um complemento simples para esse navegador, o qual injetaria o JQuery em todas as páginas, se ainda não estivesse presente. Você então forçaria esse addon a ser usado pelo navegador que você está usando.

Se você quiser oferecer suporte a todos os navegadores, essa solução rapidamente se torna um fardo e o melhor que você pode fazer é escrever um decorador para o WebDriver que tente injetar JQuery na página antes de qualquer findElements() e / ou executeScript() , se já não estiver presente.

Veja esta pergunta para ter uma idéia sobre como injetar JQuery.

Depois de ter injetado, você poderá usá-lo novamente, somente via 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()"); 

Você pode facilmente agrupar essas linhas em um novo object By , ou um novo findElement(String jQuerySelector) para o seu WebDriver decorado, se você quiser, mas isso é da sua conveniência e preguiça, nós conseguimos trabalhar …


A melhor abordagem, eu acho, seria criar uma nova implementação By chamada ByJQuery . Veja esta resposta sobre como criar um ByJavaScript – é uma pequena etapa para reutilizá-lo, injetar JQuery na página e executar a consulta real.

 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 Extension, Isso funcionará em todos os navegadores. Copie e cole na extensão do seu 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); } 

Eu uso find_element_by_css_selector() e isso me dá tudo que eu preciso.

De acordo com este post , o selenium usa o mesmo mecanismo de CSS que o jquery.

Abaixo está o bloco de código para usar a ação de clique para o elemento selecionando com o seletor de 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();", ""); 

Você pode usar qualquer seletor de jquery em vez de 1. e pode usar qualquer evento no lugar de click ().