Aperfeiçoando o Comportamento de Gravação com Subitens

Subitens são partes definidas por Functional Tester de um controle em teste. Em alguns casos, você obtém melhores resultados gravando a interação de usuário com detalhes do SubItem, e não apenas com as informações de coordenadas. A desvantagem de usar as informações de coordenadas é que quando partes de um controle são redimensionadas, a reprodução de ações do usuário pode não retornar os mesmos resultados.
Por exemplo, em um controle de tabela cuja largura de coluna possa ser redimensionada, a gravação de cliques com coordenadas não é significativa durante a reprodução quando a largura da coluna é alterada.

O Functional Tester tem um conjunto de Subitens predefinidos e o proxy pode usá-lo durante a gravação. Durante a gravação, o proxy determina o SubItem em um ponto e o envia junto com o método de ação do usuário para TestObject. No momento da reprodução, o proxy determina novamente a coordenada do SubItem e a ação do usuário é reproduzida.

Você pode estender os métodos listados em Tabela 1:
Tabela 1. Métodos de Proxies Extensíveis
Java .Net
System.Collections.ArrayList GetActionArgs(System.Drawing.Point point) void (IMouseActionInfo action)
System.Drawing.Rectangle GetSubitemRect(Rational.Test.Ft.Script.Subitem subitem) java.awt.Rectangle getScreenPoint (Subitem subitem)

Gravando Métodos com Subitens

Durante a gravação de um evento, o método ProcessMouseEvent é chamado. Depois, o proxy determina os Subitens em determinados pontos e esses Subitens são gravados como parte do evento.
O seguinte código é um exemplo de como o evento é gravado:
listBox.click(atText("Item1"));

Neste exemplo, click é o evento. O parâmetro atText("Item1") é o subItem que o proxy encontra no ponto. No caso de .Net, a API GetActionArgs() retorna um ou mais Subitens do controle. Determinar qual SubItem usar é específico do controle.

O seguinte exemplo mostra a implementação Java dos métodos de gravação com Subitens:

{
	. 
	.
        Vector args = new Vector(20);
	SubItem subItem = null;
	IMouseEventInfo event0 = action.getEventInfo(0);
	Point firstPoint = new Point ( event0.getX(), event0.getY() );
	Point firstPointToList = new Point ( firstPoint.x, firstPoint.y );
	int itemIndex = locationToIndex(firstPointToList);
	String itemText = ((java.awt.List)theTestObject).getItem(itemIndex);
	if (itemText!= null && ! itemText.equals("") )
		 subItem = new Text(item);
	diferente
		subItem = new Index(atIndex);
	.
	.
	args.addElement(subItem);
	.
	.
	}

O seguinte exemplo mostra a implementação .Net dos métodos de gravação com Subitens:

protected override System.Collections.ArrayList GetActionArgs(System.Drawing.Point point)
{
	System.Collections.ArrayList args = new System.Collections.ArrayList() ;
	Subitem subitem = null ;
	System.Drawing.Point clientPoint = ((Control)theTestObject).PointToClient(point) ;
	int itemIndex = ((ListBox)theTestObject).IndexFromPoint(clientPoint) ;
        string itemText = ((ListBox)theTestObject).GetItemText(item);

	if (itemText == null || itemText.Length == 0)
	{
	        // o item não tem texto, portanto, gere um índice
		subitem = new Rational.Test.Ft.Script.Index(itemIndex) ;
	}
	if ( subitem != null )
	{
		args.Add(subitem) ;
	}

	return args ;
}

Reproduzindo Métodos com Subitens

Durante a reprodução, o proxy precisa encontrar a coordenada de tela de um SubItem para reproduzir a ação do usuário.

O seguinte exemplo mostra a implementação Java de métodos de reprodução com Subitens:

public void click(MouseModifiers modifiers, Subitem subitem)
{
	.
	.
	Point pt = this.getScreenPoint(subitem);
	new Screen().click( modifiers, pt);
	.
	.
}

public java.awt.Rectangle getScreenPoint (Subitem subitem)
{
	int index = getItemIndex(subitem);
	if ( index == -1 )
		return null;
        java.awt.Rectangle rectCell = getCellBounds(index);
	java.awt.Rectangle rectScreen = this.getScreenRectangle();
	return new java.awt.Rectangle
	( rectScreen.x + rectCell.x, rectScreen.y + rectCell.y,
	  rectCell.width, rectCell.height );

}

O seguinte exemplo mostra a implementação .Net de métodos de reprodução com Subitens:

protected override System.Drawing.Rectangle GetSubitemRect(Rational.Test.Ft.Script.Subitem subitem)
{
	int index = GetItemIndex(subitem) ;		
	return ((ListBox)theTestObject).GetItemRectangle(index) ;
}
Depois de desenvolver e implementar com êxito este código de proxy, os métodos gravados ficam os Subitens adequados e a reprodução ocorre como esperado.

Feedback