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

Publicada el

11 de octubre de 2019

Etiquetas

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.