Packages

A webdriver bidi client written in Gleam, for Gleam.

Current section

Files

Jump to
butterbee src butterbee@action.erl
Raw

src/butterbee@action.erl

-module(butterbee@action).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/butterbee/action.gleam").
-export([move_to_element/1, click_action/1, enter_keys_action/1, perform/2, click/1, enter_keys/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 action module contains functions to perform actions on nodes.\n"
"\n"
" Perform actions by passing the functions in this module to either the \n"
" [`node.do`](https://hexdocs.pm/butterbee/node.html#do/2) or \n"
" [`node.get`](https://hexdocs.pm/butterbee/node.html#get/2) functions.\n"
"\n"
" ### Example\n"
"\n"
" This example performs a click on the node with the css selector `a.logo`:\n"
"\n"
" ```gleam\n"
" let example = driver.new(browser.Firefox)\n"
" |> driver.goto(\"https://gleam.run/\")\n"
" |> get.node(by.css(\"a.logo\"))\n"
" |> node.do(action.click(key.LeftClick))\n"
" ```\n"
).
-file("src/butterbee/action.gleam", 103).
?DOC(" A helper function that moves the mouse to the given node.\n").
-spec move_to_element(binary()) -> list(butterbidi@input@commands@perform_actions:pointer_source_action()).
move_to_element(Shared_id) ->
[butterbidi@input@commands@perform_actions:pointer_move_action(
0,
0,
none,
butterbidi@input@commands@perform_actions:element_origin(
butterbidi@script@types@remote_reference:shared_reference_from_id(
Shared_id
)
)
)].
-file("src/butterbee/action.gleam", 120).
?DOC(
" A helper function that simulates a full click action.\n"
" Shorthand for pressing a mouse button, then releasing it.\n"
).
-spec click_action(integer()) -> list(butterbidi@input@commands@perform_actions:pointer_source_action()).
click_action(Mouse_button) ->
[butterbidi@input@commands@perform_actions:pointer_down_action(Mouse_button),
butterbidi@input@commands@perform_actions:pointer_up_action(
Mouse_button
)].
-file("src/butterbee/action.gleam", 131).
?DOC(
" A helper function to convert a list of keysactions that simulates the user pressing the keys.\n"
" Shorthand for clicking in a key, letting it go, and pressing the next key.\n"
).
-spec enter_keys_action(binary()) -> list(butterbidi@input@commands@perform_actions:key_source_action()).
enter_keys_action(Keys) ->
Keys@1 = gleam@string:split(Keys, <<""/utf8>>),
_pipe = gleam@list:map(
Keys@1,
fun(Key) ->
[butterbidi@input@commands@perform_actions:key_down_action(Key),
butterbidi@input@commands@perform_actions:key_up_action(Key)]
end
),
lists:append(_pipe).
-file("src/butterbee/action.gleam", 167).
?DOC(
" Perform a custom action on a node, useful for creating more complex input actions. \n"
"\n"
" ### Example params\n"
"\n"
" ```gleam\n"
" let params =\n"
" perform_actions.default(context)\n"
" |> perform_actions.with_actions([\n"
" // with_actions expects a list of actions\n"
" // actions can be pointer actions, wheel actions, key actions, and a pause action.\n"
" // These actions are performed in the order they are listed.\n"
" perform_actions.with_key_actions(\n"
" \"entering \" <> keys,\n"
" list.new() |> list.append(enter_keys_action(key_list)),\n"
" ),\n"
" ])\n"
" ```\n"
"\n"
" ### Example usage\n"
"\n"
" The example below performs a custom action on a node\n"
"\n"
" ```gleam\n"
" let example = driver.new()\n"
" |> driver.goto(\"https://packages.gleam.run/\")\n"
" |> query.node(by.css(\"input[aria-label='Package name, to search']\"))\n"
" |> node.do(action.perform(params))\n"
" ```\n"
).
-spec perform(
butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value()),
butterbidi@input@commands@perform_actions:perform_actions_parameters()
) -> {ok, butterbidi@definition:command_response()} |
{error, butterbee@internal@error:butterbee_error()}.
perform(Driver, Params) ->
case butterbee@webdriver:get_socket(Driver) of
{error, Error} ->
{error, Error};
{ok, Socket} ->
butterbee@internal@retry:until_ok(
fun() ->
erlang:element(
2,
butterbee@commands@input:perform_actions(Socket, Params)
)
end
)
end.
-file("src/butterbee/action.gleam", 34).
?DOC(" Performs a click on the given node\n").
-spec click(butterbee@key:mouse_button()) -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(butterbidi@definition:command_response())).
click(Mouse_button) ->
fun(Driver) -> _pipe@4 = case erlang:element(5, Driver) of
{error, Error} ->
{error, Error};
{ok, Node_remote_value} ->
gleam@result:'try'(
begin
_pipe = erlang:element(3, Node_remote_value),
gleam@option:to_result(
_pipe,
node_does_not_have_shared_id
)
end,
fun(Shared_id) ->
gleam@result:'try'(
(butterbee@webdriver:get_context(Driver)),
fun(Context) ->
Params = begin
_pipe@1 = butterbidi@input@commands@perform_actions:default(
Context
),
butterbidi@input@commands@perform_actions:with_actions(
_pipe@1,
[butterbidi@input@commands@perform_actions:with_pointer_actions(
<<"mouse action"/utf8>>,
begin
_pipe@2 = gleam@list:new(),
_pipe@3 = lists:append(
_pipe@2,
move_to_element(
Shared_id
)
),
lists:append(
_pipe@3,
click_action(
butterbee@key:mouse_button_to_int(
Mouse_button
)
)
)
end
)]
)
end,
butterbee@node:do(
Driver,
butterbee@node:scroll_into_view()
),
perform(Driver, Params)
end
)
end
)
end,
butterbee@webdriver:map_state(_pipe@4, Driver) end.
-file("src/butterbee/action.gleam", 76).
?DOC(
" Simulates a user entering the given keys into the browser.\n"
"\n"
" NOTE: It is not recommended to use this function for entering text into text fields. \n"
" Use the [`node.set_value(value)`](https://hexdocs.pm/butterbee/node.html#do) function instead.\n"
).
-spec enter_keys(binary()) -> fun((butterbee@webdriver:web_driver(butterbidi@script@types@remote_value:node_remote_value())) -> butterbee@webdriver:web_driver(butterbidi@definition:command_response())).
enter_keys(Keys) ->
fun(Driver) ->
_ = butterbee@webdriver:do(Driver, click(left_click)),
_pipe@2 = case butterbee@webdriver:get_context(Driver) of
{error, Error} ->
{error, Error};
{ok, Context} ->
Params = begin
_pipe = butterbidi@input@commands@perform_actions:default(
Context
),
butterbidi@input@commands@perform_actions:with_actions(
_pipe,
[butterbidi@input@commands@perform_actions:with_key_actions(
<<"entering "/utf8, Keys/binary>>,
begin
_pipe@1 = gleam@list:new(),
lists:append(
_pipe@1,
enter_keys_action(Keys)
)
end
)]
)
end,
perform(Driver, Params)
end,
butterbee@webdriver:map_state(_pipe@2, Driver)
end.