Current section
Files
Jump to
Current section
Files
src/butterbee@get.erl
-module(butterbee@get).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/butterbee/get.gleam").
-export([locate_nodes/2, nodes/2, node/2, from_node/2, nodes_from_node/2, node_from_nodes/2]).
-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 action module contains functions to get elements from the DOM\n"
"\n"
" ## Usage\n"
"\n"
" After navigating to a page, call one of the functions in this module to get a node,\n"
" or a list of nodes. After getting a node, you can perform actions on it using functions from\n"
" the [`node`](https://hexdocs.pm/butterbee/butterbee/node.html) and \n"
" [`action`](https://hexdocs.pm/butterbee/butterbee/action.html) modules.\n"
" Butterbee supports different locating strategies, see the \n"
" [by](https://hexdocs.pm/butterbee/butterbee/by.html) module for more information.\n"
"\n"
" ### Example\n"
"\n"
" This example gets a node from the page, and then performs an action on it:\n"
"\n"
" ```gleam\n"
" let example =\n"
" driver\n"
" // navigate to a page\n"
" |> butterbee.goto(\"https://gleam.run/\")\n"
" // get the node matching the css selector `a.logo` \n"
" // and adds it to the state of the webdriver\n"
" |> get.node(by.css(\"a.logo\"))\n"
" // perform actions on the node that was queried above\n"
" |> node.get(node.text()) \n"
" ```\n"
" \n"
" getting 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/get.gleam", 168).
?DOC(false).
-spec locate_nodes(
butterbee@webdriver:web_driver(any()),
butterbidi@browsing_context@commands@locate_nodes:locate_nodes_parameters()
) -> {ok,
butterbidi@browsing_context@commands@locate_nodes:locate_nodes_result()} |
{error, butterbee@internal@error:butterbee_error()}.
locate_nodes(Driver, Params) ->
butterbee@internal@retry:until_ok(
fun() ->
case butterbee@internal@commands@browsing_context:locate_nodes(
Driver,
Params
) of
{ok, Locate_nodes_ok} ->
case gleam@list:is_empty(erlang:element(2, Locate_nodes_ok)) of
false ->
{ok, Locate_nodes_ok};
true ->
{error, no_node_found}
end;
{error, Error} ->
{error, Error}
end
end
).
-file("src/butterbee/get.gleam", 66).
?DOC(" Finds all nodes matching the given locator.\n").
-spec nodes(
butterbee@webdriver:web_driver(any()),
butterbidi@browsing_context@types@locator:locator()
) -> butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value())).
nodes(Driver, Locator) ->
_pipe@2 = gleam@result:'try'(
begin
_pipe = erlang:element(3, Driver),
gleam@option:to_result(_pipe, driver_does_not_have_context)
end,
fun(Context) ->
Params = butterbidi@browsing_context@commands@locate_nodes:new(
Context,
Locator
),
_pipe@1 = locate_nodes(Driver, Params),
gleam@result:map(
_pipe@1,
fun(Locate_nodes) -> erlang:element(2, Locate_nodes) end
)
end
),
butterbee@webdriver:map_state(_pipe@2, Driver).
-file("src/butterbee/get.gleam", 46).
?DOC(
" Finds a node matching the given locator. \n"
" If multiple nodes are found, the first node is returned.\n"
).
-spec node(
butterbee@webdriver:web_driver(any()),
butterbidi@browsing_context@types@locator:locator()
) -> butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value()).
node(Driver, Locator) ->
Driver@1 = nodes(Driver, Locator),
_pipe = gleam@result:'try'(
erlang:element(5, Driver@1),
fun(Nodes) -> case erlang:length(Nodes) of
1 ->
case gleam@list:first(Nodes) of
{ok, Node} ->
{ok, Node};
{error, _} ->
{error, no_node_found}
end;
_ ->
{error, more_than_one_node_found}
end end
),
butterbee@webdriver:map_state(_pipe, Driver@1).
-file("src/butterbee/get.gleam", 86).
?DOC(" Finds a node matching the given locator starting from the node in state.\n").
-spec from_node(
butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value()),
butterbidi@browsing_context@types@locator:locator()
) -> butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value()).
from_node(Driver, Locator) ->
_pipe@2 = gleam@result:'try'(
(erlang:element(5, Driver)),
fun(Node) ->
gleam@result:'try'(
begin
_pipe = erlang:element(3, Node),
gleam@option:to_result(_pipe, node_does_not_have_shared_id)
end,
fun(Shared_id) -> case erlang:element(3, Driver) of
none ->
{error, driver_does_not_have_context};
{some, Context} ->
Params = begin
_pipe@1 = butterbidi@browsing_context@commands@locate_nodes:new(
Context,
Locator
),
butterbidi@browsing_context@commands@locate_nodes:with_start_nodes(
_pipe@1,
[butterbidi@script@types@remote_reference:shared_reference_from_id(
Shared_id
)]
)
end,
gleam@result:'try'(
(locate_nodes(Driver, Params)),
fun(Locate_nodes) ->
Nodes = erlang:element(2, Locate_nodes),
case erlang:length(Nodes) of
1 ->
case gleam@list:first(Nodes) of
{ok, Node@1} ->
{ok, Node@1};
{error, _} ->
{error, no_node_found}
end;
_ ->
{error, more_than_one_node_found}
end
end
)
end end
)
end
),
butterbee@webdriver:map_state(_pipe@2, Driver).
-file("src/butterbee/get.gleam", 123).
?DOC(" Finds a list of nodes matching the given locator starting from the node in state.\n").
-spec nodes_from_node(
butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value()),
butterbidi@browsing_context@types@locator:locator()
) -> butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value())).
nodes_from_node(Driver, Locator) ->
_pipe@3 = gleam@result:'try'(
(erlang:element(5, Driver)),
fun(Node) ->
gleam@result:'try'(
begin
_pipe = erlang:element(3, Node),
gleam@option:to_result(_pipe, node_does_not_have_shared_id)
end,
fun(Shared_id) -> case erlang:element(3, Driver) of
none ->
{error, driver_does_not_have_context};
{some, Context} ->
Params = begin
_pipe@1 = butterbidi@browsing_context@commands@locate_nodes:new(
Context,
Locator
),
butterbidi@browsing_context@commands@locate_nodes:with_start_nodes(
_pipe@1,
[butterbidi@script@types@remote_reference:shared_reference_from_id(
Shared_id
)]
)
end,
_pipe@2 = locate_nodes(Driver, Params),
gleam@result:map(
_pipe@2,
fun(Locate_nodes) ->
erlang:element(2, Locate_nodes)
end
)
end end
)
end
),
butterbee@webdriver:map_state(_pipe@3, Driver).
-file("src/butterbee/get.gleam", 151).
?DOC(" Finds a node matching the given index starting from the list of nodes in state.\n").
-spec node_from_nodes(
butterbee@webdriver:web_driver(list(butterbidi@script@types@remote_value:node_remote_value())),
integer()
) -> butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value()).
node_from_nodes(Driver, Index) ->
_pipe@1 = case erlang:element(5, Driver) of
{error, _} ->
{error, driver_does_not_have_state};
{ok, Nodes} ->
_pipe = gleam@list:last(gleam@list:take(Nodes, Index + 1)),
gleam@result:map_error(_pipe, fun(_) -> no_node_found end)
end,
butterbee@webdriver:map_state(_pipe@1, Driver).