pusk/lib/net.ml

123 lines
3.5 KiB
OCaml
Raw Normal View History

open Cohttp_lwt_unix
2023-05-13 12:37:12 +02:00
open Utils
2023-05-13 15:57:03 +02:00
let driver_url = "http://127.0.0.1:4444/session"
let driver id = fmt "%s/%s" driver_url id
let send_post_request url json =
let headers = Cohttp.Header.init_with "Content-Type" "application/json" in
let body = Cohttp_lwt.Body.of_string json in
2023-05-13 15:57:03 +02:00
Lwt.bind
(Client.post ~headers ~body (Uri.of_string url))
(fun (_response, body) -> Cohttp_lwt.Body.to_string body)
2023-05-13 10:40:13 +02:00
;;
2023-05-13 16:17:18 +02:00
let send_get_request url =
Lwt.bind
(Client.get (Uri.of_string url))
(fun (_response, body) -> Cohttp_lwt.Body.to_string body)
;;
2023-05-13 12:37:12 +02:00
let send_delete_request url =
2023-05-13 15:57:03 +02:00
Lwt.bind
(Client.delete (Uri.of_string url))
(fun (_response, body) -> Cohttp_lwt.Body.to_string body)
2023-05-13 12:37:12 +02:00
;;
2023-05-13 16:17:18 +02:00
let execute_post_request url json = Lwt_main.run (send_post_request url json)
let execute_get_request url = Lwt_main.run (send_get_request url)
let execute_delete_request url = Lwt_main.run (send_delete_request url)
2023-05-13 12:37:12 +02:00
2023-05-13 15:57:03 +02:00
(* Server MUST be started already *)
2023-05-13 22:13:26 +02:00
let get_session ?(headless = true) () =
let response =
execute_post_request (fmt "%s" driver_url) (Json.connection_payload headless)
in
2023-05-13 13:33:46 +02:00
match Yojson.Safe.from_string response with
| `Assoc fields ->
let value = List.assoc "value" fields in
let rec find_session_id = function
| ("sessionId", `String session_id) :: _ -> session_id
| _ :: rest -> find_session_id rest
| [] -> raise (Any "Session ID not found")
2023-05-13 13:33:46 +02:00
in
find_session_id (Yojson.Safe.Util.to_assoc value)
| _ -> raise (Any "get_session | Invalid JSON")
2023-05-13 12:37:12 +02:00
;;
let close_session id = execute_delete_request (driver id) = "{\"value\":null}"
let execute_sync session_id src =
execute_post_request
(fmt "%s/execute/sync" (driver session_id))
(Json.execute_payload src)
2023-05-13 15:57:03 +02:00
;;
2023-05-13 20:31:46 +02:00
type strategy = XPath of string
let get_strategy = function
| XPath xpath -> "xpath", xpath
;;
let rec wait_for_load session_id =
let response = execute_sync session_id "return document.readyState" in
match Yojson.Safe.from_string response with
| `Assoc fields ->
(match List.assoc "value" fields with
| `String res ->
if not (res = "complete")
then (
Unix.sleep 1;
wait_for_load session_id)
| _ -> raise (Any "Error when waiting for page to load"))
| _ -> raise (Any "wait_for_load | Invalid JSON")
2023-05-13 13:33:46 +02:00
;;
2023-05-13 20:31:46 +02:00
let navigate ?(wait = true) session_id url =
let res =
execute_post_request (fmt "%s/url" (driver session_id)) (Json.navigate_payload url)
in
if wait then wait_for_load session_id;
res
;;
let screenshot session_id = execute_get_request (fmt "%s/screenshot" (driver session_id))
2023-05-13 20:31:46 +02:00
let find session_id strategy =
let engine, search = get_strategy strategy in
let response =
execute_post_request
(fmt "%s/elements" (driver session_id))
(Json.find_payload engine search)
in
match Yojson.Safe.from_string response with
| `Assoc fields ->
(match List.assoc "value" fields with
2023-05-13 22:13:26 +02:00
| `List l ->
List.fold_left
(fun acc x ->
match x with
| `Assoc subfields ->
List.fold_left
(fun acc' (_, value) ->
match value with
| `String str -> str :: acc'
| _ -> acc')
acc
subfields
| _ -> acc)
[]
l
| _ -> [])
2023-05-13 20:31:46 +02:00
| _ -> raise (Any "wait_for_load | Invalid JSON")
;;
2023-05-13 22:13:26 +02:00
let send_keys session_id element_id username =
let response =
execute_post_request
(fmt "%s/element/%s/value" (driver session_id) element_id)
(Json.send_keys_payload username)
in
print_endline response
;;