| defmodule Plausible.Test.Support.HTML do |
| @moduledoc """ |
| LazyHTML wrappers to help make assertions about HTML/DOM structures |
| """ |
|
|
| def element_exists?(html, selector) do |
| html |
| |> find(selector) |
| |> Enum.empty?() |
| |> Kernel.not() |
| end |
|
|
| def find(%LazyHTML{} = html, selector) do |
| html |
| |> LazyHTML.query(selector) |
| end |
|
|
| def find(html, selector) do |
| html |
| |> lazy_parse() |
| |> find(selector) |
| end |
|
|
| def submit_button(html, form) do |
| find(html, "#{form} button[type=\"submit\"]") |
| end |
|
|
| def form_exists?(html, action_path) do |
| element_exists?(html, "form[action=\"" <> action_path <> "\"]") |
| end |
|
|
| def text_of_element(html, selector) do |
| html |
| |> find(selector) |
| |> text() |
| end |
|
|
| def elem_count(html, selector) do |
| find(html, selector) |> Enum.count() |
| end |
|
|
| def text(element) do |
| element |
| |> lazy_parse() |
| |> LazyHTML.text() |
| |> String.trim() |
| |> String.replace(~r/\s+/, " ") |
| end |
|
|
| def attr_defined?(html, element, attr) do |
| empty? = |
| html |
| |> find(element) |
| |> LazyHTML.attribute(attr) |
| |> Enum.empty?() |
|
|
| not empty? |
| end |
|
|
| def class_of_element(html, element) do |
| html |
| |> find(element) |
| |> text_of_attr("class") |
| end |
|
|
| def text_of_attr(html, selector, attr) do |
| html |
| |> find(selector) |
| |> text_of_attr(attr) |
| end |
|
|
| def text_of_attr(element, attr) do |
| case LazyHTML.attribute(lazy_parse(element), attr) do |
| [] -> |
| nil |
|
|
| [value] -> |
| value |
|
|
| [_ | _] -> |
| raise "Multiple attributes found. Narrow down the element you are looking for" |
| end |
| end |
|
|
| def name_of(element) do |
| text_of_attr(element, "name") |
| end |
|
|
| defp lazy_parse(%LazyHTML{} = lazy) do |
| lazy |
| end |
|
|
| defp lazy_parse(element) when is_binary(element) do |
| LazyHTML.from_fragment(element) |
| end |
| end |
|
|