2010-05-11 13 views
7

He estado usando XPath con Selenium muy felizmente e incluso utilizando getEval con pero JavaScript, pero un colega dijo que no sería genial poder usar JQuery selectores en Selenio.Cómo agrego un localizador JQuery a Selenium Remote Control

Lo he buscado en Google, pero no encuentro ningún artículo que me funcione. ¿Podría alguien proporcionar una guía completa sobre cómo utilizar la sintaxis de JQuery para extraer los elementos de Doc y sus valores respectivos de selenio.

Estoy usando C# para escribir mis pruebas de selenio, por lo que si hubiera algún ejemplo desde la perspectiva de C# sería genial.

Gracias

Respuesta

9

Karl Swedberg escribió una excelente entrada de blog sobre él que se pueden encontrar en http://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarklet

Hemos adaptado esto y básicamente en el archivo jar del servidor El selenio se modificó para incluir el RemoteRunner.html jQuery JavaScript (obtenido de http://code.jquery.com/jquery-latest.min.js):

 <script language="JavaScript" type="text/javascript" src="jquery.min.js"></script> 
     <script language="JavaScript" type="text/javascript"> 
      function openDomViewer() { 
       var autFrame = document.getElementById('selenium_myiframe'); 
       var autFrameDocument = new SeleniumFrame(autFrame).getDocument(); 
       this.rootDocument = autFrameDocument; 
       var domViewer = window.open(getDocumentBase(document) + 'domviewer/domviewer.html'); 
       return false; 
      } 
     </script> 

continuación para habilitar esta para su uso en selenio le sumamos la estrategia de localización:

mySelenium.addLocationStrategy("jquery", 
      "var loc = locator; " + 
      "var attr = null; " + 
      "var isattr = false; " + 
      "var inx = locator.lastIndexOf('@'); " + 

      "if (inx != -1){ " + 
      " loc = locator.substring(0, inx); " + 
      " attr = locator.substring(inx + 1); " + 
      " isattr = true; " + 
      "} " + 

      "var found = jQuery(inDocument).find(loc); " + 
      "if (found.length >= 1) { " + 
      " if (isattr) { " + 
      "  return found[0].getAttribute(attr); " + 
      " } else { " + 
      "  return found[0]; " + 
      " } " + 
      "} else { " + 
      " return null; " + 
      "}" 
     ); 

Tenga en cuenta que la adición anterior de la estrategia del localizador está en Java, pero es solo una cadena, por lo que debe replicarse fácilmente en C#. JQuery hace que las cosas sean mucho más rápidas, ¡especialmente en Internet Explorer!

Para modificar el jar, puede usar la herramienta de línea de comandos java para actualizar el jar del servidor de selenio descargado. Cree una carpeta al mismo nivel que el contenedor llamado "core" y coloque allí los archivos RemoteRunner.html y jquery.min.js modificados. A continuación, ejecute algo como:

jar -uf selenium-server-standalone-2.0b3-APT.jar core\RemoteRunner.html 
jar -uf selenium-server-standalone-2.0b3-APT.jar core\jquery.min.js 

Si frasco no está en su camino puede utilizar la ruta completa, por ejemplo en las ventanas se podía ejecutarlo con algo como:

"C:\Program Files\Java\jdk1.6.0_22\bin\jar.exe" <arguments> 
+0

Me pareció muy intersting! pero la pregunta principal es: ¿cómo podemos usar esta extensión jquery, por ej.escriba un textarea seleccionado por jquery? –

+2

@Andreas simplemente utiliza el jquery = para iniciar su expresión del localizador y luego usa jquery! Ejemplo de expresión del localizador (intencionalmente, no es el ejemplo más simple): "jquery = table # myParentTableID> input.input-class" – Zugwalt

+0

gracias, ¡eso fue todo! –

0

que tendría que definir una nueva estrategia de localización usando el método AddLocationStrategy y tendrá que incluir en su archivo de jQuery-extensions.js usuario.

0

Puede leer y execute_script para habilitar jQuery:

  • Primero puede leer el jquery de un archivo jquery.js o jquery.min.js.
  • Luego, use execute_script (jquery) para habilitar jquery dinámicamente.
  • Ahora puedes interactuar con jquery.

Aquí hay un código en Python, otro lenguaje sería similar:

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: Cuando uso de selenio en busca de algún contenido de algún sitio, siempre me prohibición. Ahora deberías usar algún proxy para repasarlo.
Aquí hay un código:

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 
Cuestiones relacionadas