mozilla / geckodriver

WebDriver for Firefox
https://firefox-source-docs.mozilla.org/testing/geckodriver/
Mozilla Public License 2.0
7.12k stars 1.52k forks source link

Alert generated by form submit does not disappear #620

Open barancev opened 7 years ago

barancev commented 7 years ago

Firefox Version

55.0a1 (2017-04-06) (64-bit) geckodriver 0.15

Platform

Windows 7

Steps to reproduce

Page code:

  <form id="theForm" method="get" action="javascript:alert('Tasty cheese');">
      <input name="unused" type="submit">
  </form>

Scenario:

    driver.findElement(By.id("theForm")).submit();
    Alert alert = wait.until(alertIsPresent());
    String value = alert.getText();
    alert.accept();

There are no exceptions, but the alert does not disappear.

andreastt commented 7 years ago

Thanks for the bug report. What does driver.findElement(By.id("theForm")).submit() do? There is no corresponding “form submit” command in WebDriver, so I’m curious what that does under the bonnet.

Could you attach a trace-level geckodriver log when you have the opportunity?

barancev commented 7 years ago

Here is the code that implements submit operation: https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/remote/http/W3CHttpCommandCodec.java#L291-L301

Trace (with an extra getTitle command in the end, that magically works despite the presense of the alert, I see it in the browser window):

1491826626758   webdriver::server   DEBUG   Got request POST AbsolutePath("/session/d12b38a0-f17d-4688-a332-bf4ecf2cd82f/url")
1491826626758   webdriver::command  DEBUG   Got request body {"url":"http://comp1:45957/temp/page4272239375507637165.html"}
1491826626758   geckodriver::marionette DEBUG   → 74:[0,2,"get",{"url":"http://comp1:45957/temp/page4272239375507637165.html"}]
1491826626760   Marionette  TRACE   0 -> [0,2,"get",{"url":"http://comp1:45957/temp/page4272239375507637165.html"}]
1491826627781   Marionette  TRACE   0 <- [1,2,null,{}]
1491826627784   geckodriver::marionette DEBUG   ← [1,2,null,{}]
1491826627785   webdriver::server   DEBUG   Returning status Ok
1491826627785   webdriver::server   DEBUG   Returning body {"value": {}}

1491826627808   webdriver::server   DEBUG   Got request POST AbsolutePath("/session/d12b38a0-f17d-4688-a332-bf4ecf2cd82f/element")
1491826627809   webdriver::command  DEBUG   Got request body {"value":"#theForm","using":"css selector"}
1491826627809   geckodriver::marionette DEBUG   → 63:[0,3,"findElement",{"using":"css selector","value":"#theForm"}]
1491826627810   Marionette  TRACE   0 -> [0,3,"findElement",{"using":"css selector","value":"#theForm"}]
1491826627853   Marionette  TRACE   0 <- [1,3,null,{"value":{"element-6066-11e4-a52e-4f735466cecf":"749798ac-ff3a-419b-87b1-ed88186d0e26","ELEMENT":"749798ac-ff3a-419b-87b1-ed88186d0e26"}}]
1491826627854   geckodriver::marionette DEBUG   ← [1,3,null,{"value":{"element-6066-11e4-a52e-4f735466cecf":"749798ac-ff3a-419b-87b1-ed88186d0e26","ELEMENT":"749798ac-ff3a-419b-87b1-ed88186d0e26"}}]
1491826627854   webdriver::server   DEBUG   Returning status Ok
1491826627854   webdriver::server   DEBUG   Returning body {"value":{"element-6066-11e4-a52e-4f735466cecf":"749798ac-ff3a-419b-87b1-ed88186d0e26"}}

1491826627871   webdriver::server   DEBUG   Got request POST AbsolutePath("/session/d12b38a0-f17d-4688-a332-bf4ecf2cd82f/execute/sync")
1491826627872   webdriver::command  DEBUG   Got request body {"script":"var form = arguments[0];\nwhile (form.nodeName != \"FORM\" && form.parentNode) {\n  form = form.parentNode;\n}\nif (!form) { throw Error('Unable to find containing form element'); }\nif (!form.ownerDocument) { throw Error('Unable to find owning document'); }\nvar e = form.ownerDocument.createEvent('Event');\ne.initEvent('submit', true, true);\nif (form.dispatchEvent(e)) { form.submit() }\n","args":[{"element-6066-11e4-a52e-4f735466cecf":"749798ac-ff3a-419b-87b1-ed88186d0e26"}]}
1491826627872   geckodriver::marionette DEBUG   → 577:[0,4,"executeScript",{"args":[{"element-6066-11e4-a52e-4f735466cecf":"749798ac-ff3a-419b-87b1-ed88186d0e26"}],"newSandbox":false,"script":"var form = arguments[0];\nwhile (form.nodeName != \"FORM\" && form.parentNode) {\n  form = form.parentNode;\n}\nif (!form) { throw Error('Unable to find containing form element'); }\nif (!form.ownerDocument) { throw Error('Unable to find owning document'); }\nvar e = form.ownerDocument.createEvent('Event');\ne.initEvent('submit', true, true);\nif (form.dispatchEvent(e)) { form.submit() }\n","scriptTimeout":null,"specialPowers":false}]
1491826627964   Marionette  TRACE   0 <- [1,4,null,{"value":null}]
1491826627964   geckodriver::marionette DEBUG   ← [1,4,null,{"value":null}]
1491826627964   webdriver::server   DEBUG   Returning status Ok
1491826627964   webdriver::server   DEBUG   Returning body {"value":null}

1491826627983   webdriver::server   DEBUG   Got request GET AbsolutePath("/session/d12b38a0-f17d-4688-a332-bf4ecf2cd82f/alert/text")
1491826627983   geckodriver::marionette DEBUG   → 28:[0,5,"getTextFromDialog",{}]
1491826628544   Marionette  TRACE   0 -> [0,5,"getTextFromDialog",{}]
1491826628545   Marionette  TRACE   0 <- [1,5,null,{"value":"Tasty cheese"}]
1491826628548   geckodriver::marionette DEBUG   ← [1,5,null,{"value":"Tasty cheese"}]
1491826628548   webdriver::server   DEBUG   Returning status Ok
1491826628548   webdriver::server   DEBUG   Returning body {"value":"Tasty cheese"}

1491826628584   webdriver::server   DEBUG   Got request GET AbsolutePath("/session/d12b38a0-f17d-4688-a332-bf4ecf2cd82f/alert/text")
1491826628585   geckodriver::marionette DEBUG   → 28:[0,6,"getTextFromDialog",{}]
1491826628587   Marionette  TRACE   0 -> [0,6,"getTextFromDialog",{}]
1491826628587   Marionette  TRACE   0 <- [1,6,null,{"value":"Tasty cheese"}]
1491826628587   geckodriver::marionette DEBUG   ← [1,6,null,{"value":"Tasty cheese"}]
1491826628587   webdriver::server   DEBUG   Returning status Ok
1491826628587   webdriver::server   DEBUG   Returning body {"value":"Tasty cheese"}

1491826628599   webdriver::server   DEBUG   Got request POST AbsolutePath("/session/d12b38a0-f17d-4688-a332-bf4ecf2cd82f/alert/accept")
1491826628600   webdriver::command  DEBUG   Got request body {}
1491826628600   geckodriver::marionette DEBUG   → 23:[0,7,"acceptDialog",{}]
1491826628601   Marionette  TRACE   0 -> [0,7,"acceptDialog",{}]
1491826628633   Marionette  TRACE   0 <- [1,7,null,{}]
1491826628638   geckodriver::marionette DEBUG   ← [1,7,null,{}]
1491826628638   webdriver::server   DEBUG   Returning status Ok
1491826628638   webdriver::server   DEBUG   Returning body {"value": {}}

1491826628645   webdriver::server   DEBUG   Got request GET AbsolutePath("/session/d12b38a0-f17d-4688-a332-bf4ecf2cd82f/title")
1491826628646   geckodriver::marionette DEBUG   → 19:[0,8,"getTitle",{}]
1491826628648   Marionette  TRACE   0 -> [0,8,"getTitle",{}]
1491826628651   Marionette  TRACE   0 <- [1,8,null,{"value":"Testing Alerts"}]
1491826628651   geckodriver::marionette DEBUG   ← [1,8,null,{"value":"Testing Alerts"}]
1491826628651   webdriver::server   DEBUG   Returning status Ok
1491826628651   webdriver::server   DEBUG   Returning body {"value":"Testing Alerts"}
whimboo commented 5 years ago

This is actually https://bugzilla.mozilla.org/show_bug.cgi?id=1487705. The reason is that the Selenium's submit() method triggers a custom (not trusted) event, and this causes the user prompt to open twice. So closing the alert once will still leave one alert open.