From a4a8de6d9a0c616aacf5fa158c50fdb98f3681ad Mon Sep 17 00:00:00 2001 From: Tristan Horn Date: Thu, 4 Sep 2025 03:03:01 -0700 Subject: [PATCH] Treat as a clickable button Also fixes a class of issues where all buttons were being sent back as fields, causing undefined behavior on certain sites. --- browser/form.go | 2 +- browser/form_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/browser/form.go b/browser/form.go index 87f10e6..03a25cf 100644 --- a/browser/form.go +++ b/browser/form.go @@ -378,7 +378,7 @@ func serializeForm(sel *goquery.Selection) (url.Values, url.Values, url.Values, val, _ := s.Attr("value") t, _ := s.Attr("type") t = strings.ToLower(t) - if t == "submit" { + if t == "submit" || t == "button" { buttons.Add(name, val) } else if t == "checkbox" || t == "radio" { if c, found := s.Attr("checked"); found && strings.ToLower(c) == "checked" { diff --git a/browser/form_test.go b/browser/form_test.go index 2d6453e..4dff308 100644 --- a/browser/form_test.go +++ b/browser/form_test.go @@ -408,6 +408,37 @@ func TestSubmitMultipart(t *testing.T) { ut.AssertContains("image=profile.png", bow.Body()) ut.AssertContains(fmt.Sprintf("profile.png=%s", url.QueryEscape(image)), bow.Body()) } +func TestBrowserFormInputButton(t *testing.T) { + ts := setupTestServer(` + + + + Echo Form + + +
+ + +
+ +`, t) + defer ts.Close() + + bow := newBrowser() + + err := bow.Open(ts.URL) + ut.AssertNil(err) + + f, err := bow.Form("[name='default']") + ut.AssertNil(err) + + err = f.Input("age", "30") + ut.AssertNil(err) + err = f.Click("btn") + ut.AssertNil(err) + ut.AssertContains("age=30", bow.Body()) + ut.AssertContains("btn=buttonvalue", bow.Body()) +} func setupTestServer(html string, t *testing.T) *httptest.Server { ut.Run(t)