2016-03-13 3 views
1

Я использую cakephp 3, selenium facebook web driver и phpunit.cakephp 3 selenium facebook webdriver auth

Проблема заключается в том, что я не могу получить доступ к страницам, для которых требуется аутентификация. Я попытался добавить тот же сеанс аутентификации, который я использовал в своих тестах модуля контроллера. Это не работает.

$this->session(['Auth.User.id' => 1, 'Auth.User.role' => 'admin']); 

Затем я получил тест для входа в систему перед выполнением других тестов. Это не сработало. Думаю, мне нужно добавить сеанс.

<?php 

use \Facebook\WebDriver\Remote\DesiredCapabilities; 
use \Facebook\WebDriver\Remote\RemoteWebDriver; 
use \Facebook\WebDriver\WebDriverBy; 

/** 
* Description of UserEditTest 
* 
* @author john 
*/ 
class UserEditTest extends PHPUnit_Framework_TestCase 
{ 

    protected $webDriver; 




    public function setUp() 
    { 
     $this->webDriver = RemoteWebDriver::create('http://localhost:4444/wd/hub', DesiredCapabilities::firefox()); 
     // $this->session(['Auth.User.id' => 1, 'Auth.User.role' => 'admin']); 
    } 

    protected $url = 'http://localhost:81/dev/usedCars/users/edit/11'; 


     //return should contain Please enter your username and password 
    public function validLoginProvider() 
    { 
     $inputs[] = [ 
      [ 
       'username'    => 'testuser', 
       'password'    => 'test',    
      ] 
     ]; 

     return $inputs; 
    } 
    //login input 
    public function fillLoginFormAndSubmit($inputs) 
{ 


    $this->webDriver->get('http://localhost:81/dev/usedCars/users/login'); 
    $form = $this->webDriver->findElement(WebDriverBy::id('login')); 
    var_dump($inputs); 

    foreach ($inputs as $input => $value) { 
     $form->findElement(WebDriverBy::name($input))->sendKeys($value);  
    } 
    $form->submit(); 
} 

/** 
* @dataProvider validLoginProvider 
*/ 
public function testValidFormSubmission(array $inputs) 
{ 
    $this->fillLoginFormAndSubmit($inputs); 

    $content = $this->webDriver->findElement(WebDriverBy::tagName('body'))->getText(); 
    $this->assertContains('Showroom', $content); 

    testValidEditSubmission(); 

} 



//for testing the edit view page 
     public function validInputsProvider() 
    { 

      $inputs[] = [ 
      [ 
       'interests'    => 'changed' 
      ] 
     ]; 

     return $inputs; 
    } 

    //for testing the edit page 
    public static function invalidInputsProvider() 
    { 
     $inputs[] = [ 
      [    
       'email'    => 'mypassword' 

      ] 
     ]; 


     return $inputs; 
    } 



     public function fillFormAndSubmit($inputs) 
{ 
     // $this->session(['Auth.User.id' => 1, 'Auth.User.role' => 'admin']); 

    $this->webDriver->get('http://localhost:81/dev/usedCars/users/edit/11'); 
    $form = $this->webDriver->findElement(WebDriverBy::id('edit')); 
    var_dump($inputs); 

    foreach ($inputs as $input => $value) { 
     $form->findElement(WebDriverBy::name($input))->sendKeys($value); 


    } 

    $form->submit(); 
} 


/** 
* @dataProvider validInputsProvider 
*/ 
public function testValidEditSubmission(array $inputs) 
{ 


    $this->fillFormAndSubmit($inputs); 

    $content = $this->webDriver->findElement(WebDriverBy::tagName('body'))->getText(); 
    $this->assertContains('The user has been saved', $content); 
} 


/** 
* @dataProvider invalidInputsProvider 
*/ 
public function testInvalidEditSubmission(array $inputs) 
{ 
    $this->fillFormAndSubmit($inputs); 

    $content = $this->webDriver->findElement(WebDriverBy::tagName('body'))->getText(); 
    $this->assertContains('valid email', $content); 
} 

    public function tearDown() 
{ 
    $this->webDriver->quit(); 
} //put your code here 
} 

ответ

1

Я нашел решение. Добавьте в тест метод входа. Это приведет к доступу к вашей странице входа и введите данные массива, предоставленные в параметрах.

 //login input 
    public function fillLoginFormAndSubmit($inputs) 
{   
    $this->webDriver->get('http://localhost:81/dev/usedCars/users/login'); 
    $form = $this->webDriver->findElement(WebDriverBy::id('login')); 
    var_dump($inputs); 

    foreach ($inputs as $input => $value) { 
     $form->findElement(WebDriverBy::name($input))->sendKeys($value);  
    } 
    $form->submit(); 
    } 

Затем добавьте данные для входа в переменную массива и вызовите метод входа в систему перед выполнением теста.

public function fillFormAndSubmit($inputs) 
    { 
//add login details here 
       $login = array("username"=>"testuser","password"=>"test"); 
      //call login method    
     $this->fillLoginFormAndSubmit($login); 

     $this->webDriver->get('http://localhost:81/dev/usedCars/users/edit/11'); 
     $form = $this->webDriver->findElement(WebDriverBy::id('edit')); 
     var_dump($inputs); 

     foreach ($inputs as $input => $value) { 
      $form->findElement(WebDriverBy::name($input))->sendKeys($value); 


     } 

     $form->submit(); 
     }