2013-07-09 24 views
11

Ben Selenyum WebDriver çok yeniyim ve benSelenyum Webdriver JQUERY

Lütfen yardımcı olur ... yerine XPath ifadeleri, kimlikler, vb unsurları ile çalışmak için jQuery seçicileri nasıl kullanılacağına ilişkin Selenyum WebDriver öğreniyorum Selenium WebDriver'da jQuery'yi nasıl kullanacağım hakkında temel bilgileri bulabileceğim bağlantıyı sağladım?

+0

Seçicilerin farklı bir çerçeve üzerinde değiştiğini sanmıyorum. Aynı –

+0

da olur. Ama benim seçicimin bir kısmı xpath kullanıyor, id tüm tarayıcıları çalışmıyor. ve ben googled ve bilgi aldım. JQUERY kullanarak tüm sorunları çözecektir. Bu yüzden Javascriptexecutor öğrenmeyi düşündüm –

+2

Googling size ne anlattı? Ben google "selenium jquery" ve bir dizi sonuç, özellikle yığın taşma mesajlarının bir dizi ve b) Neden jQuery kullanmanız gerekir? Bazı durumlarda anlıyorum, ancak vakaların% 99'unda, yerel yer belirleyicilerinden uzaklaşmalısınız. Ne çalışmıyor? Niye ya? Nasıl çalışmıyor? CSS ve XPath seçicilerini denediniz mi? Eğer evetse, neden işe yaramadılar? Ne kullandın Bize biraz kod göster. Ne yanlış gitti. Nasıl yanlış gitti. Ne olmasını bekliyordun? – Arran

cevap

9

Siz değilsiniz. JQuery seçicileri, CSS 2 ve CSS 3 seçmenlerinin çoğunu sunar, artı bir şey daha sunar, ancak muhtemelen onsuz yaşayabilirsiniz. JQuery seçicilerini biliyorsanız, CSS seçicilerini zaten biliyorsunuz.

Yeterli olmayan yerlerde (daha kuvvetli) XPath ifadelerini kullanabileceğiniz ve kullanabileceğiniz CSS seçicilerini kullanın. Bu ikisinin yeterli olmadığı pek çok gerçek kullanım bulacağınızdan şüpheliyim (ve daha sonra, olağan yaklaşımı elde edebileceğiniz sonuçlara ulaşmak ve sonuçları manuel olarak filtrelemek). Eğer sadece bir veya iki tarayıcıları desteklemek istiyorsanız o tarayıcıya basit addon yazmak için

, en kolay yolu olabilir:


muhtemelen de JQuery seçicileri kabul etmeye WebDriver zorlayacağını söyledi That Zaten mevcut değilse JQuery'yi her sayfaya enjekte eder. Ardından, kullandığınız tarayıcı tarafından kullanılacak bu eklentiyi zorlarsınız. Eğer tarayıcıların tüm desteklemek istiyorsanız

, o çözüm hızlı bir yük haline gelir ve yapabileceğinin en iyisi herhangi findElements() ve/veya executeScript() çağrı önce sayfanın içine JQuery enjekte etmeye çalışacağını WebDriver için bir dekoratör yazmaktır eğer zaten mevcut değilse.

JQuery'yi enjekte etme hakkında fikir sahibi olmak için this question numaralı telefona bakın.

bunu enjekte sonra, sadece JavaScript aracılığıyla yine kullanabilirsiniz:

// 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()"); 

kolayca dekore WebDriver için yeni By nesnesine bu satırları kaydırmak veya yeni findElement(String jQuerySelector) yöntem olabilir istediğiniz, ama bu size kolaylık ve tembellik kalmış ise, bunun ByJQuery denilen


iyi yaklaşım, bence, yeni bir By uygulanmasını oluşturmak olacaktır ... çalışma var. ByJavaScript'un nasıl yapılacağı hakkında this answer'a bakın. Yeniden kullanmak için JQuery'yi sayfaya enjekte etmek ve gerçek sorguyu çalıştırmak için küçük bir adımdır.

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

Teşekkürler, bu harika. Yanlış bulduğum tek şey, JQuery seçicisinde herhangi bir tırnak bulunmamasıydı. '' Yeni ByJavaScript 'i döndürmek için onu değiştirmek zorunda kaldım ("$ (\" "+ sorgu +" \ ") döndürün.) .findElements (context); Ob Açıkça o zaman ilk alıntıların çift tırnak olduğunu bilmeniz gerekir. – mrswadge

1

iWebdriver jQuery Extension, Bu, tüm tarayıcılarda çalışacaktır. Webdriver uzantınıza kopyalayıp yapıştırın.

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

Ben find_element_by_css_selector() kullanmak ve bu beni tüm ihtiyacım verir.

this blog post'a göre, selenium, jquery does ile aynı css motorunu kullanır.

0

Aşağıda jquery seçicisi

1) .overlay-seçici-indicator.ui-draggable.selected-bindirme ile seçilerek elemana tıklama işlemi kullanmak için kod bloğudur.ui-boyutlandırılabilir

Webdriver driver = new SafariDriver(); 
JavascriptExecutor jse = (JavascriptExecutor)driver; 
jse.executeScript("$('.overlay-selector-indicator.ui-draggable.selected-overlay.ui-resizable').click();", ""); 
Sen 1 yerine herhangi jquery seçici kullanabilir ve tıklama yerine herhangi bir olay kullanabilirsiniz

().

İlgili konular