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.
Antes de Iniciar
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)
Tarefas relacionadas
Criando uma Classe de Proxy
Incluindo Mais Propriedades de Controle
Incluindo Mais Tipos de Dados para um Controle
Aperfeiçoando o Comportamento de Gravação
Estendendo o Transporte de Dados
Alterando a Função de um Controle
Modificando o Peso e as Propriedades de Reconhecimento de um Controle
Alterando a Mapeabilidade de um Controle

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.
Antes de Iniciar
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.
Antes de Iniciar

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) ;
}
O que Fazer Depois
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