Testes de usabilidade com Selenium – Instalação

Testes de usabilidade são muito importantes para aplicações web, por isso vou escrever alguns tutoriais a respeito do Selenium, que é uma suite de aplicativos para testes.

Antes de qualquer coisa, vamos instalar o Selenium no Ubuntu. A maior parte do processo será igual para Windows e Mac já que optei por utilizar o PIP.  Se você usa Windows, precisa instalar Python antes. Confira o python.org para como proceder.

1- Instalando Pip:

Abra o Terminal, e baixe o script get-pip.py via curl.

curl -O https://bootstrap.pypa.io/get-pip.py

Execute o script. Obs: Se você executar o script com a flag –user, o pip será instalado somente na pasta do usuário, em .local/bin.

python get-pip.py --user

O resultado será exibido assim:

Collecting pip
	Downloading pip-8.1.2-py2.py3-none-any.whl (1.2MB)
Collecting setuptools
	Downloading setuptools-26.1.1-py2.py3-none-any.whl (464kB)
Collecting wheel
	Downloading wheel-0.29.0-py2.py3-none-any.whl (66kB)
Installing collected packages: pip, setuptools, wheel Successfully installed pip setuptools wheel

Depois da instalação, precisamos colocar a pasta .local/bin na variável de ambiente PATH. Você pode usar os arquivos .profile ou .bashrc. Como editor eu gosto do nano, então (Obs: no Mac eu usaria .profile):

nano ~/.bashrc

Na última linha nós adicionamos:

export PATH=~/.local/bin:$PATH

Caso você não saiba, esse comando adicionará a pasta .local/bin à existente varável PATH. De agora em diante, toda vez que você digitar no Terminal, o sistema verificará se seu comando corresponde aos executáveis da pasta .local/bin. E esse é o caso do PIP, o comando pip executará o arquivo pip.py que está nesta pasta. Salve o arquivo. Recarregue o PATH digitando:

source ~/.bashrc

Para testar digite:

pip -v

Se tudo deu certo, as instruções de ajuda do comando pip aparecerão na tela! 🙂

2- Agora instalamos o Selenium.

Eu gosto da flag –user para manter a instalação local. A flag -U, irá executar um update de repositório do pip:

pip install -U selenium --user

Após a instalação pracisamos instalar as interfaces dos WebDrivers para seu navegador escolhido. Para desenvolvimento eu uso o Chrome, logo demonstrarei o processo usando a interface para o Chrome, porém os passos serão os mesmos para os outros navegadores. Ao fim do post, tem links para as interfaces dos demais navgadores.

2.1- Baixando sua interface.

Para o Chrome vamos para o link https://sites.google.com/a/chromium.org/chromedriver/downloads e baixamos o release mais recente. Será um arquivo zip. Descompactamos o mesmo, e colocamos o executável em qualquer pasta do sistema, desde que o destino esteja listado na varável PATH. Eu coloco meus arquivos na pasta .local/bin, a mesma onde o pip está instalado. Como o nome sugere, a pasta serve para armazenar binários.

Uma vez os executáveis no lugar correto, a instalação está concluída!

3- Let’s test.

Vamos testar no console interativo do Python:

python

Tente o seguinte:

from selenium import webdriver

browser = webdriver.Chrome()
browser.get('http://google.com')

Assim que você definir a variável browser, uma janela do Chrome ira saltar na tela. Não se preocupe! É exatamente o que queremos! O comando get() fará a janela do Chrome acessar a página do Google!

Perfeito! Conseguimos nosso primeiro passo. Agora conseguimos controlar nosso navegador via script, e assim automatizar nossos testes.

Nos próximos posts veremos como criar os testes.

REFERÊNCIAS:

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install-linux.html

https://www.rosehosting.com/blog/how-to-install-pip-on-ubuntu-16-04/

https://pypi.python.org/pypi/selenium

https://docs.python.org/3/library/unittest.html

unittest introduction

http://docs.python-guide.org/en/latest/writing/tests/

https://jeffknupp.com/blog/2013/12/09/improve-your-python-understanding-unit-testing/

http://www.seleniumhq.org/docs/03_webdriver.jsp

 

INTERFACES de WEBDRIVERS:

Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads

Firefox: https://github.com/mozilla/geckodriver/releases

Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/

Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

 

Youtube:

Browser elements & Operations: https://youtu.be/ph3NJm4Z7m4?t=21m31s

Selenium Methods and Functions: https://youtu.be/ph3NJm4Z7m4?t=32m1s

 

Blender – script para vídeo

Depois de muito tempo sem postagem…

Estou trabalhando o uso de Python scripts no Blender para uso em animações. É um trabalho bem diferente do uso na game engine, mas igualmente cheio de possibilidades.

Esses primeiros, que estou compartilhando são super simples, mas mostram o uso das APIs para tarefas do tipo: criam uma esfera, uma animação linear, edição de curvas para animação, e iniciam a renderização.

1- super simples

2- usando matriz de rotação

3- editando curvas de animação

4- usando event handlers, animando um ‘enxame’

No futuro eu posto outros exemplos.

Colisões :: GameDev receitas Unity3D

Detetar colisões entre objetos é uma prática fundamental para (quase) todo jogo eletrônico.
Além de detetar as colisões, é importante saber o que fazer, depois que elas ocorrem.
As game engines, sempre possuem recursos para a deteção de colisões, e esse é um tópico muito importante de ser observado, antes de escolher qual game engine utilizar para seu projeto.

Em linhas gerais, os pontos básicos a serem observados são:
– como se configura a deteção de colisão;
– quais geometrias de colisão (esferas, cubos, planos …) são disponibilizados pela engine;
– Se a game engine, permite deteção de colisão com geometria 3D (mesh).

Quando as colisões são detetadas, em geral, eventos são disparados pelo sistema. E esses eventos, podem ser capturados por objetos de jogo; que iniciam funções, para gerar a dinâmica do jogo.

Para esses exercícios no Unity3D, monte uma cena como descrita na imagem abaixo:
CenaCollisions
Obs.: Durante o tutorial, vou utilizar os nomes dos elementos como estão marcados na imagem acima.

No Unity3D, as deteção de colisões são realizadas pela engine de física, portanto, os elementos necessários para a deteção estão localizados no menu Componet >> Physics, são eles os Colliders e o Rigidbody.

Para começarmos o demo, vamos adicionar e configurar os elementos básicos necessários.
Observe no objeto SphereTrigger, se há o component SphereCollider, e se esse component está marcado como um Trigger. Caso não haja o componente collider, para adicioná-lo, selecione o objeto SphereTrigger, vá ao menu Component >> Physics >> Sphere Collider. E para marcá-lo como trigger, vá ao componente no painel Inspector, e selecione a opção “Is Trigger”.

O objeto Cube, irá desempenhar um papel importante nesse demo, ele andará pela tela com os comandos do usuário, e irá demonstrar o funcionamento das colisões. Para configurá-lo, verifique se o mesmo possui o componente Box Collider, porém esse não pode ser marcado como um trigger. Adicione também ao Cube, o componente Rigidbody. Para adicionar tal componente, selecione o Cube, vá ao menu Component >> Physics >> Rigidbody. E nesse caso é importante marcar a opção “Is Kinematic”, isso nos permitirá mover o Cube, sem a necessidade de simulações de física.
Para finalizar, basta adicionar dois scripts ao cubo; Primeiro o script BasicInputHandlerCube, que você encontra no tutorial sobre Inputs de Usuário; O segundo script a ser adicionado é o script abaixo:

BasicCollisionHandlerCube:
[code lang=”java”]
private var colisionInfo:String = “Collision info”;
function Update () {
}

function OnCollisionEnter(col : Collision){
colisionInfo = “Collision Enter (Rigidbody) : “;
}

function OnCollisionExit(col : Collision){
colisionInfo = “Collision Exit (Rigidbody) : “;
}

function OnTriggerEnter(col : Collider){
colisionInfo = “Collision Enter (Trigger) : “;
}

function OnTriggerExit(col : Collider){
colisionInfo = “Collision Exit (Trigger) : “;
}

function OnTriggerStay(col : Collider){
colisionInfo = “Collision Stay (Trigger) : “;
}

function OnGUI(){
GUI.Label(Rect(200,75,300,100),colisionInfo);
}
[/code]

Após esse trabalho, quando você executar o jogo, verá na parte central da tela, um texto exibindo algumas informações sobre a colisão, quando ela existir.
O que acontece é o seguinte. Como dito anteriormente, o Unity3D, realiza as colisões usando a engine de física, logo, os Colliders são os “sensores” que são usados para calcular quando um “toca” ou “permeia” a àrea de outro collider. Quando esse toque é detetado, o componente Rigidbody dos objetos é informado, e envia uma mensagem para o gameObject que pode ser: OnCollisionEnter, OnCollisionStay, OnCollisionExit, OnTriggerEnter, OnTriggerStay, ou OnTriggerExit.
No caso de uma colisão com um trigger, que é o caso do objeto SphereTrigger, serão enviadas as mensagens OnTriggerEnter, quando a colisão se iniciar; OnTriggerStay, enquanto a colisão estiver em curso; OnTriggerExit, quando os objetos param de colidir.
No caso de uma colisão com um rigidbody, serão enviadas as mensagens OnCollisionEnter, OnCollisionStay, e OnCollisionExit, seguindo os mesmos princípios das colisões com Triggers.

Portanto, o que script faz é o seguinte, quando uma mensagem de colisão é enviada, o script BasicCollisionHandlerCube acionará a função apropriada à colisão, e irá mudar o texto da mensagem que aparece na tela, informando se a colisão foi com um Trigger, ou com um Rigidbody.

Para fazer a colisão com um rigidbody, vamos cofigurar o objeto SphereObject. Verifique se se a SphereObject, possui um SphereCollider (não trigger), e um Rigidbody (não kinematic).
Então use o Cube, para colidir sobre esse objeto e veja o resultado. Você verá que a esfera, não irá se interpolar com o Cube, e ainda irá reagir como uma bolinha sobre o plano.

Veja o exemplo final aqui.

As outras esferas que temos nas cenas, podem ser configuradas como lhe interessar. Use-as para experimentar.

Mensagens :: Gamedev receitas Unity3D

Para enviar mensagens de eventos entre objetos de jogo no Unity3D, há duas possibilidades: 1 – Enviar a mensagem para os objetos com parentesco; 2 – Fazer uma busca pela cena para encontrar objetos de jogo, e executar um componente.

Mensagens
Inicialmente, vejamos o primeiro modo, com objetos agrupados usando dos método, SendMessage, BroadcastMessage, e SendMessageUpwards.
Para começar, criamos uma cena com elementos básicos como descrito na imagem abaixo:
imagemCenaMessages
Obs.: Monte sua cena com elementos semelhantes a esses, e dê os mesmos nomes. Os objetos fountain, e cannon, devem possuir um EllipsoidParticleEmitter, um ParticleRender e um ParticleAnimator, configure-os como quiser.
Obs 2.: No objeto Cube2, utilize o script BasicInputHandler, visto no tutorial sobre Inputs de usuário.

SendMessage
O método SendMessage irá executar uma determinada função em qualquer componente do gameObject que enviou a mensagem.
No objeto fountain, coloque o seu BoxCollider Component como um trigger. Crie esses dois scripts, e os arraste para o gameObject.

FountainScript:
[code lang=”java”]
function Update () {
}

function TurnFountainOn( v: boolean){
particleEmitter.emit = v;
}
[/code]

SendSimpleMessageScript:
[code lang=”java”]
function Update () {
}

function OnTriggerEnter(col: Collider){
this.SendMessage(“TurnFountainOn”, true);
}

function OnTriggerExit(col: Collider){
this.SendMessage(“TurnFountainOn”, false);
}
[/code]

Ao arrastar esses scripts para o gameObject fountain, eles se tornam Components. O SendSimpleMessageScript irá detectar colisões com o seu BoxCollider (setado como um trigger), e na entrada e saída das colisões irá executar o envio de mensagem “TurnFountainOn”, junto com um valor boleano true ou false.
O FountainScript, possui a função TurnFountainOn, que irá ligar, ou desligar a emição de partículas, de acordo com o recebimento do parámetro true ou false.
Veja mais detalhes nesse link.

BroadcastMessage
O método BroadcastMessage fará o mesmo que o método SendMessage, porém com a possibilidade de enviar as mensagens para outros gameObjects, desde que esses gameObjects sejam filhos do objeto que enviar as mensagens.

Para essa etapa, arraste o gameObject cannon sobre o objeto cannonPlat (faça isso no painel, não na cena de jogo), para que ele seja um “filho” do cannonPlat.
Arraste o script FountainScript para o objeto cannon.
No objeto cannonPlat, configure seu BoxCollider como um trigger.

Crie um novo script, BroadcastMessageScript:
[code lang=”java”]
function Update () {
}

function OnTriggerEnter(col: Collider){
this.BroadcastMessage(“TurnFountainOn”, true);
}

function OnTriggerExit(col: Collider){
this.BroadcastMessage(“TurnFountainOn”, false);
}
[/code]

Esse script funciona basicamente como o SendSimpleMessageScript, detecta colisões com seu trigger, e chama a função TurnFountainOn, em qualquer objeto que seja “filho” do objeto cannonPlat.

Find Component
Todo gameObject no Unity3D pode executar a função Find, que irá procurar por gameObjects pela cena. Dessa busca, os Components dos objetos são acessíveis, e podemos executar funções pertencentes à eles.

Para essa etapa, configure o BoxCollider do objeto plat, como um trigger. Adicione o FountainScript ao objeto cannon.

Crie o seguinte script, FindBehaviorScript:
[code lang=”java”]
function Update () {
}

function OnTriggerEnter(col: Collider){
GameObject.Find(“cannon”).GetComponent(“FountainScript”).TurnFountainOn(true);
GameObject.Find(“fountain”).GetComponent(“FountainScript”).TurnFountainOn(true);
}

function OnTriggerExit(col: Collider){
GameObject.Find(“cannon”).GetComponent(“FountainScript”).TurnFountainOn(false);
GameObject.Find(“fountain”).GetComponent(“FountainScript”).TurnFountainOn(false);
}
[/code]

Arraste o script para o objeto plat. Assim como os scripts anteriores, esse script irá atentar para colisões, e então, Pesquisar na cena pelos objetos cannon, e fountain. Com esses objetos localizados, o script busca pelo componente FountainScript, e então executa a função TurnFountainOn.
Veja esse link para mais informações.

Veja aqui o exemplo final.

Curso Blender Game Engine – aula 4

Nesse vídeo há uma explicação simples sobre uso de controladores Python, no Blender GE. E uma explicação introdutória sobre alguns conceitos importantes, e recorrentes, de programação em Python na GE do Blender.

Para quem não sabe nada sobre programação em python, nunca usou a linguagem, sugiro a leitura do curso escrito pela Async, “Python na prática”, encontrado nesse link: http://www.async.com.br/projects/python/pnp/

Abaixo há um vídeo de apêndice, onde alguns pontos muito, mas muito básicos mesmo, são abordados. Esse vídeo é direcionado para pessoas realmente iniciantes, que ainda não dominam conceitos de linguagens de programação. Se esse for seu caso, assista esse vídeo, e estude os tópicos abordados. O arquivo resultante do vídeo abaixo pode ser baixado aqui: video1.blend

Curso Blender Game Engine – aula 5

Nesse vídeo, iniciamos um uso prático de script em Python controlando alguns itens de API da Blender GE.

Temas abordados:
– uso de scripts em Python
– controladores Python a AND
– Sensores: Collision, Property, Always.
– Actuators: Motion, Property
– captura de objetos em cena, via script.
– uso da função alignAxisToVect
– subtração de vetores.

Curso de Blender Game Engine – aula 3

Tópicos abordados no vídeo:
– Introdução sobre colisões, e elementos de física – Propriedades de física dos objetos – Collision Sensors – Visibility, e Property Actuators
– Compatibilidade de colisões entre entidades de física distintas
– Propriedades dos objetos
– Visualização de Física
– Visualização de Propriedades para debug

 

 

Curso Blender Game Engine – aula 2

Neste segundo vídeo sobre a game engine do Blender, é hora de falar sobre os blocos lógicos (Sensors, Controllers e Actuators) e seu funcionamento. No vídeos é abordado o uso dos seguintes blocos:

– sensores de teclado;
– controlador AND;
– “atuador” de Simple Motion;
– parentescos de objetos.

Curso de Blender Game Engine – aula 1

Olá Pessoal!
Na próxima semana começo a ministrar no SESC Carmo, um curso sobre a game engine do Blender, e pretendo postar aqui, os vídeos e os arquivos das aulas. Assim, a galera que esteve presente nas aulas, poderão consultar esse material para tirar dúvidas, e quem não esteve… poderá aprender de alguma forma também! 🙂

Segue abaixo um pequeno vídeo introdutório, dedicado especialmente para os usuários de Mac e Linux, mas extremamente válido para usuários do Windows.

Nos próximos dias outros vídeos serão postados, e novos posts serão feitos aqui no blog.

Abraço.Olá Pessoal!