Vse o WEB
Информация и размышления о Web технологиях

Что нового в Symfony 4.4: New DomCrawler Methods

Компонент DomCrawler в основном используется в приложениях Symfony в функциональных тестах для фильтрации узлов DOM документов HTML / XML. Методы, предоставляемые DomCrawler, изначально были вдохновлены jQuery, такие как eq(), first(), children(), nextAll() и т. д.

В Symfony 4.4 были добавлены три новых метода, часто запрашиваемых сообществом: match(), closest() и outerHtml(). Рассмотрим следующий фрагмент 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>

 

Метод matches(string $selector) возвращает true если элемент соответствует селектору CSS:

$crawler->filter('#id-1')->matches('.class-3');  // true
$crawler->filter('#id-1')->matches('.class-4');  // false

 

Метод closest(string $selector) возвращает первого предка узла, который соответствует данному селектору CSS:

// возвращает элемент div.class-1 и не возвращает элмент h1.class-1, потому что h1 - это
// родственник и не родитель ul#id-1
$crawler->filter('#id-1')->closest('.class-1');

 

Метод outerHtml () возвращает все содержимое HTML узла, включая его собственные теги:

// возвращает '<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();

// возвращает '<li>1</li><li class="class-4">2</li><li>3</li>'
$crawler->filter('#id-1')->html();

 

Удаление лишних пробелов

Работа с пробелами довольно раздражает при проверке содержимого некоторых тегов HTML. Например, в следующем фрагменте HTML:

<div class="class-1">
    <h2>
        Some Title Text
    </h2>
</div>

 

Следующий тест не пройден из-за всех «n» и пробелов, окружающих текст заголовка:

// тест провален из-за лишних пробелов
$this->assertSame('Some Title Text', $crawler->filter('.class-1')->text());

 

В Symfony 4.3 был добавлен метод assertSelectorTextContains(), чтобы помочь в этих ситуациях, но начиная с Symfony 4.4, вы также можете передать true в качестве второго необязательного аргумента text(), чтобы удалить все лишние пробелы:

// тест пройден, потому что все лишние пробелы удалены
$this->assertSame('Some Title Text', $crawler->filter('.class-1')->text(null, true));

 

Помимо обрезки пробелов в начале и конце строки, эта функция также заменяет два или более пробелов внутри содержимого одним пробелом. Например, если оригинальный текст foo  bar  baz, метод вернет foo bar baz.

 

Оригинал статьи: https://symfony.com/blog/new-in-symfony-4-4-new-domcrawler-methods

Наверх