Nuevo en Symfony 4.4: Nuevos métodos para filtrar HTML en los tests
El componente DomCrawler se usa principalmente en las aplicaciones Symfony a través de los tests funcionales para filtrar los nodos DOM de los documentos HTML/XML.
En Symfony 4.4 hemos añadido tres nuevo métodos que nos pedía la comunidad
insistentemente: matches()
, closest()
y outerHtml()
. Tomando como ejemplo
el siguiente contenido HTML:
<html lang="en"> <body> <div class="class-1"> <h1 class="class-1">Lorem Ipsum</h1> <ul class="class-2 class-3" id="id-1"> <li>1</li> <li class="class-4">2</li> <li>3</li> </ul> </div> </body> </html>
El método matches(string $selector)
devuelve true
si el nodo es seleccionado
por el selector CSS indicado:
$crawler->filter('#id-1')->matches('.class-3'); // true $crawler->filter('#id-1')->matches('.class-4'); // false
El método closest(string $selector)
devuelve el primer ancestro del nodo que
cumpla con el selector CSS indicado:
// devuelve el nodo div.class-1 en vez del nodo h1.class-1 porque h1 es un nodo // hermano y no un ancestro del nodo ul#id-1 $crawler->filter('#id-1')->closest('.class-1');
El método outerHtml()
devuelve el contenido HTML completo del nodo, incluyendo
sus propias etiquetas:
// devuelve '<ul class="class-2 class-3" id="id-1"><li>1</li><li class="class-4">2</li><li>3</li></ul>' $crawler->filter('#id-1')->outerHtml(); // devuelve '<li>1</li><li class="class-4">2</li><li>3</li>' $crawler->filter('#id-1')->html();
Esta funcionalidad fue contribuida por Grégoire Pineau en el pull request #33144.
Eliminando todos los espacios en blanco
Los espacios en blanco son una molestia importante cuando quieres comprobar el contenido de alguna etiqueta HTML. Observa por ejemplo el siguiente código HTML:
<div class="class-1"> <h2> El texto del título </h2> </div>
El siguiente test falla debido a todos los caracteres "\n" y todos los espacios en blanco que rodean al texto del título:
$this->assertSame('El texto del título', $crawler->filter('.class-1')->text());
En Symfony 4.3 añadimos el método assertSelectorTextContains()
que puede
ayudar en estas situaciones, pero a partir de Symfony 4.4, también puedes pasar
true
como segundo argumento opcional de text()
para eliminar todos los
espacios en blanco:
$this->assertSame('El texto del título', $crawler->filter('.class-1')->text(null, true));
Además de eliminar todos los espacios por delante y por detrás del texto, esta
funcionalidad también reemplaza dos o más espacios en blanco dentro de los
contenidos por un único espacio en blanco. Así por ejemplo, si el contenido
original es aaa bbb ccc
, devuelve aaa bbb ccc
.
Esta funcionalidad fue contribuida por Hamza Amrouche en el pull request #32440.
Fuente: New in Symfony 4.4: New DomCrawler Methods
Comentarios
Proyectos Symfony destacados
La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.