RadGrid Multiselección con CheckBoxs

Publicado: 3 de febrero de 2014 en ASP.NET

Para los que nos dedicamos al mundo del desarrollo con WebForms en ASP.NET con la librería Telerik muchas veces queremos personalizar los radgrid para hacerlos multiselección con checkboxs, personalmente no encontré ejemplos muy claros y algunos que fallaban con el uso de Ajax, para tal dejaré un ejemplo usando el lenguaje Vb.Net.
1. Configuraremos el proyecto: Agregando la librería Telerik, en mi caso también agregue la EnterpriseLibrary para mi conexión a la base de datos.
2. Configuramos la conexión a la BD, para el ejemplo utilizaré la BD NORTWND en SQL Server 2012.
3. Para el ejemplo cree el procedimiento almacenado “EmployeeSalesByCountry” para que nos trajera información de ventas por usuario.

CREATE procedure [dbo].[EmployeeSalesByCountry]
@Beginning_Date DateTime, @Ending_Date DateTime AS
SELECT Employees.Country
	, Employees.LastName
	, Employees.FirstName
	, Orders.ShippedDate
	, Orders.OrderID
	, "Order Subtotals".Subtotal AS SaleAmount
	, CAST(0 as bit) seleccionado
FROM Employees INNER JOIN
	(Orders INNER JOIN "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID)
	ON Employees.EmployeeID = Orders.EmployeeID
WHERE Orders.ShippedDate Between @Beginning_Date And @Ending_Date

Fíjense que agregamos un campo BIT que representará el estado del checkbox de selección.

4. Agregamos la página que nos servirá para el ejemplo y creamos el formulario (pueden hacerlo desde la pestaña de Diseño, pero yo recomiendo que sea desde la pestaña de Código, pues es más rápido y limpio).

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="RadGridExample.aspx.vb"
    Inherits="RadGridExample.RadGridExample" %>

<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="Sm1" runat="server" />
    <div>
        <table cellpadding="5" cellspacing="0">
            <tr>
                <td colspan="5">
                    <h1>
                        RadGrid Multiselect con checkboxs</h1>
                </td>
            </tr>
            <tr>
                <td>
                    Desde:
                </td>
                <td>
                    <telerik:RadDatePicker ID="DpDesde" runat="server" />
                </td>
                <td>
                    Hasta:
                </td>
                <td>
                    <telerik:RadDatePicker ID="DpHasta" runat="server" />
                </td>
                <td>
                    <telerik:RadButton ID="BtnBuscar" runat="server" Text="Buscar" />
                </td>
            </tr>
            <tr>
                <td colspan="5">
                    <telerik:RadGrid ID="GvVentas" runat="server" AllowPaging="True" 
                        Width="100%" AutoGenerateColumns="False" AllowMultiRowSelection="True" 
                        EnableEmbeddedSkins="True" PageSize="10">
                        <PagerStyle AlwaysVisible="true" />
                        <MasterTableView CellSpacing="0" DataKeyNames="Country, LastName, FirstName, ShippedDate, OrderID, SaleAmount" >
                            <Columns>
                                <telerik:GridCheckBoxColumn DataField="seleccionado" Visible="false" />
                                <telerik:GridTemplateColumn>
                                    <HeaderTemplate>
                                        <asp:CheckBox ID="chbAll" OnCheckedChanged="ToggleSelectedStateDisponibles" AutoPostBack="True" runat="server" />
                                    </HeaderTemplate>
                                    <ItemTemplate>
                                        <asp:CheckBox ID='chbSeleccionado' OnCheckedChanged="ToggleRowSelection" AutoPostBack="True" runat="server" />
                                    </ItemTemplate>
                                </telerik:GridTemplateColumn>
                                <telerik:GridBoundColumn DataField="Country" HeaderText="Pais" HeaderStyle-HorizontalAlign="Center" />
                                <telerik:GridBoundColumn DataField="LastName" HeaderText="Apellido" HeaderStyle-HorizontalAlign="Center" />
                                <telerik:GridBoundColumn DataField="FirstName" HeaderText="Nombre" HeaderStyle-HorizontalAlign="Center" />
                                <telerik:GridBoundColumn DataField="ShippedDate" HeaderText="Fecha" DataFormatString="{0:dd/MM/yyyy}" HeaderStyle-HorizontalAlign="Center" />
                                <telerik:GridBoundColumn DataField="OrderID" HeaderText="Venta" HeaderStyle-HorizontalAlign="Center" />
                                <telerik:GridBoundColumn DataField="SaleAmount" HeaderText="Monto" DataFormatString="{0:$###,###.00}" ItemStyle-HorizontalAlign="Right" HeaderStyle-HorizontalAlign="Center" />
                            </Columns>
                            <NoRecordsTemplate>
                                <div>
                                    No hay resultados</div>
                            </NoRecordsTemplate>
                            <PagerStyle AlwaysVisible="True" />
                        </MasterTableView>
                    </telerik:RadGrid>
                </td>
            </tr>
            <tr>
                <td colspan="5" align="center" valign="middle">
                    <telerik:RadButton ID="BtnGuardar" runat="server" Text="Guardar" />
                </td>
            </tr>
            <tr>
                <td colspan="5">
                    <telerik:RadGrid ID="GvSeleccionados" runat="server" Width="100%" 
                        AutoGenerateColumns="False" EnableEmbeddedSkins="True">
                        <PagerStyle AlwaysVisible="true" />
                        <MasterTableView CellSpacing="0">
                            <Columns>
                                <telerik:GridBoundColumn DataField="Country" HeaderText="Pais" />
                                <telerik:GridBoundColumn DataField="LastName" HeaderText="Apellido" />
                                <telerik:GridBoundColumn DataField="FirstName" HeaderText="Nombre" />
                                <telerik:GridBoundColumn DataField="ShippedDate" HeaderText="Fecha" DataFormatString="{0:dd/MM/yyyy}" />
                                <telerik:GridBoundColumn DataField="OrderID" HeaderText="Venta" />
                                <telerik:GridBoundColumn DataField="SaleAmount" HeaderText="Monto" DataFormatString="{0:$###,###.00}" />
                            </Columns>
                            <NoRecordsTemplate>
                                <div>No hay resultados</div>
                            </NoRecordsTemplate>
                            <PagerStyle AlwaysVisible="True" />
                        </MasterTableView>
                        <ClientSettings EnableRowHoverStyle="true">
                            <Selecting AllowRowSelect="true" EnableDragToSelectRows="true" />
                        </ClientSettings>
                    </telerik:RadGrid>
                </td>
            </tr>
        </table>
        <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server" DefaultLoadingPanelID="RadAjaxLoadingPanel1">
        <AjaxSettings>
            <telerik:AjaxSetting AjaxControlID="BtnBuscar">
                <UpdatedControls>
                    <telerik:AjaxUpdatedControl ControlID="GvVentas" />
                </UpdatedControls>
            </telerik:AjaxSetting>                       
            <telerik:AjaxSetting AjaxControlID="GvVentas">
                <UpdatedControls>
                    <telerik:AjaxUpdatedControl ControlID="GvVentas" />
                </UpdatedControls>
            </telerik:AjaxSetting>
            <telerik:AjaxSetting AjaxControlID="BtnGuardar">
                <UpdatedControls>
                    <telerik:AjaxUpdatedControl ControlID="GvSeleccionados" />
                </UpdatedControls>
            </telerik:AjaxSetting>                       
        </AjaxSettings>
    </telerik:RadAjaxManager>
    </div>
    </form>
</body>
</html>

Lo que nos dejará un formulario como:

Diseño

Fíjese que hemos agregado un ScriptManager y un RadAjaxManager, para el manejo de Ajax durante la página.

El funcionamiento será el siguiente: Se seleccionará las fechas que necesitamos como parámetros para el filtro de nuestro Procedimiento de SQL y luego lo ejecutamos en el botón Buscar, el cual llenará la grilla y esta tendrá las opciones de selección mediante CheckBox, vendrá paginada y podrá hacer una selección y deselección total con un checkbox en la cabecera de la misma.
Así mismo recuperaremos los items seleccionados mediante el botón Guardar y los agregaremos a una grilla de resultados en la parte inferior.

6. Ahora veremos como es el funcionamiento desde el lado del servidor (VB.NET):

6.1 La conexión a la BD

Private db As Database = DatabaseFactory.CreateDatabase("NORTHWND")

6.2 El DataSource del RadGrid multiselect debe registrarse se la siguiente manera:

Public Property DtVentas() As DataTable
    Get
        Return Session("DtVentas")
    End Get
    Set(ByVal value As DataTable)
        Session("DtVentas") = value
    End Set
End Property

Fíjese que mantenemos la información en sesión para evitar consultar la BD, para que no se pierda al hacer un PostBack.

6.3 La función de búsqueda

Public Function ObtenerVentas(ByVal finicio As Date, ByVal ffinal As Date) As DataTable
    Dim cmd As New SqlCommand("EmployeeSalesByCountry")
    cmd.CommandType = CommandType.StoredProcedure
    db.AddInParameter(cmd, "Beginning_Date", DbType.DateTime, finicio)
    db.AddInParameter(cmd, "Ending_Date", DbType.DateTime, ffinal)
    Return db.ExecuteDataSet(cmd).Tables(0)
End Function

6.4 El Botón Buscar: Ejecutará la búsqueda y registrará el resultado en la propiedad DtVentas

Private Sub BtnBuscar_Click(sender As Object, e As System.EventArgs) Handles BtnBuscar.Click
    DtVentas = ObtenerVentas(DpDesde.SelectedDate, DpHasta.SelectedDate)
    GvVentas.DataSource = DtVentas
    GvVentas.DataBind()
End Sub

6.5 Para el CheckBox de la cabecera también es necesario crearle una propiedad.

Public Property CheckBoxAll() As Boolean
    Get
        Return Session("chkAll")
    End Get
    Set(ByVal value As Boolean)
        Session("chkAll") = value
    End Set
End Property

De igual manera lo mantenemos en sesión para que no se pierda al refrescar la página.

6.6 En los checkboxs de cabecera y los checkboxs de selección, en el XHTML se indica que ejecutarán unas funciones las cuales serán:

Protected Sub ToggleRowSelection(ByVal sender As Object, ByVal e As EventArgs)
    Dim chbSeleccionado As CheckBox = CType(sender, CheckBox)
    Dim orden As String = chbSeleccionado.ToolTip
    CType(chbSeleccionado.NamingContainer, GridItem).Selected = chbSeleccionado.Checked
    For index = 0 To DtVentas.Rows.Count - 1
        If DtVentas.Rows(index)("OrderID") = orden Then
            DtVentas.Rows(index)("seleccionado") = chbSeleccionado.Checked
            Exit For
        End If
    Next
End Sub

Protected Sub ToggleSelectedStateDisponibles(ByVal sender As Object, ByVal e As EventArgs)
    Dim chbAll As CheckBox = CType(sender, CheckBox)
    CheckBoxAll = chbAll.Checked
    For index = 0 To DtVentas.Rows.Count - 1
        DtVentas.Rows(index)("seleccionado") = CheckBoxAll
    Next
    For Each dataItem As GridDataItem In GvVentas.MasterTableView.Items
        CType(dataItem.FindControl("chbSeleccionado"), CheckBox).Checked = CheckBoxAll
        dataItem.Selected = CheckBoxAll
    Next
End Sub

Cambiamos el valor no sólo en los checkboxs sino también en el DataSource, dado que los valores no están amarrados.

6.7 La Grilla:

Private Sub GvVentas_ItemDataBound(sender As Object, e As Telerik.Web.UI.GridItemEventArgs) Handles GvVentas.ItemDataBound
    If TypeOf e.Item Is GridEditableItem Then
        Dim item As GridItem = e.Item
        Try
            Dim seleccionado As Boolean = Convert.ToBoolean(DirectCast(item.DataItem, DataRowView).Item("seleccionado"))
            Dim codigo As String = Convert.ToString(DirectCast(item.DataItem, DataRowView).Item("OrderID"))
            Dim chkSeleccionado As CheckBox = DirectCast(item.FindControl("chbSeleccionado"), CheckBox)
            chkSeleccionado.Checked = seleccionado
            chkSeleccionado.ToolTip = codigo
        Catch ex As Exception
        End Try
    ElseIf TypeOf e.Item Is GridHeaderItem Then
        Dim item As GridHeaderItem = e.Item
        Dim chkAll As CheckBox = DirectCast(item.FindControl("chbAll"), CheckBox)
        chkAll.Checked = CheckBoxAll
    End If
End Sub

Private Sub GvVentas_PageIndexChanged(sender As Object, e As Telerik.Web.UI.GridPageChangedEventArgs) Handles GvVentas.PageIndexChanged
    GvVentas.DataSource = DtVentas
    GvVentas.DataBind()
End Sub

Para los que desconocen los eventos, son
ItemDataBound: Se ejecuta cada vez que se carga la grilla y recorre todas las filas (incluyendo la cabecera y el footer). Nos sirve para asignar el valor del RadioButton oculto (con el valor seleccionado) al CheckBox que está en un ItemTemplate.
PageIndexChanged: Se ejecuta cuando cambias de página dentro de la grilla, esto ejecuta un render y por el Ajax se pierde el DataSource, por eso se debe guardar el valor obtenido en memoria.

6.8 El Botón Guardar:

Private Sub BtnGuardar_Click(sender As Object, e As System.EventArgs) Handles BtnGuardar.Click
   Dim dt As New DataTable
   dt.Columns.Add("Country")
   dt.Columns.Add("LastName")
   dt.Columns.Add("FirstName")
   dt.Columns.Add("ShippedDate")
   dt.Columns.Add("OrderID")
   dt.Columns.Add("SaleAmount")
   For Each i As GridDataItem In GvVentas.SelectedItems
       dt.Rows.Add()
       Dim index = dt.Rows.Count - 1
       dt.Rows(index)("Country") = i.GetDataKeyValue("Country").ToString()
       dt.Rows(index)("LastName") = i.GetDataKeyValue("LastName").ToString()
       dt.Rows(index)("FirstName") = i.GetDataKeyValue("FirstName").ToString()
       dt.Rows(index)("ShippedDate") = Date.Parse(i.GetDataKeyValue("ShippedDate"))
       dt.Rows(index)("OrderID") = i.GetDataKeyValue("OrderID").ToString()
       dt.Rows(index)("SaleAmount") = Decimal.Parse(i.GetDataKeyValue("SaleAmount"))
   Next
   GvSeleccionados.DataSource = dt
   GvSeleccionados.DataBind()
End Sub

Nos permitirá pasar de los seleccionados sus valores a la grilla de resultados.
La manera más fácil de obtener valores de respuesta es declararlos en el MasterTableView como DataKeyNames (Ejem: i.GetDataKeyValue(«LastName»)).

El código completo sería:

Imports Microsoft.Practices.EnterpriseLibrary.Data
Imports System.Data.SqlClient
Imports Telerik.Web.UI

Public Class RadGridExample
    Inherits System.Web.UI.Page

    Private db As Database = DatabaseFactory.CreateDatabase("NORTHWND")

#Region "Propiedades"
    Public Property DtVentas() As DataTable
        Get
            Return Session("DtVentas")
        End Get
        Set(ByVal value As DataTable)
            Session("DtVentas") = value
        End Set
    End Property

    Public Property CheckBoxAll() As Boolean
        Get
            Return Session("chkAll")
        End Get
        Set(ByVal value As Boolean)
            Session("chkAll") = value
        End Set
    End Property
#End Region

#Region "Eventos Página"
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            GvVentas.DataBind()
            GvSeleccionados.DataBind()
        End If
    End Sub
#End Region

#Region "Eventos Botón"
    Private Sub BtnBuscar_Click(sender As Object, e As System.EventArgs) Handles BtnBuscar.Click
        DtVentas = ObtenerVentas(DpDesde.SelectedDate, DpHasta.SelectedDate)
        GvVentas.DataSource = DtVentas
        GvVentas.DataBind()
    End Sub

    Private Sub BtnGuardar_Click(sender As Object, e As System.EventArgs) Handles BtnGuardar.Click
        Dim dt As New DataTable
        dt.Columns.Add("Country")
        dt.Columns.Add("LastName")
        dt.Columns.Add("FirstName")
        dt.Columns.Add("ShippedDate")
        dt.Columns.Add("OrderID")
        dt.Columns.Add("SaleAmount")
        For Each i As GridDataItem In GvVentas.SelectedItems
            dt.Rows.Add()
            Dim index = dt.Rows.Count - 1
            dt.Rows(index)("Country") = i.GetDataKeyValue("Country").ToString()
            dt.Rows(index)("LastName") = i.GetDataKeyValue("LastName").ToString()
            dt.Rows(index)("FirstName") = i.GetDataKeyValue("FirstName").ToString()
            dt.Rows(index)("ShippedDate") = Date.Parse(i.GetDataKeyValue("ShippedDate"))
            dt.Rows(index)("OrderID") = i.GetDataKeyValue("OrderID").ToString()
            dt.Rows(index)("SaleAmount") = Decimal.Parse(i.GetDataKeyValue("SaleAmount"))
        Next
        GvSeleccionados.DataSource = dt
        GvSeleccionados.DataBind()
    End Sub
#End Region

#Region "Eventos GridView"
    Private Sub GvVentas_ItemDataBound(sender As Object, e As Telerik.Web.UI.GridItemEventArgs) Handles GvVentas.ItemDataBound
        If TypeOf e.Item Is GridEditableItem Then
            Dim item As GridItem = e.Item
            Try
                Dim seleccionado As Boolean = Convert.ToBoolean(DirectCast(item.DataItem, DataRowView).Item("seleccionado"))
                Dim codigo As String = Convert.ToString(DirectCast(item.DataItem, DataRowView).Item("OrderID"))
                Dim chkSeleccionado As CheckBox = DirectCast(item.FindControl("chbSeleccionado"), CheckBox)
                chkSeleccionado.Checked = seleccionado
                chkSeleccionado.ToolTip = codigo
            Catch ex As Exception
                'rbtPredeterminado.Checked =  False
            End Try
        ElseIf TypeOf e.Item Is GridHeaderItem Then
            Dim item As GridHeaderItem = e.Item
            Dim chkAll As CheckBox = DirectCast(item.FindControl("chbAll"), CheckBox)
            chkAll.Checked = CheckBoxAll
        End If
    End Sub

    Private Sub GvVentas_PageIndexChanged(sender As Object, e As Telerik.Web.UI.GridPageChangedEventArgs) Handles GvVentas.PageIndexChanged
        GvVentas.DataSource = DtVentas
        GvVentas.DataBind()
    End Sub
#End Region

#Region "Funciones"
    Public Function ObtenerVentas(ByVal finicio As Date, ByVal ffinal As Date) As DataTable
        Dim cmd As New SqlCommand("EmployeeSalesByCountry")
        cmd.CommandType = CommandType.StoredProcedure
        db.AddInParameter(cmd, "Beginning_Date", DbType.DateTime, finicio)
        db.AddInParameter(cmd, "Ending_Date", DbType.DateTime, ffinal)
        Return db.ExecuteDataSet(cmd).Tables(0)
    End Function

    Protected Sub ToggleRowSelection(ByVal sender As Object, ByVal e As EventArgs)
        Dim chbSeleccionado As CheckBox = CType(sender, CheckBox)
        Dim orden As String = chbSeleccionado.ToolTip
        CType(chbSeleccionado.NamingContainer, GridItem).Selected = chbSeleccionado.Checked
        For index = 0 To DtVentas.Rows.Count - 1
            If DtVentas.Rows(index)("OrderID") = orden Then
                DtVentas.Rows(index)("seleccionado") = chbSeleccionado.Checked
                Exit For
            End If
        Next
    End Sub

    Protected Sub ToggleSelectedStateDisponibles(ByVal sender As Object, ByVal e As EventArgs)
        Dim chbAll As CheckBox = CType(sender, CheckBox)
        CheckBoxAll = chbAll.Checked
        For index = 0 To DtVentas.Rows.Count - 1
            DtVentas.Rows(index)("seleccionado") = CheckBoxAll
        Next
        For Each dataItem As GridDataItem In GvVentas.MasterTableView.Items
            CType(dataItem.FindControl("chbSeleccionado"), CheckBox).Checked = CheckBoxAll
            dataItem.Selected = CheckBoxAll
        Next
    End Sub
#End Region

End Class

Al final tendremos una secuencia como lo siguiente:

1

2

3

Se agradece cualquier mejora del código, espero les sea de utilidad.

Selenium IDE

Publicado: 26 de septiembre de 2012 en Ingeniería de Software, Java
Etiquetas:

Los que nos dedicamos a la ingeniería de software sabemos que uno de los pasos para el desarrollo de software son las pruebas, entre estas pruebas nos encontramos con las pruebas funcionales.
Selenium IDE es una alternativa libre y potente (pero OJO es sólo para uso con páginas webs), lo que nos permite grabar procedimientos realizados en una página web y poder recrearlo o diferente data.
Para comenzar, cómo captar un proceso en Selenium, tenemos que instalar el plugin para el browser (el plugin viene desarrollado para Firefox).
Lo podemos descargar de los complementos de Firefox como Selenium IDE Buttom

Selenium IDE Button

Para que sea visible dentro de Firefox lo tenemos que agregar de la siguiente manera:

Mostrar Selenium IDE Button

En disposición de las barras de herramientas nos abrirá un cuadro con diferentes botones, entre ellos el de Selenium, arrastrar el botón hacia donde queramos que se muestre:

Herramientas

Mostrar Selenium IDE Button

Luego vamos a hacer la prueba con un formulario de prueba.

Para que registre en la tabla:

Create table Persona(
id int identity(1,1) primary key,
nombre varchar(100),
apepaterno varchar(50),
apematerno varchar(50),
fecnacimiento date,
email varchar(100)
)

La manera de grabar el procedimiento es sencilla, primero abrimos el IDE como Pop Up o de manera anidada.

SideBar

Para el ejemplo lo abriremos como SideBar.

Empezamos el grabado de pasos haciendo clic en el botón con un círculo rojo (tooltip: clic to record) y para terminar deseleccionamos la misma opción.

Como se ve en el lado izquierdo se registran los pasos realizados, y podemos recrearlos.
Actualmente en la BD:

Para reproducir los pasos en el navegador ejecutamos el primer botón y en el slider de abajo podemos definir la velocidad de ejecución.

Este empieza a reproducir los pasos grabados en la pantalla.

Ahora en BD:

Pero de qué nos serviría si sólo pudiéramos hacer esto?, la cuestión es poder mandar la data a nuestro gusto no?, bueno aquí entra la magia de Selenium, nos permite importar el script en diferentes lenguajes, nosotros por supuesto elegiremos nuestro lenguaje de programación favorito “Java”.

Generar Script Java

Elegimos la tercera opción: y obtenemos lo siguiente:

package com.example.tests;

import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class Script {
private WebDriver driver;
private String baseUrl;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "http://localhost:62368/";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

@Test
public void testScript() throws Exception {
driver.get(baseUrl + "/default.aspx");
driver.findElement(By.id("MainContent_TxtNombre")).clear();
driver.findElement(By.id("MainContent_TxtNombre")).sendKeys("Diego");
driver.findElement(By.id("MainContent_TxtApePaterno")).clear();
driver.findElement(By.id("MainContent_TxtApePaterno")).sendKeys("Castañeda");
driver.findElement(By.id("MainContent_TxtApeMaterno")).clear();
driver.findElement(By.id("MainContent_TxtApeMaterno")).sendKeys("Avalos");
driver.findElement(By.id("MainContent_TxtFecNacimiento")).clear();
driver.findElement(By.id("MainContent_TxtFecNacimiento")).sendKeys("1988-09-17");
driver.findElement(By.id("MainContent_TxtEmail")).clear();
driver.findElement(By.id("MainContent_TxtEmail")).sendKeys("castaneda.diego@live,com");
driver.findElement(By.id("MainContent_BtnGrabar")).click();
}

@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}

private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}
}

Este código lo vamos a reutilizar dentro de un proyecto que crearemos en NetBeans. Pero antes debemos descargarnos las librerías para manejar este IDE, del mismo sitio web de Selenium.
http://seleniumhq.org/download/
Ahora crearemos nuestro proyecto y agregaremos las librerías.
La arquitectura quedará similar a:

Proyecto Selenium

La entidad Persona:

package com.wordpress.elgrandikas.selenium.be;

import java.io.Serializable;
import java.util.Date;

/**
*
* @author elgrandikas
*/
public class Persona implements Serializable{

private Integer id;
private String nombre;
private String apePaterno;
private String apeMaterno;
private Date fecha;
private String email;

public Persona() {
}

public Persona(String nombre, String apePaterno, String apeMaterno, Date fecha, String email) {
this.id = 0;
this.nombre = nombre;
this.apePaterno = apePaterno;
this.apeMaterno = apeMaterno;
this.fecha = fecha;
this.email = email;
}

public String getApeMaterno() {
return apeMaterno;
}

public void setApeMaterno(String apeMaterno) {
this.apeMaterno = apeMaterno;
}

public String getApePaterno() {
return apePaterno;
}

public void setApePaterno(String apePaterno) {
this.apePaterno = apePaterno;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public Date getFecha() {
return fecha;
}

public void setFecha(Date fecha) {
this.fecha = fecha;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

}

La clase SeleniumTest contendrá el código que exportamos desde Firefox, con algunas modificaciones que nos convengan.

package com.wordpress.elgrandikas.selenium.bl;

import com.wordpress.elgrandikas.selenium.be.Persona;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import static org.junit.Assert.fail;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

/**
*
* @author elgrandikas
*/

public class SeleniumTest {

private WebDriver driver;
private String baseUrl;
private StringBuffer verificationErrors = new StringBuffer();
@Before
public void setUp() throws Exception {
driver = new FirefoxDriver();
baseUrl = "http://localhost:62368";
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

@Test
public void testScript(Persona p) throws Exception {
driver.get(baseUrl + "/default.aspx");
driver.findElement(By.id("MainContent_TxtNombre")).clear();
driver.findElement(By.id("MainContent_TxtNombre")).sendKeys(p.getNombre());
driver.findElement(By.id("MainContent_TxtApePaterno")).clear();
driver.findElement(By.id("MainContent_TxtApePaterno")).sendKeys(p.getApePaterno());
driver.findElement(By.id("MainContent_TxtApeMaterno")).clear();
driver.findElement(By.id("MainContent_TxtApeMaterno")).sendKeys(p.getApeMaterno());
driver.findElement(By.id("MainContent_TxtFecNacimiento")).clear();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
driver.findElement(By.id("MainContent_TxtFecNacimiento")).sendKeys(df.format(p.getFecha()));
driver.findElement(By.id("MainContent_TxtEmail")).clear();
driver.findElement(By.id("MainContent_TxtEmail")).sendKeys(p.getEmail());
driver.findElement(By.id("MainContent_BtnGrabar")).click();
}

@After
public void tearDown() throws Exception {
driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}

private boolean isElementPresent(By by) {
try {
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}

}

Mientras que nuestra clase Main nos servirá de disparador del proceso:
package com.wordpress.elgrandikas.selenium.gui;

import com.wordpress.elgrandikas.selenium.be.Persona;
import com.wordpress.elgrandikas.selenium.bl.SeleniumTest;
import java.util.Date;

/**
*
* @author elgrandikas
*/
public class Main {

public static void main(String[] args) {
try {
Persona objPersona = new Persona("Aurelio", "Obando", "Tavara", new Date(), "comecat@server.com");
SeleniumTest st = new SeleniumTest();
st.setUp();
st.testScript(objPersona);
System.out.println("Término el proceso correctamente");
} catch (Exception e) {
System.out.println("Error al ejecutar el proceso");
e.printStackTrace();
}
}
}

Ejecutamos el proyecto
Al ejecutar se abrirá un navegador de Firefox y ejecutará el proceso con los datos que le pasamos:

Ejecución Proyecto 1

En la base datos ahora:

Les dejo a su libre pensamiento como utilizar esta poderosa herramienta para su conveniencia, yo en lo personal la descubrí queriéndome evitar el trabajo de hacer tareas repetitivas.
Este IDE también en proceso durante diferentes páginas, no sólo en una y además de permitir ubicar controles por su ID puede permitir su NAME para algunos controles que son creados con ID dinámico por JavaScript.

Ingeniería de Software en la Nube

Publicado: 19 de febrero de 2011 en Ingeniería de Software

Hoy quiero compartir ciertos enlaces que para los estudiantes, practicantes y/o aficionados a la ingeniería de software les parecerá bárbaro. A cuantos no les ha pasado que cuando terminan el cursos de ingeniería de software tienden a desinstalar el modelador (dígase Rational Suite, Power Desginer, Erwin, etc) por su gran peso dentro del disco, o simplemente formatearon y ya no lo instalaron, y en algún momento de la nada se te pide algunos diseños rápidos de software, y dice ¡TENGO QUE INSTALAR SOLO POR ESO… NOOOOOOO!, cierto?, o a quién no le han pedido ¡Quiero un software, pero como sería!, ya a veces te pasas horas de horas haciéndolo los prototipos (pantallas para los que no lo conocen así), y se toman una eternidad para eso, y a veces al cliente no le gusta y en fin, cosas como estas no deben ser una molestia para el ingeniero, pues existen herramientas muy útiles en la web para aventajar al tiempo y evitar utilizar herramientas demasiado pesadas, para cosas muy simples … además u punto aparte es que su presentación a nivel de prototipos es de lo mejor, bueno aquí les dejo 3 alcances de lo que suelo utilizar.

  1. Balsamiq Mockups: Aprendí esto en el primer trabajo que tuve, y vaya que me sirvió en adelante.

    Es una herramienta que sirve para realizar diseño de prototipos, para software de escritorio, web y móvil!

    El link: http://www.balsamiq.com/

    Sólo se trata de arrastrar y configurar, todos los componentes vienen con ejemplos de configuración.

    Algunos ejemplos de desarrollo:

  • Windows Application

     

  • Web Application

     

  • Mobile Application

     

  1. yUML: Este lo encontré un día que necesitaba hacer casos de uso y no quería instalar nada.

    Es una herramienta que te permite hacer diagramas de clases, de casos de uso y de actividad; haciendo uso de un intérprete de comandos muy sencillos.

    El link: http://www.yuml.me/

    Solo es necesario ver los ejemplos, para saber cómo implementar los comandos

     

  • Diagrama de clases

    Con los siguientes comandos:

    # Cool UML Diagram

    [Blog Administrator]+*->1[Blog]

    [Blog]1->1[Style]

    [Blog]-*>[Post]

    [Post]->*[Coments]

    Generamos el siguiente diagrama:

     

  • Diagrama de actividad

    Con los siguientes comandos:

    (start)-><d1>logged in->(Blog, with options for edit)->|a|->(end)

    <d1>not logged in->(Blog, no editable)->|a|

    Generamos el siguiente diagrama:

     

  • Diagrama de casos de uso

    Con los siguientes comandos:

    [Dikas]-(Login)

    [Dikas]-(Logout)

    (Login)>(Send a post)

    (Login)>(Add a user)

    Generamos el siguiente diagrama:

  1. WebSequenceDiagrams: Este lo ubique por lo mismo que el anterior.

    Los diagramas de secuencia, nunca han sido tan fáciles de implementar.

    El link: http://www.websequencediagrams.com/

    Con los siguientes comandos:

Dikas->GUI: Button Event

GUI->BL: Registrar

BL->DAO: RegistrarBD

 

Generamos el siguiente diagrama:

 

 

Espero les sirva de mucho, y si es así no olviden dejar sus comentarios.

Como poner una imagen de fondo en un JFrame

Publicado: 18 de febrero de 2011 en Java

Muchas veces queremos personalizar nuestro formulario, para hacerlo de cierta forma más atractivo a la vista, una de las cosas que siempre deseamos es el intentar ponerle una imagen de fondo, cuando estás acostumbrado a escribir todo de cero, no le vez la mayor importancia, pero muchas veces, necesitas avanzar y utilizas potentes IDE, tal como Netbeans, es aquí donde empieza la dificultad, pues la mayoría de soluciones a esto nos dan la respuesta escribiendo código de cero, yo les explicaré como hacerlo con un formulario con todos sus objetos (cajas de texto, etiquetas, botones) elegidos y situados de manera gráfica. Utilizaremos un patrón adapter para esta solución.

Paso 1: Crear el proyecto con estas 3 clases: un JFrame, un JPanel y una clase adaptada.

Paso 2: Agregar una imagen al proyecto.

Paso 3: Modificar el Panel a la idea que queramos del formulario.

Paso 4: Adaptar la clase por herencia y agregar el método paintComponent.

package gui;

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.ImageIcon;

/**
*
* @author Dikas
*/

public class ClaseAdaptada extends Panel {

public ClaseAdaptada() {
super();
}

@Override
public void paintComponent(Graphics g) {
Dimension tam = getSize();
ImageIcon imagen = new ImageIcon(getClass().getResource("/gui/ardillatierna.jpg"));
g.drawImage(imagen.getImage(), 0, 0, tam.width, tam.height, null);
setOpaque(false);
super.paintComponent(g);
}

}

Paso 5: Agregar un JPanel al JFrame. Lo llamaremos pnlContainer.

Paso 6: Escribir esto en el constructor del formulario.

public Formulario() {
initComponents();
JPanel objPanel = new ClaseAdaptada();
objPanel.setSize(pnlContainer.getWidth(), pnlContainer.getHeight());
pnlContainer.add(objPanel);
pnlContainer.validate();
}

Paso 7: Compilamos y probamos: