Page 2 of 5
Re: Capturar pagina html y recuperar resultado
Posted: Wed Sep 18, 2024 3:51 pm
by leandro
Antonio buenos días como estas, que pena molestar de nuevo.
Pero quería saber si ya tienes las lib de FW2407 con la actualización del webview2 para poder implementar esta solución en la app.
Gracias de antemano.
Pdta. las necesitamos en 32 y 64 bits
Re: Capturar pagina html y recuperar resultado
Posted: Wed Oct 02, 2024 8:01 pm
by leandro
Antonio primero que todo agradecerte por la ayuda con este tema, ya que nos enviaste la actualización con la revisión del webview2, estamos intentando hacer la implementación de la solución para nuestros clientes, pero tenemos el problema que el código funciona de maravilla si lo compilamos solito en la carpeta samples del fw2409, pero cuando lo integramos a nuestra app, nos arroja un error, creo que puede ser referente a alguna librería que nos hace falta enlazar, de antemano gracias.
el código:
Code: Select all | Expand
#include "FiveWin.ch"
function consulta(cTerc)
local oWnd, cResult, oWebView
local cConsulta := space(0)
DEFAULT cTerc := "79760202"
cConsulta := "consultaDIAN( '"+cTerc+"' )"
TEXT INTO cResult
[ document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:primerNombre' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:otrosNombres' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:primerApellido' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:segundoApellido' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:estado' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:dv' ).innerHTML ]
ENDTEXT
DEFINE WINDOW oWnd TITLE "Usando DIAN desde un webview" SIZE 1050, 700
oWnd:Hide()
oWebView = TWebView2():New( oWnd )
oWebView:bOnNavigationCompleted = { | cUrl, hWebView | If( "sessionid" $ cUrl, oWebView:Eval( cResult ),) }
oWebView:Navigate( "https://muisca.dian.gov.co/WebRutMuisca/DefConsultaEstadoRUT.faces" )
oWebView:InjectJavascript( JavaScript() )
oWebView:bOnEval = { | cJson, hWebView | If( cJson != "null" .and. cJson != "{}", ( MsgInfo( cJson ), oWnd:End() ),) }
oWebView:Eval( )
ACTIVATE WINDOW oWnd CENTER ;
ON INIT oWnd:Hide() ;
ON RESIZE oWebView:SetSize( nWidth, nHeight )
oWebView:End()
return nil
function Javascript()
local cCode
TEXT INTO cCode
function consultaDIAN( numeroIdentificacion )
{
var inputNIT = document.getElementById('vistaConsultaEstadoRUT:formConsultaEstadoRUT:numNit');
if (inputNIT) {
inputNIT.value = numeroIdentificacion;
} else {
console.error('No se encontró el campo de entrada para el NIT');
return;
}
var botonBuscar = document.getElementById('vistaConsultaEstadoRUT:formConsultaEstadoRUT:btnBuscar');
if (botonBuscar) {
botonBuscar.click();
} else {
console.error('No se encontró el botón de búsqueda');
return;
}
}
ENDTEXT
return cCode
El error en nuestra app
Code: Select all | Expand
Application
===========
Path and name: C:\cmplar_64\hymlyma.exe (64 bits)
Size: ********* bytes
Compiler version: xHarbour 1.3.1 Intl. (SimpLex) (Build 20240624)
FiveWin version: FWH 24.07
C compiler version: LLVM/Clang C 5.0.2 (64-bit)
Windows 8 64 Bits, version: 6.2, Build 9200
Time from start: 0 hours 0 mins 10 secs
Error occurred at: 02/10/2024, 14:59:07
Error description: Error BASE/1070 Error de argumento: ==
Args:
[ 1] = N 0
[ 2] = P 0x1C39685D0C8
Stack Calls
===========
Called from: .\source\classes\twebview2.prg => (b)WEBVIEW2_ONEVAL( 128 )
Called from: => ASCAN( 0 )
Called from: .\source\classes\twebview2.prg => WEBVIEW2_ONEVAL( 128 )
Called from: => WINRUN( 0 )
Called from: .\source\classes\window.prg => TMDIFRAME:ACTIVATE( 1117 )
Called from: .\PRG\R32_menu.prg => VTNAPRINCIPAL( 976 )
Called from: .\PRG\R32_menu.prg => MAIN( 123 )
System
======
Hardware memory: 32510 megs
Free System resources: 90 %
GDI resources: 90 %
User resources: 90 %
Windows total applications running: 1
1 ,
Variables in use
================
Procedure Type Value
==========================
(b)WEBVIEW2_ONEVAL
Param 1: O Class: TWEBVIEW2
Param 2: N 1
Local 1: N 0
Local 2: P 0x1C39685D0C8
Local 3: U
Local 4: U
ASCAN
Param 1: A Len: 1
Param 2: B {|| ... }
WEBVIEW2_ONEVAL
Param 1: C "null"
Param 2: P 0x1C39685D0C8
Local 1: U
Local 2: U
WINRUN
Param 1: N 132530
TMDIFRAME:ACTIVATE
Param 1: C "NORMAL"
Param 2: U
Param 3: U
Param 4: U
Param 5: U
Param 6: B {|| ... }
Param 7: B {|| ... }
Param 8: B {|| ... }
Param 9: U
Param 10: U
Param 11: U
Param 12: U
Param 13: U
Param 14: U
Param 15: U
Param 16: U
Param 17: B {|| ... }
Param 18: U
Param 19: U
Param 20: L .F.
Local 1: O Class: TMDIFRAME
Local 2: U
Local 3: U
VTNAPRINCIPAL
Local 1: C "Tahoma"
Local 2: N 12
Local 3: U
Local 4: U
Local 5: U
Local 6: O Class: TINI
Local 7: O Class: TTIMER
Local 8: O Class: TTIMER
MAIN
Local 1: U
Local 2: U
Local 3: U
Local 4: U
Re: Capturar pagina html y recuperar resultado
Posted: Thu Oct 03, 2024 4:24 am
by cnavarro
Leandro, prueba a quitar esto
y ponerlo en el ON INIT de la ventana
Re: Capturar pagina html y recuperar resultado
Posted: Thu Oct 03, 2024 4:31 am
by Antonio Linares
Leandro,
Además de lo que te comenta Cristobal, dos cosas:
1. después de oWebView = TWebView2():New( oWnd ) añade esta línea:
MsgInfo( oWebView:hWebView )
y mira a ver si tiene un handle válido o un cero
2. Cuando llamas a oWebView:Eval( ) no le pasas ningún código javascript a ejecutar ??? Eso es diferente. Tal vez eso afecte...
Re: Capturar pagina html y recuperar resultado
Posted: Thu Oct 03, 2024 9:55 pm
by leandro
Hola buenas tardes...
No se que cambie, pero ahora
no funciona ni compilando el prg solito, el que publicaste funcionando en este mismo POST
El código
Code: Select all | Expand
#include "FiveWin.ch"
static oWebView
function Main()
local oWnd, cResult
TEXT INTO cResult
[ document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:primerNombre' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:otrosNombres' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:primerApellido' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:segundoApellido' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:estado' ).innerHTML,
document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:dv' ).innerHTML ]
ENDTEXT
DEFINE WINDOW oWnd TITLE "Usando DIAN desde un webview" SIZE 1050, 700
oWnd:Hide()
oWebView = TWebView2():New( oWnd )
oWebView:bOnNavigationCompleted = { | cUrl, hWebView | If( "sessionid" $ cUrl, oWebView:Eval( cResult ),) }
oWebView:Navigate( "https://muisca.dian.gov.co/WebRutMuisca/DefConsultaEstadoRUT.faces" )
oWebView:InjectJavascript( JavaScript() )
// oWebView:OpenDevToolsWindow()
oWebView:bOnEval = { | cJson, hWebView | If( cJson != "null" .and. cJson != "{}", ( MsgInfo( cJson ), oWnd:End() ),) }
oWebView:Eval( "consultaDIAN( '79760202' )" )
ACTIVATE WINDOW oWnd CENTER ;
ON INIT oWnd:Hide() ;
ON RESIZE oWebView:SetSize( nWidth, nHeight )
oWebView:End()
return nil
function Javascript()
local cCode
TEXT INTO cCode
function consultaDIAN( numeroIdentificacion )
{
var inputNIT = document.getElementById('vistaConsultaEstadoRUT:formConsultaEstadoRUT:numNit');
if (inputNIT) {
inputNIT.value = numeroIdentificacion;
} else {
console.error('No se encontró el campo de entrada para el NIT');
return;
}
var botonBuscar = document.getElementById('vistaConsultaEstadoRUT:formConsultaEstadoRUT:btnBuscar');
if (botonBuscar) {
botonBuscar.click();
} else {
console.error('No se encontró el botón de búsqueda');
return;
}
}
ENDTEXT
return cCode
El error
Code: Select all | Expand
Application
===========
Path and name: C:\fwh64_2409\samples\leandro6.exe (64 bits)
Size: 5,665,792 bytes
Compiler version: xHarbour 1.3.1 Intl. (SimpLex) (Build 20240624)
FiveWin version: FWH 24.07
C compiler version: LLVM/Clang C 5.0.2 (64-bit)
Windows 8 64 Bits, version: 6.2, Build 9200
Time from start: 0 hours 0 mins 0 secs
Error occurred at: 10/03/24, 16:43:33
Error description: Warning BASE/1005 Message not found: TWEBVIEW2:_BONNAVIGATIONCOMPLETED
Stack Calls
===========
Called from: source\rtl\tobject.prg => TWEBVIEW2:ERROR( 0 )
Called from: source\rtl\tobject.prg => TWEBVIEW2:MSGNOTFOUND( 0 )
Called from: source\rtl\tobject.prg => TWEBVIEW2:_BONNAVIGATIONCOMPLETED( 0 )
Called from: leandro6.prg => MAIN( 22 )
System
======
Hardware memory: 32510 megs
Free System resources: 90 %
GDI resources: 90 %
User resources: 90 %
Windows total applications running: 1
1 ,
Variables in use
================
Procedure Type Value
==========================
TWEBVIEW2:ERROR
Param 1: C "Message not found"
Param 2: C "TWEBVIEW2"
Param 3: C "_BONNAVIGATIONCOMPLETED"
Param 4: N 1005
Local 1: U
Local 2: O Class: TWEBVIEW2
Local 3: N 16
TWEBVIEW2:MSGNOTFOUND
Param 1: C "_BONNAVIGATIONCOMPLETED"
Param 2: O Class: TWEBVIEW2
TWEBVIEW2:_BONNAVIGATIONCOMPLETED
Param 1: B {|| ... }
MAIN
Local 1: O Class: TWINDOW
Local 2: C " [ document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:primerNombre' ).innerHTML, document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:otrosNombres' ).innerHTML, document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:primerApellido' ).innerHTML, document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:segundoApellido' ).innerHTML, document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:estado' ).innerHTML, document.getElementById( 'vistaConsultaEstadoRUT:formConsultaEstadoRUT:dv' ).innerHTML ]"
Linked RDDs
===========
DBF
DBFFPT
DBFBLOB
DBFCDX
DBFNTX
DataBases in use
================
Classes in use:
===============
1 ERROR
2 HASHENTRY
3 HBCLASS
4 HBOBJECT
5 TWINDOW
6 TBRUSH
7 TFONT
8 TREG32
9 TWEBVIEW2
Memory Analysis
===============
730 Static variables
Dynamic memory consume:
Actual Value: 0 bytes
Highest Value: 0 bytes
Re: Capturar pagina html y recuperar resultado
Posted: Fri Oct 04, 2024 6:49 am
by Antonio Linares
No estarás enlazando una clase TWebView2 tuya de las publicadas en estos foros ?
Revisa todos tus PRGs a ver si la tienes añadida en alguno
Re: Capturar pagina html y recuperar resultado
Posted: Fri Oct 04, 2024 1:58 pm
by leandro
cnavarro wrote:Leandro, prueba a quitar esto
y ponerlo en el ON INIT de la ventana
Amigo ya hice lo que mencionaste pero nada sigue devolviendo el mismo error
Antonio Linares wrote:Leandro,
Además de lo que te comenta Cristobal, dos cosas:
1. después de oWebView = TWebView2():New( oWnd ) añade esta línea:
MsgInfo( oWebView:hWebView )
y mira a ver si tiene un handle válido o un cero
2. Cuando llamas a oWebView:Eval( ) no le pasas ningún código javascript a ejecutar ??? Eso es diferente. Tal vez eso afecte...
Antonio hicimos lo que mencionas y nos devolvió el siguiente resultado:
Re: Capturar pagina html y recuperar resultado
Posted: Fri Oct 04, 2024 2:27 pm
by leandro
Bueno redujimos el código a lo mas pequeño posible para intentar encontrar el error, la pagina la carga correctamente pero cuando ingresamos la linea oWebView:InjectJavascript( Javascript() ) crash, se revienta.
Code: Select all | Expand
#include "FiveWin.ch"
static oWebView
consultaDIAN()
function consultaDIAN()
local oWnd
DEFINE WINDOW oWnd TITLE "Usando DIAN desde un webview" SIZE 1050, 700
oWebView = TWebView2():New( oWnd )
oWebView:Navigate( "https://muisca.dian.gov.co/WebRutMuisca/DefConsultaEstadoRUT.faces" )
oWebView:InjectJavascript( Javascript() )
ACTIVATE WINDOW oWnd CENTER ON RESIZE oWebView:SetSize( nWidth, nHeight )
oWebView:End()
return nil
function Javascript()
local cCode
TEXT INTO cCode
function consultaDIAN()
{
var inputNIT = document.getElementById('vistaConsultaEstadoRUT:formConsultaEstadoRUT:numNit');
if (inputNIT) {
inputNIT.value = "79760202";
} else {
console.error('No se encontró el campo de entrada para el NIT');
return;
}
}
ENDTEXT
return cCode
Re: Capturar pagina html y recuperar resultado
Posted: Fri Oct 04, 2024 4:46 pm
by leandro
Bueno parece ser, según lo que he entendido, es que el METHOD InjectJavascript( cScript ) CLASS TWebView2, no solo inyecta el código, si no que también lo ejecuta.
Con este código el navegador alcanza a mostrar el alert() con la información que le acabamos de pasar, pero inmediatamente le damos clic en aceptar en el alert del navegador, la aplicación sin mas ni mas se cierra y no deja rastro en el archivo error.log
Code: Select all | Expand
#include "FiveWin.ch"
static oWebView
consultaDIAN()
function consultaDIAN()
local oWnd
local cJavaScript := Javascript()
DEFINE WINDOW oWnd TITLE "Usando DIAN desde un webview" SIZE 1050, 700
oWebView = TWebView2():New( oWnd )
oWebView:Navigate( "https://muisca.dian.gov.co/WebRutMuisca/DefConsultaEstadoRUT.faces" )
oWebView:InjectJavascript( cJavaScript )
ACTIVATE WINDOW oWnd CENTER ON RESIZE oWebView:SetSize( nWidth, nHeight )
oWebView:End()
return nil
function Javascript()
local cCode
TEXT INTO cCode
var inputNIT = document.getElementById('vistaConsultaEstadoRUT:formConsultaEstadoRUT:numNit');
inputNIT.value = '79760202';
alert(inputNIT.value);
ENDTEXT
return cCode
Re: Capturar pagina html y recuperar resultado
Posted: Fri Oct 04, 2024 5:29 pm
by Antonio Linares
Leandro,
Aqui no se ejecuta el alert() hasta que no se descomenta la línea del oWebView:Eval( ... )
Luego InjectJavascript() NO ejecuta el código. A ver si estas enlazando una Clase TWebView2 modificada...
Code: Select all | Expand
#include "FiveWin.ch"
static oWebView
function Main()
local oWnd
DEFINE WINDOW oWnd TITLE "Usando DIAN desde un webview" SIZE 1050, 700
oWebView = TWebView2():New( oWnd )
oWebView:Navigate( "https://muisca.dian.gov.co/WebRutMuisca/DefConsultaEstadoRUT.faces" )
oWebView:InjectJavascript( Javascript() )
// oWebView:Eval( "consultaDIAN()" )
ACTIVATE WINDOW oWnd CENTER ON RESIZE oWebView:SetSize( nWidth, nHeight )
oWebView:End()
return nil
function Javascript()
local cCode
TEXT INTO cCode
function consultaDIAN()
{
var inputNIT = document.getElementById('vistaConsultaEstadoRUT:formConsultaEstadoRUT:numNit');
if (inputNIT) {
inputNIT.value = "79760202";
} else {
console.error('No se encontró el campo de entrada para el NIT');
return;
}
alert( "aqui" );
}
ENDTEXT
return cCode
Re: Capturar pagina html y recuperar resultado
Posted: Fri Oct 04, 2024 7:21 pm
by leandro
Antonio gracias por responder, ni siquiera se como agregar una librería diferente
estamos usando la versión que nos enviaste FWH64_2409.
Re: Capturar pagina html y recuperar resultado
Posted: Fri Oct 04, 2024 7:49 pm
by leandro
Reinstalamos la nueva versión de FW64_2409 y compilamos el ultimo código que nos enviaste dentro de la carpeta samples y efectivamente tiene el mismo comportamiento que mencionas, el código se ejecuta únicamente cuando se descomenta la línea oWebView:Eval( "consultaDIAN()" )
Como hacemos para saber que libreria esta usando hbmk2, no sabemos si, el agregue algo que no se necesita.
Lo que si hemos notado es que muestra un warning al generar el ejecutable
Code: Select all | Expand
...
...
...
Lines 58, Functions/Procedures 2, pCodes 144
xHarbour 1.3.1 Intl. (SimpLex) (Build 20240624)
Copyright 1999-2024, http://www.xharbour.org http://www.harbour-project.org/
Compiling '.\PRG\R64_fact.prg'...
Generating C source output to 'obj\R64_fact.c'...
Done.
Lines 39, Functions/Procedures 3, pCodes 186
bcc64.exe: warning: argument unused during compilation: '-Lc:\bcc770_64\LIB' [-Wunused-command-line-argument]
obj\R32_menu.c:
obj\R32_perm.c:
obj\Alyma.c:
obj\R32_bode.c:
obj\R32_cate.c:
obj\R32_ciud.c:
...
...
...
También revisamos las rutas de compilación del bat, buildx64.bat que esta en la carpeta samples y son las mismas que están en el archivo .hbp
buildx64.bat
Code: Select all | Expand
...
...
...
if "%FWDIR%" == "" set FWDIR=C:\fwh64_2409
if "%HBDIR%" == "" set HBDIR=C:\xHar2407_64
rem if "%2" == "/b" set GT=gtwin
rem if not "%2" == "/b" set GT=gtgui
set GT=gtgui
ECHO Compiling...
set hdir=%HBDIR%
set hdirl=%hdir%\lib
set fwh=%FWDIR%
set bcdir=C:\bcc770_64
...
...
...
xhb.hbp
Code: Select all | Expand
-optim-
-ldflag+=-aa -n-
-Ic:\fwh64_2409\include
-Lc:\fwh64_2409\lib
xgo64.bat
Code: Select all | Expand
set bcc=bcc770_64
set path=c:\%bcc%\bin
set HB_USER_CFLAGS=-Ic:\%bcc%\INCLUDE\windows\crtl -Ic:\%bcc%\INCLUDE\windows\sdk -Lc:\%bcc%\LIB
set HB_USER_LDFLAGS=-Lc:\%bcc%\LIB;c:\%bcc%\LIB\psdk
c:\xHar2407_64\bin\hbmk2.exe xhbcmp.hbp -xhb -comp=bcc64
Cual será el error, de antemano gracias
Re: Capturar pagina html y recuperar resultado
Posted: Fri Oct 04, 2024 11:14 pm
by Antonio Linares
Estimado Leandro,
> Cual será el error
Que error ?
Re: Capturar pagina html y recuperar resultado
Posted: Sat Oct 05, 2024 3:10 pm
by leandro
Antonio gracias por responder
El que vengo reportando
Code: Select all | Expand
Application
===========
Path and name: C:\cmplar_64\hymlyma.exe (64 bits)
Size: ********* bytes
Compiler version: xHarbour 1.3.1 Intl. (SimpLex) (Build 20240624)
FiveWin version: FWH 24.07
C compiler version: LLVM/Clang C 5.0.2 (64-bit)
Windows 8 64 Bits, version: 6.2, Build 9200
Time from start: 0 hours 0 mins 9 secs
Error occurred at: 05/10/2024, 10:08:03
Error description: Error BASE/1070 Error de argumento: ==
Args:
[ 1] = N 0
[ 2] = P 0x2345D41D818
Stack Calls
===========
Called from: .\source\classes\twebview2.prg => (b)WEBVIEW2_ONEVAL( 128 )
Called from: => ASCAN( 0 )
Called from: .\source\classes\twebview2.prg => WEBVIEW2_ONEVAL( 128 )
Called from: => WINRUN( 0 )
Called from: .\source\classes\window.prg => TMDIFRAME:ACTIVATE( 1117 )
Called from: .\PRG\R32_menu.prg => VTNAPRINCIPAL( 976 )
Called from: .\PRG\R32_menu.prg => MAIN( 123 )
No se, si tenga que ver con alguna dll del webview que esta mal integrada.
Nosotros estamos usando el webview1 en varias partes de la app, tiene algo que ver eso?
Re: Capturar pagina html y recuperar resultado
Posted: Sat Oct 05, 2024 3:42 pm
by Antonio Linares
Lo estás usando en un entorno MDI, tal vez esté relacionado
Lo curioso es por que el handle del webview vale cero...