User Tag List

Página 1 de 2 12 ÚltimoÚltimo
Resultados 1 al 15 de 18

Tema: Alguien sabe de javascript (casperjs)?

  1. #1

    Fecha de ingreso
    Sep 2005
    Ubicación
    Madri
    Mensajes
    438
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    13
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts

    Alguien sabe de javascript (casperjs)?

    Buenas.
    Espero que por aquí alguien experto en javascript me pueda echar una mano con un problemilla que tengo. Uso casperjs que a su vez tira de phantomjs.
    Llevo días intentando sacar de una web unos datos de unas tablas, pero para cargar las distintas tablas necesito hacer 'click' en unas pestañas, y no encuentro la manera de hacerlo.
    Parece que para poder trabajar sobre los elementos seleccionados en un mismo contexto debo usar la funcion 'evaluate' y de esa manera consigo obtener una lista de las 5 pestañas, pero cuando las recorro solo la primera no es nula. Tiene pinta que el error puede ser por la naturaleza asincrona de js, pero por mas modificaciones que hago siguiendo ejemplos que veo por internet (usar forEach en lugar de for o let en lugar de var), no consigo navegar correctamente por las pestañas para hacer click en ellas.

    Este es el codigo js:

    Código:
    var fs = require('fs');
    var casper = require('casper').create({
        pageSettings: {
            loadImages: false,//The script is much faster when this field is set to false
            loadPlugins: false,
            userAgent: 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'
        }
    });
    casper.start().thenOpen("http://pc.metalradar.com", 
    function() {
        console.log("MetalRadar website opened");
    });
    casper.then(function(){
        casper.wait(5000, function(){
            this.capture('home.png');
    	var tabs = casper.evaluate(function() {
            	//return document.querySelectorAll('ul#tabul li');
            	return document.querySelectorAll('span.dashTitle');
            });
            console.log('Num Tabs: ' + tabs.length);
    
    	    for(var i = 0; i < tabs.length; ++i) {            
    	        if(tabs[i]) {
    	            console.log('Tab exists');
    	            console.log('  form id: ' + tabs[i].id);
    	            // create a mouse click event
                        var event = document.createEvent( 'MouseEvents' );
                        event.initMouseEvent( 'click', true, true, window, 1, 0, 0 );             
                        // send click to element
                        tabs[i].dispatchEvent( event );
    
    	            var name = tabs[i].innerText + '.png'
    	            console.log("  " + name);
    	            casper.wait(2000, function(){
    	            	console.log("  Capturando...");
                		this.capture(name); //Make a screenshot for each tab
                	    });
    	        } else {
                    console.log("Null tab"); 
                }    
        })
        
    });
    Esta es la salida que obtengo:

    Código:
    Num Tabs: 5
    Tab exists
      form id: dbTabLabel_69451648299582
      Dashboard EUR.png
    Null tab
    Null tab
    Null tab
    Null tab
      Capturando...
    Si para el bucle utilizo forEach por el tema de asincronia:
    Código:
    tabs.forEach(function(tab) {
    ...
    })
    Me da el siguiente error:

    Código:
    TypeError: undefined is not a function (evaluating 'tabs.forEach'
    Este es el fragmento de html que quiero navegar donde las pestañas estan definidas como <li id="dbTab_**********":
    Código:
    <!--TEMPLATES-->
        <ul id="tabul">
            <li id="litab" class="ntabs add"><a href="" id="addtab" class="osx">+</a></li>
            <li id="litab" class="add rightAlign setting-item">
                <img src="/Content/images/icons/expand-24x24.png" class="out-triggerer gray" onclick="fullScreen()">            
            </li>        
            <li id="default-report-export" class="rightAlign">
                <a href="/report/defaultExport" download="">
                    <input type="image" src="/Content/images/icons/excel.gif" value="Excel" title="Export default report">
                </a>
            </li>
            <li id="default-report-export" class="rightAlign">
                <a href="/report/defaultExport?isPdf=true" download="">
                    <input type="image" src="/Content/images/export-pdf-24x24.png" value="Excel" title="Export default report">
                </a>
            </li>
            <li id="dbTab_889113733777776" class="ntabs addedTab activeTab">
                <span id="dbTabLabel_889113733777776" class="dashTitle" onclick="clickDashboard('889113733777776')">Dashboard EUR</span>
                <span id="dbTabSettings_889113733777776" class="settingsContainer dashSettings" style="">
                    <div id="topnav" class="topnav">
                        <a href="javascript:void(0)" class="signin" onclick="toggleTabSettingsMenu('889113733777776',true);">
                            <span><img src="/Content/Images/icon_gear.png" alt="Edit"></span>
                        </a>
                    </div>
                    <fieldset id="dbTabSettingsMenu_889113733777776" class="dashSettings-menu">
                        <ul class="dashboardEditMenu">
                            <img src="/Content/images/close.png" onclick="toggleTabSettingsMenu('889113733777776',false);" alt="tooltip" style="position:absolute;right:2px;top:2px;border:0;">
                            <li class="dashboardEditMenuList">
                                <a href="javascript:void(0)" class="addWidget" onclick="toggleLeftUpdatePanelMenu(true);"> Añadir widgets</a>
                            </li>
                            <li class="dashboardEditMenuList">
                                 <a href="javascript:void(0)" class="closeDash" onclick="deleteDashboard('889113733777776')"> Borrar este dashboard</a>
                            </li>
                        </ul>
                    </fieldset>
                </span>
            </li>
            <li id="dbTab_894967889413237" class="ntabs addedTab">
                <span id="dbTabLabel_894967889413237" class="dashTitle" onclick="clickDashboard('894967889413237')">Dashboard USD</span>
                <span id="dbTabSettings_894967889413237" class="settingsContainer dashSettings" style="display:none;">
                    <div id="topnav" class="topnav">
                        <a href="javascript:void(0)" class="signin" onclick="toggleTabSettingsMenu('894967889413237',true);">
                            <span><img src="/Content/Images/icon_gear.png" alt="Edit"></span>
                        </a>
                    </div>
                    <fieldset id="dbTabSettingsMenu_894967889413237" class="dashSettings-menu"> 
                        <ul class="dashboardEditMenu">
                            <img src="/Content/images/close.png" onclick="toggleTabSettingsMenu('894967889413237',false);" alt="tooltip" style="position:absolute;right:2px;top:2px;border:0;">
                            ...
                       </ul>
                </fieldset>
            </span>
        </li>
    </ul>

    Gracias por tragaros el tocho!!!! Si es que llegáis a leer hasta aquí. Espero haya solución a mi dolencia
    Última edición por crossmax; 03/04/2018 a las 13:11 Razón: añadir inicializacion casper

  2. #2

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,649
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,993
    Agradecer Thanks Received 
    5,820
    Thanked in
    Agradecido 3,793 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Nunca he usado esa librería :S

  3. #3

    Fecha de ingreso
    Sep 2005
    Ubicación
    Madri
    Mensajes
    438
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    13
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por josepzin Ver mensaje
    Nunca he usado esa librería :S
    Llegados al punto en el que estoy puedo usar lo que sea para que funcione
    Partí de casperjs porque ví ejemplos para hacer login sencillos y me funcionó, pero podría tirar por otro lado.
    El problema es que es lo primero que hago con js y no tengo ni idea. No sé si mi problema es la asincronía, el contexto del objeto o simplemente que la web tiene un AJAX infernal.

    Te dejo que me ilumines si quieres

  4. #4

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,649
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,993
    Agradecer Thanks Received 
    5,820
    Thanked in
    Agradecido 3,793 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Poco puedo iluminar yo! hago cosas con js pero en este caso no tengo idea... ¿no puedes tirar de JQuery?

  5. #5

    Fecha de ingreso
    Nov 2005
    Ubicación
    Madrid
    Mensajes
    4,183
    Mencionado
    16 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    56
    Agradecer Thanks Received 
    253
    Thanked in
    Agradecido 154 veces en [ARG:2 UNDEFINED] posts
    Seguro que ya lo has pensado, pero yo lo primero que haría es ver como se rellena esa tabla, quizás esté haciendo una consulta a un servicio para rellenarse y tú puedes consultar a ese servicio directamente?

    Con la consola de chrome puedes ver las llamadas que se hacen, ya sabes.

    Siempre será más facil eso que hacer un scrapping como el que estás haciendo.

    Saludos!

  6. El siguiente usuario agradece a Estopero este mensaje:

    crossmax (03/04/2018)

  7. #6

    Fecha de ingreso
    Sep 2005
    Ubicación
    Madri
    Mensajes
    438
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    13
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por Estopero Ver mensaje
    Seguro que ya lo has pensado, pero yo lo primero que haría es ver como se rellena esa tabla, quizás esté haciendo una consulta a un servicio para rellenarse y tú puedes consultar a ese servicio directamente?

    Con la consola de chrome puedes ver las llamadas que se hacen, ya sabes.

    Siempre será más facil eso que hacer un scrapping como el que estás haciendo.

    Saludos!
    Odio saber poco de todo
    La verdad que nunca he usado la consola de chrome. Le he dado ahora y he estado mirando, pero no parece cosa de dos patadas. Hay warnings, errores y de todo a punta pala.
    Cuelgo una captura a ver si me puedes decir por donde mirar, pero estoy tan perdido y quemado al mismo tiempo que dejo login de acceso a cambio de ayuda (no lo digo muy alto)
    Imágenes adjuntadas Imágenes adjuntadas  

  8. #7

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,649
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,993
    Agradecer Thanks Received 
    5,820
    Thanked in
    Agradecido 3,793 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    Tienes que ir a Network y allí buscas la petición AJAX asi puedes ver los datos enviados y recibidos, a ver si eso está bien.

    -----Actualizado-----

    Lo que suelo hacer yo es una vez cargada la web, en esa pestaña Network, borrar toda la lista y entonces hacer la peticion AJAX, asi no tienes que buscarla.

  9. El siguiente usuario agradece a josepzin este mensaje:

    crossmax (03/04/2018)

  10. #8

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Qué es lo que quieres hacer exactamente? Sacar datos de una tabla de una web? No tienes acceso a la API que use? La idea de mirar en la consola de chrome o firefox, en Network, es muy buena idea porque ahí puedes ver qué API está llamando. Eso será siemrpe mejor que parsear HTML desde javascript.
    Y has elegido javascript porque lo quieres poner tú en una web? Porque si no puedes usar cualquier otro lenguaje, a mi para hacer este tipo de "scripts" me gusta usar python.

  11. El siguiente usuario agradece a ^MiSaTo^ este mensaje:

    crossmax (03/04/2018)

  12. #9

    Fecha de ingreso
    Nov 2005
    Ubicación
    Excartagenero
    Mensajes
    23,649
    Mencionado
    276 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5,993
    Agradecer Thanks Received 
    5,820
    Thanked in
    Agradecido 3,793 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    1
    La consola del explorador es muy útil para arreglar estos problemas.

  13. #10

    Fecha de ingreso
    Sep 2005
    Ubicación
    Madri
    Mensajes
    438
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    13
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts
    Que maquinas sois. Por lo que veo parece que la petición genera un json de apirest? o eso creo. No tengo mucha idea de eso.
    Hay 2 temas ahora. Que si en lugar de parsear tiro de API, tendré que pasarle un token valido me imagino para que entienda que estoy logueado, y no se como hacerlo. Lo segundo es como puedo ir probando llamadas al api de una manera rapida para hacer las primeras pruebas. ¿Desde el navegador con una url con parametros, desde algun simulador??

    Esto es lo que veo al hacer click en la pestaña:
    Nombre:  query.png
Visitas: 1132
Tamaño: 189.3 KB

    Y la respuesta que la veo en la pestaña Response de Network (Console) es un chorrazo de datos en un json

    Código:
    {"data":{"w":[{"r":[{"c":[{"x":1,"v":"1522759861.06","i":"QUOTE-DATETIME"},{"x":2,"v":"1.22917","i":"BID-PRICE"},{"x":3,"v":"1.2293","i":"ASK-PRICE"}],"i":"USD"},{"c":[{"x":1,"v":"1522759851.3128","i":"QUOTE-DATETIME"},{"x":2,"v":"1.237604","i":"BID-PRICE"},{"x":3,"v":"1.237834","i":"ASK-PRICE"}],"i":"USD03M"},{"c":[{"x":1,"v":"1522759860.928","i":"QUOTE-DATETIME"}......

  14. #11

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Hombre lo suyo es si pudieras conseguir tú ese JSON. Para hacer pruebas de llamadas no te puedo aconsejar a no ser que estés en Mac. Pero hay un mogollón de programas para hacer llamadas HTTP y ver resultados
    Sabes cómo se consigue ese token? Entiendo que la web de la que quieres sacar los datos no es tuya no?

  15. #12

    Fecha de ingreso
    Sep 2005
    Ubicación
    Madri
    Mensajes
    438
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    13
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts
    La web no es mía. Quizás tengo que mezclar javascript con la llamada al api para obtener el json y sacar de ahí los datos.
    Voy a probar cosas para ver de que manera puedo pasarle el token.

  16. #13

    Fecha de ingreso
    Sep 2006
    Ubicación
    Zaragoza
    Mensajes
    1,243
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,546
    Agradecer Thanks Received 
    139
    Thanked in
    Agradecido 110 veces en [ARG:2 UNDEFINED] posts
    Puedes instalar plugins en Firefox o Chrome para estas cosas.

    Prueba "rest-easy"
    "256K son suficientes para cualquier tarea" Bill Gates

  17. #14

    Fecha de ingreso
    Oct 2005
    Ubicación
    Valladoliz
    Mensajes
    2,386
    Mencionado
    12 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    98
    Agradecer Thanks Received 
    94
    Thanked in
    Agradecido 53 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por crossmax Ver mensaje
    Que maquinas sois. Por lo que veo parece que la petición genera un json de apirest? o eso creo. No tengo mucha idea de eso.
    Hay 2 temas ahora. Que si en lugar de parsear tiro de API, tendré que pasarle un token valido me imagino para que entienda que estoy logueado, y no se como hacerlo. Lo segundo es como puedo ir probando llamadas al api de una manera rapida para hacer las primeras pruebas. ¿Desde el navegador con una url con parametros, desde algun simulador??

    Esto es lo que veo al hacer click en la pestaña:
    Nombre:  query.png
Visitas: 1132
Tamaño: 189.3 KB

    Y la respuesta que la veo en la pestaña Response de Network (Console) es un chorrazo de datos en un json

    Código:
    {"data":{"w":[{"r":[{"c":[{"x":1,"v":"1522759861.06","i":"QUOTE-DATETIME"},{"x":2,"v":"1.22917","i":"BID-PRICE"},{"x":3,"v":"1.2293","i":"ASK-PRICE"}],"i":"USD"},{"c":[{"x":1,"v":"1522759851.3128","i":"QUOTE-DATETIME"},{"x":2,"v":"1.237604","i":"BID-PRICE"},{"x":3,"v":"1.237834","i":"ASK-PRICE"}],"i":"USD03M"},{"c":[{"x":1,"v":"1522759860.928","i":"QUOTE-DATETIME"}......
    Postman te puede valer, usar Angular cómo lo ves?

  18. #15

    Fecha de ingreso
    Jan 2008
    Ubicación
    Madrid
    Mensajes
    4,447
    Mencionado
    14 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    86
    Agradecer Thanks Received 
    155
    Thanked in
    Agradecido 91 veces en [ARG:2 UNDEFINED] posts
    Abre la página en Chrome y pulsa F12 para abrir el depurador. Entra con el usuario en la web y luego ve en la ventana de depuración a la pestaña Network, ahí podrás ver las llamadas que ha hecho al servidor y sus parámetros.
    Última edición por hardyx; 09/04/2018 a las 11:31

Página 1 de 2 12 ÚltimoÚltimo

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •