Packages

A webdriver bidi client written in Gleam, for Gleam.

Current section

Files

Jump to
butterbee src butterbee@node.erl
Raw

src/butterbee@node.erl

-module(butterbee@node).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/butterbee/node.gleam").
-export([get/2, get_all/2, do/2, do_all/2, text/0, texts/0, inner_text/0, inner_texts/0, set_value/1, value/0, values/0, set_attribute/2, has_attribute/1, scroll_into_view/0, selected_text/0, select_option/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" The node module contains functions to work with DOM nodes\n"
" \n"
" ## Usage\n"
"\n"
" In your tests, call \n"
" [`get`](https://hexdocs.pm/butterbee/butterbee/node.html#get),\n"
" [`do`](https://hexdocs.pm/butterbee/butterbee/node.html#do), \n"
" [`get_all`](https://hexdocs.pm/butterbee/butterbee/node.html#get_all), or \n"
" [`do_all`](https://hexdocs.pm/butterbee/butterbee/node.html#do_all) \n"
" to perform an action on a node. These function expect a parameter `action` \n"
" that is the action to perform. possible actions are listed in this module and in the \n"
" [action](https://hexdocs.pm/butterbee/butterbee/action.html) module.\n"
"\n"
" ### Example\n"
"\n"
" ```gleam\n"
" let text =\n"
" driver\n"
" |> butterbee.goto(\"https://gleam.run/\")\n"
" |> get.node(by.css(\"a.logo\"))\n"
" // perform an action on the node, without updating the state\n"
" |> node.do(action.click(key.LeftClick))\n"
" // get the text of the node, the state is updated with the result of the action\n"
" |> node.get(node.text()) \n"
" ```\n"
"\n"
" Performing actions on nodes directly is useful for one-off situations, \n"
" but if you want to make your tests more reusable, its recommended to use \n"
" [page modules](https://hexdocs.pm/butterbee/page-modules.html).\n"
).
-file("src/butterbee/node.gleam", 39).
?DOC(" Perform an action on a node, updating the state with the result of the action\n").
-spec get(
butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value()),
fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(PRQ))
) -> butterbee@webdriver:web_driver(PRQ).
get(Driver, Action) ->
butterbee@webdriver:do(Driver, Action).
-file("src/butterbee/node.gleam", 47).
?DOC(" Perform an action on a list of nodes, updating the state with the result of the action\n").
-spec get_all(
butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value())),
fun((butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value()))) -> butterbee@webdriver:web_driver(PRW))
) -> butterbee@webdriver:web_driver(PRW).
get_all(Driver, Action) ->
butterbee@webdriver:do(Driver, Action).
-file("src/butterbee/node.gleam", 55).
?DOC(" Perform an action on a node, without updating the state of the driver\n").
-spec do(
butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value()),
fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(any()))
) -> butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value()).
do(Driver, Action) ->
butterbee@webdriver:do(Driver, Action),
Driver.
-file("src/butterbee/node.gleam", 64).
?DOC(" Perform an action on a list of nodes, without updating the state of the driver\n").
-spec do_all(
butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value())),
fun((butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value()))) -> butterbee@webdriver:web_driver(any()))
) -> butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value())).
do_all(Driver, Action) ->
butterbee@webdriver:do(Driver, Action),
Driver.
-file("src/butterbee/node.gleam", 75).
?DOC(
" Get text from a node, tries different methods to get the text from a node. \n"
" First tries `textContent`, then `innerText`, then `value`.\n"
" Returns \"null\" if no text is found.\n"
).
-spec text() -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(binary())).
text() ->
Function = <<"function() { return this.textContent || this.innerText || this.value || null; }"/utf8>>,
fun(Driver) -> _pipe = Driver,
butterbee@webdriver:with_state(
_pipe,
(butterbee@internal@retry:until_ok(
fun() ->
Result = begin
_pipe@1 = Driver,
_pipe@2 = butterbee@internal@function:on_node(
_pipe@1,
[],
Function
),
butterbee@internal@function:result_to_string(_pipe@2)
end,
case Result of
{error, Error} ->
{error, Error};
{ok, <<"null"/utf8>>} ->
{error, node_text_is_null};
{ok, Text} ->
{ok, Text}
end
end
))
) end.
-file("src/butterbee/node.gleam", 101).
?DOC(
" Get text from a list of nodes, tries different methods to get the text from a node. \n"
" First tries `textContent`, then `innerText`, then `value`.\n"
" Returns null if no text is found.\n"
).
-spec texts() -> fun((butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value()))) -> butterbee@webdriver:web_driver(list(binary()))).
texts() ->
Function = <<"function() {
return Array.from(this, n => n.innerText || n.textContent || n.value || null);
}"/utf8>>,
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_nodes(_pipe, [], Function),
_pipe@2 = butterbee@internal@function:result_to_string_list(_pipe@1),
butterbee@webdriver:map_state(_pipe@2, Driver) end.
-file("src/butterbee/node.gleam", 116).
?DOC(" Get the inner text of a node, returns an empty string if no text is found.\n").
-spec inner_text() -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(binary())).
inner_text() ->
Function = <<"function() { return this.innerText; }"/utf8>>,
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_node(_pipe, [], Function),
_pipe@2 = butterbee@internal@function:result_to_string(_pipe@1),
butterbee@webdriver:map_state(_pipe@2, Driver) end.
-file("src/butterbee/node.gleam", 128).
?DOC(" Get the inner text of a list of nodes, returns an empty string if no text is found.\n").
-spec inner_texts() -> fun((butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value()))) -> butterbee@webdriver:web_driver(list(binary()))).
inner_texts() ->
Function = <<"function() { return Array.from(this, n => n.innerText); }"/utf8>>,
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_nodes(_pipe, [], Function),
_pipe@2 = butterbee@internal@function:result_to_string_list(_pipe@1),
butterbee@webdriver:map_state(_pipe@2, Driver) end.
-file("src/butterbee/node.gleam", 140).
?DOC(" Set the value of a node. Useful for setting text fields.\n").
-spec set_value(binary()) -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(binary())).
set_value(Value) ->
Function = <<"function(value) { this.value = value; }"/utf8>>,
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_node(
_pipe,
[butterbidi@script@types@local_value:string(Value)],
Function
),
_pipe@2 = butterbee@internal@function:result_to_string(_pipe@1),
butterbee@webdriver:map_state(_pipe@2, Driver) end.
-file("src/butterbee/node.gleam", 153).
?DOC(" Get the value of a node.\n").
-spec value() -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(binary())).
value() ->
Function = <<"function() { return this.value; }"/utf8>>,
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_node(_pipe, [], Function),
_pipe@2 = butterbee@internal@function:result_to_string(_pipe@1),
butterbee@webdriver:map_state(_pipe@2, Driver) end.
-file("src/butterbee/node.gleam", 165).
?DOC(" Get the value of a list of nodes.\n").
-spec values() -> fun((butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value()))) -> butterbee@webdriver:web_driver(list(binary()))).
values() ->
Function = <<"function() { return Array.from(this, n => n.value); }"/utf8>>,
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_nodes(_pipe, [], Function),
_pipe@2 = butterbee@internal@function:result_to_string_list(_pipe@1),
butterbee@webdriver:map_state(_pipe@2, Driver) end.
-file("src/butterbee/node.gleam", 177).
?DOC(" Set an attribute of a node.\n").
-spec set_attribute(binary(), binary()) -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(binary())).
set_attribute(Attribute, Value) ->
Function = <<"function(attribute, value) { this.setAttribute(attribute, value); }"/utf8>>,
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_node(
_pipe,
[butterbidi@script@types@local_value:string(Attribute),
butterbidi@script@types@local_value:string(Value)],
Function
),
_pipe@2 = butterbee@internal@function:result_to_string(_pipe@1),
butterbee@webdriver:map_state(_pipe@2, Driver) end.
-file("src/butterbee/node.gleam", 195).
?DOC(" Check if a node has an attribute.\n").
-spec has_attribute(binary()) -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(boolean())).
has_attribute(Attribute) ->
Function = <<"function(attribute) { return this.hasAttribute(attribute); }"/utf8>>,
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_node(
_pipe,
[butterbidi@script@types@local_value:string(Attribute)],
Function
),
_pipe@2 = butterbee@internal@function:result_to_bool(_pipe@1),
butterbee@webdriver:map_state(_pipe@2, Driver) end.
-file("src/butterbee/node.gleam", 208).
?DOC(" Scroll a node into view.\n").
-spec scroll_into_view() -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(butterbidi@script@types@evaluate_result:evaluate_result())).
scroll_into_view() ->
Function = <<"function() { this.scrollIntoView(true); }"/utf8>>,
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_node(_pipe, [], Function),
butterbee@webdriver:map_state(_pipe@1, Driver) end.
-file("src/butterbee/node.gleam", 218).
?DOC(" Gets the `inner text` of the selected option of a `select` element.\n").
-spec selected_text() -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(binary())).
selected_text() ->
fun(Driver) -> _pipe = Driver,
_pipe@1 = butterbee@internal@function:on_node(
_pipe,
[],
<<"function() { return this.options[this.selectedIndex].text; }"/utf8>>
),
_pipe@2 = butterbee@internal@function:result_to_string(_pipe@1),
butterbee@webdriver:map_state(_pipe@2, Driver) end.
-file("src/butterbee/node.gleam", 232).
?DOC(" Selects the value of a `select` element based on the `inner text` of one of its options.\n").
-spec select_option(binary()) -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())).
select_option(Option) ->
Function = <<"function setSelectByInnerText(innerTextValue) {
if (!this || this.tagName !== 'SELECT') {
throw new TypeError('Function must be called on a <select> element');
}
for (let i = 0; i < this.options.length; i++) {
if (this.options[i].innerText === innerTextValue) {
this.selectedIndex = i;
return; // Stop once the match is found
}
}
throw new Error(`No option with innerText \"${innerTextValue}\" found`);
}"/utf8>>,
fun(Driver) ->
_ = begin
_pipe = Driver,
_pipe@1 = butterbee@webdriver:with_state(
_pipe,
(case erlang:element(5, Driver) of
{error, Error} ->
{error, Error};
{ok, Node} ->
{ok, butterbidi@script@types@local_value:node(Node)}
end)
),
butterbee@internal@function:on_value(
_pipe@1,
[butterbidi@script@types@local_value:string(Option)],
Function
)
end,
Driver
end.