strip_tags remove ent_quotes ejemplo php selenium codeception

php - remove - strip_tags()



CodecepciĆ³n: Mantener un estado de inicio de sesiĆ³n. (5)

Quiero mantener o ejecutar el inicio de sesión antes de la mayoría de mis pruebas. Pero si intento mover el código de inicio de sesión a _antes de que no funcione ya que no hay ninguna instancia de compra web disponible para mí.

¿Cuál es la mejor manera de mantener la sesión entre varias pruebas? Este es mi código hasta ahora, estaría encantado de recibir alguna ayuda. Busqué en Google y revisé la documentación, pero no puedo encontrar nada sobre las cosas de la sesión.

<?php use /WebGuy; class ProductCest { private $product_id = ''1''; public function _before() { } public function _after() { } // tests public function login(WebGuy $I) { $I->seeInCurrentUrl(''/auth/login''); $I->fillField("//input[@type=''email'']", "[email protected]"); $I->fillField("//input[@type=''password'']", "1234"); $I->click(''#signIn .submit''); $I->wait(500); $I->seeInCurrentUrl(''/account''); } /** * @depends login */ public function chooseProduct(WebGuy $I) { $I->wantTo(''go to products and choose one''); $I->amOnPage(''/?product='' . $this->client_id); } }


Creo que la respuesta aceptada es una forma de lograrlo, pero no la mejor. Al hacerlo, siempre tendrá que reproducir todos los pasos para iniciar sesión en el sistema, cuando solo necesite compartir la sesión del usuario. Creo que es mejor capturar la cookie de sesión y pasarla a través de las pruebas de usuario requeridas. Para hacerlo, crea una función de inicio de sesión, obtiene la cookie y primero realiza las pruebas de la prueba de inicio de sesión:

<?php use /AcceptanceTester; class testingCest { private $cookie = null; public function _before(AcceptanceTester $I) { } public function _after(AcceptanceTester $I) { } // tests public function login(AcceptanceTester $I) { $I->wantTo(''entrar al sistema''); $I->amOnPage(''/''); $I->seeInCurrentUrl(''/admin/login''); $I->fillField(''user'',''perry''); $I->fillField(''pass'',''pass-perry''); $I->click(''Login''); $I->see(''You/'re logged!''); $this->cookie = $I->grabCookie(''your-session-cookie-name''); } /** * @depends login */ public function listUsers(AcceptanceTester $I) { $I->setCookie( ''your-session-cookie-name'', $this->cookie ); $I->amOnPage(''/admin/users''); $I->seeInCurrentUrl(''/admin/users/1''); } /** * @depends login */ public function listRols(AcceptanceTester $I) { $I->setCookie( ''your-session-cookie-name'', $this->cookie ); $I->amOnPage(''/admin/rols''); $I->seeInCurrentUrl(''/admin/rols/1''); } }

De esa manera, si la prueba de inicio de sesión falla, no obtendrá la cookie y no pasará las otras pruebas.

Prefiero esta anotación @depends lugar de la @before propuesta en la otra respuesta, porque si usa @depends SIEMPRE ejecutará el código en la prueba anterior, y las pruebas solo se ejecutarán después del inicio de sesión.

ACTUALIZAR

Existe otra respuesta a continuación, https://.com/a/41109855/1168804 que también puede ayudarlo, ya que el marco para Codeception ha evolucionado desde que se escribió esta respuesta.


Creo que la respuesta de @Sinisa es una de "trabajo", pero no la "correcta".

Lo que quieres no es @depends anotación, sino @before.

La diferencia es que con @depends el contexto actual no se mantiene, mientras se usa @before mantener el contexto.

public function foo(WebGuy $I) { $I->amOnPage(''/foobar''); } /** * @depends foo */ public function bar(WebGuy $I) { $I->seeInCurrentUrl(''foobar''); // Wil fail } /** * @before foo */ public function baz(WebGuy $I) { $I->seeInCurrentUrl(''foobar''); // Will pass }


Se debe tener en cuenta que si está probando WordPress, el módulo del navegador WP tiene métodos de "azúcar" para iniciar sesión:

loginAsAdmin(); loginAs($username, $password);

https://github.com/lucatume/wp-browser


Todas las respuestas anteriores son antiguas , ahora se hace directamente en el método _before que toma la clase Actor como argumento.

<?php namespace Test/Api; use ApiTester; class TrainingCest { public function _before(ApiTester $I) { $I->amLoggedInAs(''kgkg''); } public function _after(ApiTester $I) { } // tests public function testForLoggedInUser(ApiTester $I) { } public function anotherTestForLoggedInUser(ApiTester $I) { } }

Y si desea iniciar sesión solo una vez para todos los archivos CEST , puede usar la clase de Registro global que implementa el patrón de diseño del Registro (consulte https://dzone.com/articles/practical-php-patterns/basic/practical-php-patterns-0 ) junto con un poco de carga lenta. Aquí está el código de trabajo para mis pruebas de integración de api definidas en la clase Actor (en mi caso, ApiTester):

public function amLoggedInAs($userLogin) { $I = $this; if (Registry::getInstance()->exists($userLogin)) { // get data from registry $storedUserData = Registry::getInstance()->get($userLogin); $newAccessToken = $storedUserData[''accessToken'']; $playerId = $storedUserData[''playerId'']; } else { // no registry data - log in and save data in registry $I->tryToLogin($userLogin); $newAccessToken = $I->grabDataFromResponseByJsonPath(''data.newToken''); $playerId = (int)$I->grabDataFromResponseByJsonPath(''data.userId''); Registry::getInstance()->set($userLogin, [ ''accessToken'' => $newAccessToken, ''playerId'' => $playerId ]); } // finally set headers and some other data $I->haveHttpHeader(''X-Token'', $newAccessToken); $I->havePlayerId($playerId); } protected function tryToLogin($userLogin) { $I = $this; $I->wantTo(''login into api''); $I->amGoingTo(''try to log to API using login and password''); $I->sendPOST(''/system/login'', [''login'' => $userLogin, ''password'' => self::getPassword($userLogin)]); // ...some other checking if user was correctly logged in ... }

Básicamente, este código almacena accessToken junto con algunos datos adicionales en el Registro después de que el usuario inicia sesión por primera vez. Si se invoca otra llamada a $ I-> amLoggedInAs (''kgkg''), obtiene estos valores del registro. Puede tener muchos usuarios registrados de esta manera, cada uno de ellos registrado solo una vez por suite.

Puede usar otro método para la autorización en lugar de un token personalizado, la lógica seguirá siendo la misma.

Además, si está utilizando WebDriver (no PhpBrowser), puede usar loadSessionSnapshot y saveSessionSnapshot en lugar de Registro para obtener el mismo resultado.


<?php use /WebGuy; class ProductCest { private $product_id = ''1''; public function _before() { } public function _after() { } private function executeLogin(WebGuy $I){ $I->seeInCurrentUrl(''/auth/login''); $I->fillField("//input[@type=''email'']", "[email protected]"); $I->fillField("//input[@type=''password'']", "1234"); $I->click(''#signIn .submit''); $I->wait(500); return $I; } // tests public function login(WebGuy $I) { $I = $this->executeLogin($I); $I->seeInCurrentUrl(''/account''); } /** * @depends login */ public function chooseProduct(WebGuy $I) { $I = $this->executeLogin($I); $I->wantTo(''go to products and choose one''); $I->amOnPage(''/?product='' . $this->client_id); } }

Esto debería funcionar.