Controlando o Navegador¶
No Mink, o ponto de entrada do navegador é chamado de sessão. Pense nisso como sendo a janela do navegador (alguns drivers até deixam você alternar guias!).
Primeiro, inicie sua sessão (é como abrir a guia do seu navegador). Nada pode ser feito com isto antes de iniciá-lo.
// Escolha um driver Mink. Veja mais sobre isto nos capítulos seguintes.
$driver = new \Behat\Mink\Driver\GoutteDriver();
$session = new \Behat\Mink\Session($driver);
// inicia a sessão
$session->start();
Nota
O primeiro argumento do construtor da sessão é um objeto driver. Drivers são a forma de abstração que as camadas Mink trabalham. Você irá descobrir mais sobre os drivers disponíveis em um capitulo posterior.
Cuidado
Apesar do Mink fazer o seu melhor para remover as diferenças entre os diferentes drivers, cada driver tem funcionalidades e deficiências diferentes. Veja Suporte a recursos do driver para ver cada funcionalidade são suportadas sobre cada driver.
Interação Básica no Navegador¶
Agora que sua sessão está iniciada, você irá querer abrir uma página com ele.
Apenas depois de começar, a sessão não está em uma página qualquer (em um navegador
real, você estaria na página about:blank
), e chamando qualquer outra ação
é provável que falhe.
$session->visit('http://meu_projeto.dev/alguma_pagina.php');
Nota
Mink é principalmente projetado para ser usado para testar websites.
Para que você possa navegar e testar páginas de erro, o método
Session:visit
não considera códigos de status de erro como inválida.
Ele não irá lançar uma exceção neste caso. Você irá precisar checar
o código do status (ou certo texto na página) para saber se a resposta
teve sucesso ou não.
Interagindo com a Página¶
A sessão dá acesso a página através do método Session::getPage
.
Isto lhe permite analisar a página e
interagir com elas. Os próximos
capítulos cobrem a página API com profundidade. A maioria do que você vai
fazer com Mink usará este objeto, mas você pode continuar lendo para saber
mais sobre Sessão.
Usando o Histórico do Navegador¶
A sessão lhe da acesso ao histórico do navegador:
// obter a URL da página atual:
echo $session->getCurrentUrl();
// usar controles de histórico:
$session->reload();
$session->back();
$session->forward();
Gerenciamento de Cookie¶
A sessão pode manipular cookies disponíveis no navegador.
// definir cookie:
$session->setCookie('cookie nome', 'valor');
// obter cookie:
echo $session->getCookie('cookie nome');
// deletar cookie:
$session->setCookie('cookie nome', null);
Nota
Com drivers que usam o JavaScript para controlar o navegador - como Sahi - que pode ser restringido a acessar/definir tudo, mas Cookies HttpOnly.
Código de Status de Recuperação¶
A sessão lhe permite recuperar o código HTTP do status da resposta:
echo $session->getStatusCode();
Gerenciamento de Headers¶
A sessão lhe permite manipular request de headers e acessar a resposta dos headers:
// definindo linguagem do navegador:
$session->setRequestHeader('Accept-Language', 'fr');
// recuperação da resposta do headers:
print_r($session->getResponseHeaders());
Nota
A manipulação de headers somente é suportada em drivers headless (como o Goutte, por exemplo). Controladores de navegadores (como o Selenium2, por exemplo) não podem acessar aquela informação.
Autenticação HTTP¶
A sessão tem um método especial para atuar na autenticação básica de HTTP:
$session->setBasicAuth($user, $password);
O método pode também ser usado para reiniciar uma autenticação prévia:
$session->setBasicAuth(false);
Nota
Autenticação HTTP automática somente é suportada em drivers headless. Porque autenticação HTTP nos navegadores exigem atuação manual do usuário, que não pode ser feita remotamente pelos controladores de navegador.
Avaliação do Javascript¶
A sessão lhe permite executar ou avaliar Javascript.
// Executar JS
$session->executeScript('document.body.firstChild.innerHTML = "";');
// analisar expressão JS:
echo $session->evaluateScript(
"return 'algo a partir do navegador';"
);
Nota
A diferença entre estes métodos é que Session::evaluateScript
retorna
o resultado desta expressão. Quando você não precisa obter o valor do
retorno, usar Session::executeScript
é melhor.
Você pode também esperar até uma determinada expressão JS retornar um valor booleano verdadeiro ou o tempo limite ser atingido:
// esperar por N milissegundos ou
// até a expressão JS tornar-se verdadeira:
$session->wait(
5000,
"$('.suggestions-results').children().length"
);
Nota
O método Session::wait
retorna verdadeiro
quando a avaliação retorna
verdadeiro. Ele irá retornar falso
quando o timeout é alcançado.
Repondo a Sessão¶
O objetivo primário para o Mink é prover um navegação na WEB API única consistente para teste de aceite. Mas uma parte muito importante no teste é o isolamento.
O Mink provê dois métodos muito úteis para isolar testes, que podem ser usados
em seus métodos de teste destruir
:
// soft-reset:
$session->reset();
// hard-reset:
$session->stop();
// ou se você quiser iniciar novamente ao mesmo tempo
$session->restart();
Parar a sessão é a melhor maneira de reiniciar a sessão ao estado inicial.
Ele irá fechar o seu navegador inteiramente. Para usar a sessão novamente,
você precisa iniciar a sessão antes de qualquer outra ação. O atalho
Session::restart
permite você fazer estas 2 chamadas em uma única.
A desvantagem de fechar o navegador e iniciá-lo novamente é que leva tempo.
Em muitos casos, um nível mais baixo de isolamento é o suficiente a favor de
uma reinicialização rápida. O método Session::reset
cobre este caso de uso.
Ele irá tentar limpar os cookies e reiniciar o request de headers e o histórico
do navegador ao limite das possibilidades do driver.
Levando tudo isto em conta, por padrão é recomendado usar Session::reset()
e chamar Session::stop()
quando você realmente precisar de isolamento completo.