viernes, 23 de octubre de 2009

Selinium & UpdatePanel[WaitForXXXXXX]

Selenium , es una aplicacion para hacer test automaticos, simula  acciones de usuarios en un navegador. mas adelante me metere mas en lo que es selinum y ventajas de usar una herramienta como esta.

Bueno en selenium tenemos varios comandos. por el ejemplo el type, click, typeAndWait, ClickAndWait.
bueno la direferencia entre el clickAndWait y click es que el AndWait espera que se recarge la pagina.

Pero con los update panels no recarga la pagina completa, entonces no me sirve  un click ni tampoco un clickAndWait.

En  Selinium Existe la forma de que quede esperando una accion "WaitForXXXXX" , por ejemplo podemos decirle a selenium que espere a que un elemento este habilidado, esto es super bueno si tenemos peteciones http  asincronicas y despues de esto habilitamos un control.  pero con los updatepanel, no siempre hay una accion visible atravez del un control[amenos que pongamos el tipico div de "Cargando"].

Entonces existe el comando WaitForCondicion, donde uno especifica un script javascript mas un tiempo de timeout. para el caso de los updatepanel, vemos que se haya registrado el Endrequest  de la pagina de la siguiente forma esto si estamos con el plugin de firefox:



var busyFunc = selenium.browserbot.getCurrentWindow().Sys.WebForms.PageRequestManager.get_inPostBack;
busy = (busyFunc == null)?true:busy = busyFunc();
busy == false;


En mi caso el test en html quedo asi:
waitForCondition
"var busyFunc = selenium.browserbot.getCurrentWindow().                       Sys.WebForms.PageRequestManager.get_inPostBack;       busy = (busyFunc == null)?true:busy = busyFunc();       busy == false;"
300
En el caso que se programaticamente, para incluilo en un test unitario y luego incluirlo en Cruise control.

selenium.WaitForCondition( "var busyFunc = selenium.browserbot.getCurrentWindow().Sys.WebForms.PageRequestManager.get_inPostBack; busy = (busyFunc == null)?true:busy = busyFunc(); busy == false;", "10000");

--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

miércoles, 21 de octubre de 2009

Post Blog Numero 100 :D

Hace mas de 2 años parti con mi blog.
aun recuerdo mi primer Post que tiempos aquellos, el objetivo de este blog si bien es personal,  sige teniendo el mismo objetivo, "compartir varias cosas, en especial sobre programacion". por lo generar e posteado cosas mas bien cotidianas.

Para sorpresa mia durante todo este tiempo e tenido muchas visitas.  13 seguidores,   y bastantes comentarios,

Pretendo seguir adelante con este Blog. tratar de poner mas entradas, siempre sobre cosas que me pasan dia a dia, y como siempre poniendole algo de humor.

Como ya dije arriba es un blog personal, pero me sorprende la cantidad de visitas. si bien no me interesa mucho esto,  es rico saber que hay gente lee tu blog, o que al buscar xxxx palabra aparece en Google.  en marzo del 2008 puse Google Analytics. y aqui dejo unas imagenes con la cantidad de visitas.

Gracias a los que leen el blog :D.







--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

martes, 13 de octubre de 2009

Select dinamicos de Pais/Regiones/Ciudad/Comunas con php y javascript

el ejemplo esta aqui

siempre se pide en todos lados general select anidados, de que si se seleciona x pais el combo de ciudades tiene que llenarse dependiendo del pais.

Aqui hice un ejemplo con php, javascript usando mochikit, y Json.

el codigo es totalmente reutilizable, aspectos importantes:

- En header.php esta la coneccion a la DB.
- Se uso json_encode para formar un arreglo de json por cada fila. esto ya es una funcion nativa en las ultimas versiones de php.
- Se generan elementos html dinamicamente con javascript. usando mochikit.
- Se conectan con mochkit los select, al momento de hacer onchange, mediante signal.

Aqui esta el codigo


<?php require_once ("header.php");


$arregloPaises = array();
$arregloRegiones = array();
$arregloCiudades = array();
$arregloComunas = array();

$query_paises = "select idpais as id, descripcion as nombre from paises";
$query_regiones = "select id as id, descripcion as nombre ,idpais as idpais from regiones";
$query_ciudades = "select id as id, descripcion as nombre ,idregion as idregion from ciudades";
$query_comunas = "select id as id, descripcion as nombre ,idciudad as idciudad from comunas";

$result_paises = mysql_query($query_paises);
$result_regiones = mysql_query($query_regiones);
$result_ciudades = mysql_query($query_ciudades);
$result_comunas = mysql_query($query_comunas);

while ($result_paises && $row = mysql_fetch_object($result_paises))
$arregloPaises[] = $row;
while ($result_regiones && $row = mysql_fetch_object($result_regiones))
$arregloRegiones[] = $row;
while ($result_ciudades && $row = mysql_fetch_object($result_ciudades))
$arregloCiudades[] = $row;
while ($result_comunas && $row = mysql_fetch_object($result_comunas))
$arregloComunas[] = $row;

$paisesJS = json_encode($arregloPaises);
$regionesJS = json_encode($arregloRegiones);
$ciudadesJS = json_encode($arregloCiudades);
$comunasJS = json_encode($arregloComunas);
?>
<html>
<head>
<script src="js/mochikit.js"></script>

<script>
var paises = <?=$paisesJS?>;
var regiones = <?=$regionesJS?>;
var ciudades = <?=$ciudadesJS?>;
var comunas = <?=$comunasJS?>;

function getRegionesByPais(idpais){
var newArreglo = [];
for (var i=0;i<regiones.length;i++)
if (regiones[i].idpais==idpais)
newArreglo.push(regiones[i]);
return newArreglo;
}

function getCiudadesByRegion(idregion){
var newArreglo = [];
for (var i=0;i<ciudades.length;i++)
if (ciudades[i].idregion==idregion)
newArreglo.push(ciudades[i]);
return newArreglo;
}

function getComunasByCiudad(idciudad){
var newArreglo = [];
for (var i=0;i<comunas.length;i++)
if (comunas[i].idciudad==idciudad)
newArreglo.push(comunas[i]);
return newArreglo;
}

function setDataSource(obj,items){
var arreglo = getElementsByTagAndClassName("option",null,obj);
for (var i=0;i<arreglo.length;i++)
removeElement(arreglo[i]);
if (items!=null)
for (var i=0;i<items.length;i++)
appendChildNodes(obj, OPTION({'value':items[i].id},null,items[i].nombre));
}

addLoadEvent(
function(){
setDataSource($('pais'),paises);

connect ($('pais'),"onchange", function (elem){
setDataSource($('region'),getRegionesByPais(elem.target().value));
setDataSource($('ciudad'),null);
setDataSource($('comuna'),null);
}
);
connect ($('region'),"onchange", function (elem){
setDataSource($('ciudad'),getCiudadesByRegion(elem.target().value));
setDataSource($('comuna'),null);
}
);
connect ($('ciudad'),"onchange", function (elem){
setDataSource($('comuna'),getComunasByCiudad(elem.target().value));
}
);
});
</script>
</head>
<body>
<select id="pais" name="pais"></select>
<br>
<select id="region" name="region"/></select>
<br>
<select id="ciudad" name="ciudad"/></select>
<br>
<select id="comuna" name="comuna"/></select>
<br>

</body>
</html>



y la base de datos es la siguiente:


CREATE TABLE `ciudades` (
`ID` int(11) NOT NULL auto_increment,
`DESCRIPCION` varchar(30) default NULL,
`IDREGION` int(11) default NULL,
PRIMARY KEY (`ID`)
) ;

CREATE TABLE `paises` (
`IDPAIS` int(11) NOT NULL auto_increment,
`DESCRIPCION` varchar(30) default NULL,
PRIMARY KEY (`IDPAIS`)
);

CREATE TABLE `regiones` (
`ID` int(11) NOT NULL auto_increment,
`DESCRIPCION` varchar(30) default NULL,
`IDPAIS` int(11) default NULL,
PRIMARY KEY (`ID`)
);

CREATE TABLE `comunas` (
`ID` int(11) NOT NULL auto_increment,
`DESCRIPCION` varchar(30) default NULL,
`IDCIUDAD` int(11) default NULL,
PRIMARY KEY (`ID`)
);


y aqui algunos datos para probar:


INSERT INTO `ciudades` VALUES (1, 'Iquique', 1);
INSERT INTO `ciudades` VALUES (2, 'Antofagasta', 2);
INSERT INTO `ciudades` VALUES (3, 'Copiapo', 3);
INSERT INTO `ciudades` VALUES (4, 'La Serena', 4);
INSERT INTO `ciudades` VALUES (5, 'Valparaiso', 5);
INSERT INTO `ciudades` VALUES (6, 'Rancagua', 6);
INSERT INTO `ciudades` VALUES (7, 'Talca', 7);
INSERT INTO `ciudades` VALUES (8, 'Concepcion', 8);
INSERT INTO `ciudades` VALUES (9, 'Temuco', 9);
INSERT INTO `ciudades` VALUES (10, 'Osorno', 10);
INSERT INTO `ciudades` VALUES (11, 'Aysen', 11);
INSERT INTO `ciudades` VALUES (12, 'Magallanes', 12);
INSERT INTO `ciudades` VALUES (13, 'Santiago', 13);
INSERT INTO `ciudades` VALUES (14, 'Valdivia', 14);
INSERT INTO `ciudades` VALUES (15, 'Arica', 15);
INSERT INTO `ciudades` VALUES (17, 'santiago2', 13);





INSERT INTO `comunas` VALUES (1, 'Alto Hospicio', 1);
INSERT INTO `comunas` VALUES (2, 'Pica', 1);
INSERT INTO `comunas` VALUES (3, 'Taltal', 2);
INSERT INTO `comunas` VALUES (4, 'Mejillones', 2);
INSERT INTO `comunas` VALUES (5, 'Caldera', 3);
INSERT INTO `comunas` VALUES (6, 'Copiapo', 3);
INSERT INTO `comunas` VALUES (8, 'La Serena', 4);
INSERT INTO `comunas` VALUES (9, 'Casablanca', 5);
INSERT INTO `comunas` VALUES (10, 'Quintero', 5);
INSERT INTO `comunas` VALUES (11, 'Rancagua', 6);
INSERT INTO `comunas` VALUES (13, 'Rio Claro', 7);
INSERT INTO `comunas` VALUES (14, 'Constitucion', 7);
INSERT INTO `comunas` VALUES (15, 'Lota', 8);
INSERT INTO `comunas` VALUES (16, 'Coronel', 8);
INSERT INTO `comunas` VALUES (18, 'Temuco', 9);
INSERT INTO `comunas` VALUES (19, 'Rio Negro', 10);
INSERT INTO `comunas` VALUES (20, 'Puyehue', 10);
INSERT INTO `comunas` VALUES (21, 'Guaitecas', 11);
INSERT INTO `comunas` VALUES (22, 'Cisnes', 11);
INSERT INTO `comunas` VALUES (35, 'San Miguel', 13);
INSERT INTO `comunas` VALUES (24, 'Punta Arenas', 12);
INSERT INTO `comunas` VALUES (25, 'Quinta Normal', 13);
INSERT INTO `comunas` VALUES (26, 'Pudahuel', 13);
INSERT INTO `comunas` VALUES (27, 'Santiago', 13);
INSERT INTO `comunas` VALUES (28, 'Renca', 13);
INSERT INTO `comunas` VALUES (29, 'Las Condes', 13);
INSERT INTO `comunas` VALUES (30, 'Providencia', 13);
INSERT INTO `comunas` VALUES (31, 'Paillaco', 14);
INSERT INTO `comunas` VALUES (32, 'Corral', 14);
INSERT INTO `comunas` VALUES (33, 'Camarones', 15);
INSERT INTO `comunas` VALUES (34, 'Arica', 15);





INSERT INTO `paises` VALUES (1, 'Chile', 3);
INSERT INTO `paises` VALUES (3, 'Argentina', 6);
INSERT INTO `paises` VALUES (4, 'Bolivia', 16);
INSERT INTO `paises` VALUES (5, 'Venezuela', 15);
INSERT INTO `paises` VALUES (6, 'Colombia', 11);
INSERT INTO `paises` VALUES (7, 'Japon', 10);
INSERT INTO `paises` VALUES (8, 'Cuba', 12);
INSERT INTO `paises` VALUES (9, 'Mexico', 7);
INSERT INTO `paises` VALUES (10, 'austria', 2);
INSERT INTO `paises` VALUES (12, 'aaaa', NULL);



INSERT INTO `regiones` VALUES (1, 'I region', 1);
INSERT INTO `regiones` VALUES (2, 'II region', 1);
INSERT INTO `regiones` VALUES (3, 'III region', 1);
INSERT INTO `regiones` VALUES (4, 'IV region', 1);
INSERT INTO `regiones` VALUES (5, 'V region', 1);
INSERT INTO `regiones` VALUES (6, 'VI region', 1);
INSERT INTO `regiones` VALUES (7, 'VII region', 1);
INSERT INTO `regiones` VALUES (8, 'VIII region', 1);
INSERT INTO `regiones` VALUES (9, 'IX region', 1);
INSERT INTO `regiones` VALUES (10, 'X region', 1);
INSERT INTO `regiones` VALUES (11, 'XI region', 1);
INSERT INTO `regiones` VALUES (12, 'XII region', 1);
INSERT INTO `regiones` VALUES (13, 'Metropolitana', 1);
INSERT INTO `regiones` VALUES (14, 'XIV region', 1);
INSERT INTO `regiones` VALUES (15, 'XV region', 1);


En resumen, el codigo es bastante chico, usando json, mochikit, nos queda con un html muy limpio, solo conectamos los select al momento de cargar la pagina.


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

lunes, 5 de octubre de 2009

about:mozilla El Libro de Mozilla

hace tiempo, encontre por ahi y puse en la barra de direcciones "about:mozilla" al igual que cuando uno pone "about:config" para configurar los paremetros de firefox, y sale lo siguienre




aqui dejo Textual lo que aparece en wikipedia con respecto a esta frase:
La frase "Mammon se durmió" hace referencia a que MS Internet Explorer se quedó estancada en la versión 6.0 durante 5 años. "la bestia renació" hace referencia a que Netscape renació en la compañía AOL (al menos hasta el 9.0.0.5). "propagándose por toda la tierra y sus seguidores se hicieron legión" a que luego de renacer Netscape, se expandió a todo el globo y sus seguidores se hicieron millones rápidamente. "y proclamaron nuevos tiempos" a que en el futuro los navegadores ya no estarían tan ligados a Internet Explorer, sino que existirían nuevas posibilidades. "sacrificaron cosechas con fuego, con la astucia de zorros" esto hace referencia (directamente) a Firefox ya que su logo es un zorro de fuego, de ahí el nombre "Firefox". "Y construyeron un nuevo mundo a su propia imagen como prometían las palabras sagradas" se refiere a que la Fundación Mozilla liberó los códigos fuente de sus productos. "Mammon se despertó" se refiere al lanzamiento de la versión 7 de IE, "y súbitamente no era más que un rezagado" se refiere a que explorer de ser un innovador, paso a copiar características de firefox que explorer carecía.
El número del pasaje, 11:9, puede hacer referencia al 9 de noviembre (11-9 en la nomenclatura anglosajona). El 9 de noviembre de 2004 salió a la luz Mozilla Firefox 1.0. Tendría que ver con el renacer de la bestia en cuanto al hecho de crear el primer ejecutable estable de lo que fue la Bestia y que hoy es Firefox.

Aqui esta el link a wikipedia para mas informacion


--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com