public static Task <HttpResponseMessage> SendFormAsync(
            this HttpClient client,
            IHtmlFormElement form,
            IHtmlElement submitButton,
            IEnumerable <KeyValuePair <string, string> > formValues)
        {
            if (client is null)
            {
                throw new ArgumentNullException(nameof(client));
            }
            if (form is null)
            {
                throw new ArgumentNullException(nameof(form));
            }
            if (submitButton is null)
            {
                throw new ArgumentNullException(nameof(submitButton));
            }
            if (formValues is null)
            {
                throw new ArgumentNullException(nameof(formValues));
            }

            foreach (var kvp in formValues)
            {
                var element = form[kvp.Key];
                switch (element)
                {
                case IHtmlInputElement input:
                    input.Value = kvp.Value;
                    break;

                case IHtmlSelectElement select:
                    select.Value = kvp.Value;
                    break;
                }
            }

            Assert.True(form.CheckValidity(), "Form contains invalid data");
            var submit = form.GetSubmission(submitButton);

            var target = (Uri)submit.Target;

            if (submitButton.HasAttribute("formaction"))
            {
                var formaction = submitButton.GetAttribute("formaction");
                target = new Uri(formaction, UriKind.Relative);
            }

#pragma warning disable CA2000 // Dispose objects before losing scope
            var submision = new HttpRequestMessage(new HttpMethod(submit.Method.ToString()), target)
            {
                Content = new StreamContent(submit.Body)
            };
#pragma warning restore CA2000 // Dispose objects before losing scope

            foreach (var header in submit.Headers)
            {
                submision.Headers.TryAddWithoutValidation(header.Key, header.Value);
                submision.Content.Headers.TryAddWithoutValidation(header.Key, header.Value);
            }

            return(client.SendAsync(submision));
        }