-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