2010-07-13 9 views
12

Vorrei utilizzare Selenium per fare clic sulla scheda di un web in cui la scheda è stata creata dinamicamente con JQuery. C'è un problema, dal momento che è stato creato dinamicamente e la scheda non ha alcun ID collegato (solo l'ID di classe fornito), quindi sono a corto di indizio per cliccarci sopra usando Selenium.Come usare JQuery in selenio?

Dopo aver cercato su Google per 2 settimane, ho scoperto che si poteva fare usando JQuery iniettando JQuery in Selenium e riorganizzandolo in modo da supportare l'API JQuery. Ma il problema ora è che non so come attivare lo script JQuery in Selenium?

Esiste qualche risorsa là fuori o linee guida sull'impostazione di JQuery in Selenium? Come faccio a eseguire JQuery in Selenium?

risposta

9

Puoi provare a utilizzare il mio selenio lib a github.

Gestisce quasi l'intera API jquery meno le funzioni che utilizzano/richiedono gestore di passaggio:

HtmlUnitDriver drv = new HtmlUnitDriver(BrowserVersion.FIREFOX_3_6); 
drv.setJavascriptEnabled(true); 
try { 
    jQueryFactory jq = new jQueryFactory(); 
    jq.setJs(drv); 

    drv.get("http://google.com"); 
    jq.query("[name=q]").val("SeleniumJQuery").parents("form:first").submit(); 

    String results = jq.queryUntil("#resultStats:contains(results)").text(); 
    System.out.println(results.split(" ")[1] + " results found!"); 
} finally { 
    drv.close(); 
} 
+0

È fantastico e consente di risparmiare sul lavoro di integrazione. Grazie. –

+0

Il metodo noConflict di jQuery viene chiamato qui: https://github.com/Nthalk/SeleniumJQuery/blob/master/src/com/anteambulo/SeleniumJQuery/jQueryFactory.java#L144 – Nthalk

4

Dal momento che ha detto che non c'era bisogno di un ID, ma una classe:

(unica classe-ID fornita)

... una migliore è probabile che la risposta utilizzi la strategia del localizzatore CSS che è già integrata in Selenium in cui è possibile selezionare un elemento basato su una classe css o semplicemente utilizzando la logica selettore CSS (almeno per css2 e css3)

Quindi selezionare un elemento (div, span qualunque) che ha a classe specifica si può semplicemente utilizzare questo per il localizzatore Selenio:

css=.class-ID 

È anche possibile utilizzare selettori più complesse che sono simili a quelli disponibili in JQuery come ad esempio:

css=#myDiv .class-ID 

Questo cercherà per l'elemento con uno stile css di class-ID all'interno dell'elemento con ID = myDiv.

2

Si potrebbe utilizzare window.jQuery al comando getEval:

|getEval | window.jQuery('div#main button').click(); | | 

Si lavora per me su Selenio IDE.

Per FF3, utilizzare wrappedJSObject ottenere l'oggetto jQuery:

|getEval | win = (this.page().getCurrentWindow().wrappedJSObject) ? this.page().getCurrentWindow().wrappedJSObject : this.page().getCurrentWindow() | | 
|getEval | jq = win.jQuery | | 
|assertEval | jq("div#main button").text() | click me! | 
3
  • In primo luogo si può leggere il jquery da un jquery.js o file di jquery.min.js.
  • Quindi utilizzando execute_script (jquery) per abilitare jquery in modo dinamico.
  • Ora puoi interagire con jquery.

Ecco il codice:

browser = webdriver.Firefox() # Get local session of firefox 

with open('jquery.min.js', 'r') as jquery_js: #read the jquery from a file 
    jquery = jquery_js.read() 
    browser.execute_script(jquery) #active the jquery lib 

#now you can write some jquery code then execute_script them 
js = """ 
    var str = "div#myPager table a:[href=\\"javascript:__doPostBack('myPager','%s')\\"]" 
    console.log(str) 
    var $next_anchor = $(str); 
    if ($next_anchor.length) { 
     return $next_anchor.get(0).click(); //do click and redirect 
    } else { 
     return false; 
    }""" % str(25) 

success = browser.execute_script(js) 
if success == False: 
    break 

PS: Quando uso selenio per andare a prendere un po 'di contenuti da qualche sito web, mi hanno sempre vietare. Ora dovresti usare qualche proxy per controllarlo.
Ecco il codice:

PROXY_HOST = "127.0.0.1" 
PROXY_PORT = 8087 
SOCKS_PORT = 8088 

fp = webdriver.FirefoxProfile() 

# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5 
fp.set_preference("network.proxy.type", 1) 

fp.set_preference("network.proxy.http", PROXY_HOST) 
fp.set_preference("network.proxy.http_port", PROXY_PORT) 
fp.set_preference("network.proxy.socks", PROXY_HOST) 
fp.set_preference("network.proxy.socks_port", SOCKS_PORT) 
fp.set_preference("network.proxy.ftp", PROXY_HOST) 
fp.set_preference("network.proxy.ftp_port", PROXY_PORT) 
fp.set_preference("network.proxy.ssl", PROXY_HOST) 
fp.set_preference("network.proxy.ssl_port", PROXY_PORT) 

fp.set_preference("network.proxy.no_proxies_on", "") # set this value as desired 

browser= webdriver.Firefox(firefox_profile=fp) # with proxy 
browser = webdriver.Firefox() # no proxy 
browser.get("http://search.example.com") # Load page 

elem = browser.find_element_by_id("query_box") # Find the query input 
elem.send_keys(u'my query string') # send query string to the input 
elem.submit() # submit the query form 
3

La mia squadra appena finito una libreria che avvolge le funzioni jQuery per l'uso con selenio. Abbiamo appena terminato la nostra prima versione, ma abbiamo in programma di completare TUTTE le funzioni di jquery. Questa libreria semplifica l'utilizzo di jQuery dai test di selenio in C#. Rende i test MUCH più puliti. Ecco il codice sorgente: https://github.com/AcklenAvenue/JQSelenium

+3

si cita C#, supporta JAVA? – huahsin68

Problemi correlati