Página 1 de 1

Trabajando con _IE

Publicado: 12 Dic 2012, 01:03
por avechuche
Hola gente, tengo varias dudas, resulta que necesito crear pestañas en el navegador (uso IE8 en Windows XP). Lo hago de esta manera.

Código: Seleccionar todo

#include <IE.au3>

$oIE = _IECreate("www.google.com.ar")

For $a = 1 To 9

	$oIE.navigate2("www.google.com.ar", 0x1000) ; Nueva pestaña en segundo plano

Next
1) Como hago para usar la opcion _IEQuit, cada vez que tengo 2 o mas pestañas no me cierra el objeto. Quiero usar _IEQuit para cerrar todas las pestañas o todas menos la primera.
2) Como hago para tomar y trabajar con una de las pestañas. Probe con un For y con _IEAttach pero no resulto.

Gracias!

Re: Trabajando con _IE

Publicado: 12 Dic 2012, 09:30
por jamaro
Hola avechuche

¿Has probado a enviar Ctrl+N (N=número de pestaña) para posicionarte en la pestaña deseada o Ctrl+TAB para mover a la siguiente, y luego Ctrl+F4 para cerrarla?

De todos modos, con este método, yo siempre he tenido problemas con los tiempos, ya que si no está cargada la página, no responde bien. Quizás primero hay que cargar la URL con algún tiempo de espera....

Ya nos cuentas....

Re: Trabajando con _IE

Publicado: 12 Dic 2012, 20:27
por arkcrew
Buenas,

Quizás puedas hacerlo acorde a esta explicación:

Cuando utilizas la librería _IE, creas un objeto de internet Explorer, de ahí que $objeto.Accion ($oIE.Navigate) te navegue a una utl, prueba destruyendo el objeto a ver si de esa manera se soluciona.

Prueba $oIE.Quit() a ver que tal funciona.

Espero haberte ayudado,

Saludos!

Re: Trabajando con _IE

Publicado: 17 Dic 2012, 19:23
por avechuche
Gracias gente por la respuesta, no pude solucionar (todavia) lo de IEQuit. pero eso puede esperar. Vengo con otra duda. Resulta que tengo esto.

El problema esta en que si se pasa de tiempo de espera y IEBodyReadHTML() no puede obtener datos, me cierra el script, por mas q no pueda obtener datos, quiero que siga con el for. que puede estar mal o que me falta? Gracias!

Código: Seleccionar todo

	For $b = 0 To UBound($aArrayVoteWebs) - 1

		_IENavigate($oIE, $aArrayVoteWebs[$b], 0)
		_IELoadWait($oIE, 0, $loadWaitTime)

		$sBODY = _IEBodyReadHTML($oIE)
		If IsString($sBODY) Then "CODIGO"

	Next

Re: Trabajando con _IE

Publicado: 17 Dic 2012, 23:23
por arkcrew
Buenas,

Me da a mi la impresión de que lo que hace que casque es If IsString($sBODY) Then "CODIGO", que narices es eso de Then "CODIGO" un return, una función, una variable, o simplemente es que no quieres copiarnos el resto del code jajAjajajaja

Mira a ver si puedes pegar la salida que da Scite si no es eso que digo ;)

Saludos!

Re: Trabajando con _IE

Publicado: 18 Dic 2012, 02:16
por avechuche
jajajaja puse "CODIGO" porque es mucho, pero ahi no esta el problema, el problema esta entre _IELoadWait($oIE, 0, $loadWaitTime) y If IsString($sBODY) Then. El Scite me devuelve un error en .document.body.innertext, algo asi no me acuerdo porque justo ahora no me pasa :) Pero como que _IEBodyReadHTML no funciona porque no encuentra codigo fuente porque la pagina no se cargo y ahi me da el error, pero no quiero que me cierre el script si pasa ese error que no haga lo que esta dentro del "IF" y que siga con el "FOR"

Este es el Error

--> IE.au3 V2.4-0 Warning from function _IELoadWait, $_IEStatus_LoadWaitTimeout
C:\Archivos de programa\AutoIt3\Include\IE.au3 (1953) : ==> Variable must be of type "Object".:
Return SetError($_IEStatus_Success, 0, $o_object.document.body.innerHTML)
Return SetError($_IEStatus_Success, 0, $o_object.document.body^ ERROR

Re: Trabajando con _IE

Publicado: 18 Dic 2012, 22:03
por arkcrew
Hola,

Ese error es porque tienes un problema creando el objeto ie, revisate la función _IECreate, o sino, miralo para hacerlo con un ojjeto a mano isn librería IE

Saludos!

Re: Trabajando con _IE

Publicado: 19 Dic 2012, 21:02
por Chefito
Mmmmmmmm....mira a ver porque te da ese error e intentalo tratar. Recuerda que casi todas la funciones te devuelven el error gracias al @error. Yo iría comprobando cada pedazo de código y intentaría encontrarlo para poder controlarlo. Quien sabe, puede ser porque la dirección que le pasas, porque no le da tiempo cargarse, etc :smt017 .
Si nos pasas una url con la que te hace eso nos sería más fácil hacer pruebas y aconsejarte.

Igualmente hay una forma de detectar y controlar (o ignorar) los errores de los objetos. Mira en la ayuda el ejemplo de la función ObjEvent. También puedes mirar el apartado "Obj/COM Reference", y dentro de este mira las secciones "COM Events" y "COM Error Handling". Están seguidas.

Saludos.

Re: Trabajando con _IE

Publicado: 17 Ene 2013, 03:02
por avechuche
Borro todo y arranco de 0.

Lo que necesito es lo siguiente. Necesito abrir IE pero sin esperar a que cargue la página. Entrar en un While y esperar a que determinado objeto aparezca. Cuando ese objeto aparezca, salgo del While y entro a otro While. Tomando el innerhtml de ese objeto, compruebo que cuando llegue a "0" la cuenta regresiva haga clic en el link que me da. Todo esto es para esa pagina http://adf.ly/. Cuando se abre esa página aparece el cartel "por favor, espere...", ahi todavia el objeto que necesito no esta disponible. Cuando la cuenta regresiva arranca ahi es cuando el objeto aparece. Una vez que llega a "0". Hago clic en el link que da con $Obj.href.

Re: Trabajando con _IE

Publicado: 31 Ene 2013, 19:28
por Chefito
Estaba aburrido y he mirado este post que se quedó algo en el aire.

Y yo me pregunto, por que te complicas tantísimo la vida pudiendo conseguir la url directa con dos líneas de código???? :smt024 . Porque leyendote, creo que lo que te interesa conseguir es la dirección directa. Una vez que la consigas, puedes trabajar con ella tranquilamente.

A veces, cuando ves que la cosa se complica mucho, es mejor que expliques con pelos y señales lo que quieres hacer, por si hay otra solución más simple que la que tu estás intentando :smt003 .

Código: Seleccionar todo

#include <inet.au3>

$direccionAdFly="http://adf.ly/IJGEK"
$html=_INetGetSource($direccionAdFly)
$direccionOriginal=StringRegExp($html,"var zzz = '(.*?)';",1)
MsgBox(0,"Dirección original",$direccionOriginal[0])
Lo único que hace este código es coger la dirección directa del código html de la página web. Mucho más simple, rápido....y mejor :smt002 .
Puedes probar con cualquier dirección adf.ly poniendola en la variable $direccionAdFly.

Saludos.

Re: Trabajando con _IE

Publicado: 31 Ene 2013, 23:35
por avechuche
Gracias Chefito, ahora te hago una consulta con respecto a esto
Para la que la función _INetGetSource funcione, tiene que esperar a que la página se "cargue" por completo. Más alla que tarde muchisimo menos que _IENavigate, tengo que esperar.

Ahora que veo, creo que interpretaste mal, lo que yo busco es hacer click en "Saltar publicidad" después que la cuenta regresiva termina. Este es el problema, si uso _IENavigate y espero a que la página cargue a veces es medio malo, porque la cuenta regresiva termina mucho antes de que la página cargue por completo (La mayoria de las veces), entonces cuando la cuenta regresiva termina, au3 espera a que la página completa termine de cargar para continuar. Por eso lo que yo necesito es abrir la página y cuando exista cierto $Objeto (el que contiene la cuenta regresiva) se quede esperando hasta que la cuenta regresiva termine y haga click en $Objeto.innerhtml, repeti cuenta regresiva como 100 veces ^^.
Ya lo solucione pero a lo mejor hay una solución más corta.

1) El primer While espera a que exista el objeto que contiene la cuenta regesiva
2) El segundo While espera que el innerhtml del objeto encontrado anteriormente sea un número. Si no devuelve simbolos raros.
3) El tercer While va tomando los segundos y cuando llega a 0, tengo q esperar 2 segundos (le puse dos para estar seguro) a que se active el objeto que contiene el link que necesito.

Código: Seleccionar todo

Func _Click()

	While 1

		Sleep(500)

		$oSkip = _IEGetObjById($oIE, "countdown")
		If IsObj($oSkip) Then ExitLoop

	WEnd

	While Not StringRegExp($oSkip.innerhtml, "\d+")

		Sleep(100)

	WEnd

	While 1

		$aTiempo = StringRegExp($oSkip.innerhtml, "\d+", 1)
		GUICtrlSetData($btn_Listar, $aTiempo[0])

		Sleep(500)

		If StringInStr($oSkip.innerhtml, "0") Then

			$aTiempo = StringRegExp($oSkip.innerhtml, "\d+", 1)
			GUICtrlSetData($btn_Listar, $aTiempo[0])

			Sleep(2000)

			GUICtrlSetData($btn_Listar, "Listando ...")
			$skipButton = _IEGetObjById($oIE, "skip_button")
			_IEAction($skipButton, "click")
			_IELoadWait($oIE)
			ExitLoop

		EndIf

	WEnd

EndFunc   ;==>_Click

Re: Trabajando con _IE

Publicado: 01 Feb 2013, 13:00
por Chefito
Mmmmmm....pero entiendo que lo que a tí te interesa es lo que te dije anteriormente, entrar en la dirección directamente evitando la publicidad (el paso intermedio del redireccionamiento de adf.ly). Es que lo haces muy complicado y muy enrevesado. Si no hubiera más remedio, pues lo hace así, pero habiendo métodos más eficaces y simples......

Lo que no se es si quieres mostrar tu la página. Pero ya te lo dije en el post anterior:
Chefito escribió:creo que lo que te interesa conseguir es la dirección directa. Una vez que la consigas, puedes trabajar con ella tranquilamente.
Pues eso, una vez que tienes la dirección, abres la página web con un simple _eicreate:

Código: Seleccionar todo

#include <inet.au3>
#include <ie.au3>

$direccionAdFly="http://adf.ly/IJGEK"
$html=_INetGetSource($direccionAdFly)
$direccionOriginal=StringRegExp($html,"var zzz = '(.*?)';",1)
$iUE=_iecreate($direccionOriginal[0])
Y si quieres mostrarlo todo desde el principio:

Código: Seleccionar todo

#include <ie.au3>

$direccionAdFly="http://adf.ly/IJGEK"
$oIE=_iecreate($direccionAdFly)
$html= _IEDocReadHTML($oIE)
$direccionOriginal=StringRegExp($html,"var zzz = '(.*?)';",1)
_ienavigate($oIE,$direccionOriginal[0])
Como ves sigue siendo mucho más fácil y efectivo.

Yo personalmente prefiero el primer método. Si puedo evitar estar manejando un objeto IE mejor, ya alguna vez puede hacerte algo raro. Por ejemplo, en mi ordenador, alguna vez me ha salido una publicidad en la página adf.ly que me ha bloqueado el script, ya que por alguna causa (la configuración del IE o lo que sea) me da un error esa página con esa publicidad determinada y empieza a cargar continuamente y no sale de allí. Pero bueno, es un caso particular.

En cambio, si accedes directamente al código html de la página, no vas a tener nunca esos problemas (por ejemplo, con la función _inetgetsource, que maneja el objeto inet).

Saludos.

Re: Trabajando con _IE

Publicado: 06 Feb 2013, 21:35
por avechuche
Si ahora entiendo perfecto lo que yo queria saber si es lo mismo, la onda es que a la persona le cuente como visita, si yo hago clic en "Saltar publicidad", a la persona le cuenta, si lo hago asi, no se. Voy a probar!

EDITO: Veo que adf.ly cambio, antes cuando mirabas el link que te devolvia la imágen "Saltar publicidad", era un link aleatorio compuesto por "adf.ly/muchisimosnumerosyletras" ahora el link es el de la página que uno quiere visitar. A lo mejor funciona igual