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();

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.