Skip to content

Random error in with-driver-tests #676

Closed
@dgr

Description

@dgr

Version
I specifically saw this with 3b1e29c, but I've seen it before with other versions as well.

Platform
This specifically happened with the "api windows firefox jdk21" environment in the CI test harness. I don't know the platform details for that.

Symptom
There seems to be a race condition in the test that causes it to fail randomly.

Reproduction
I have not reproduced it locally. It seems to happen in the CI test suite with some regularity.

Actual behavior
Here's the relevant output from the CI test suite under task test-server:

=== with-driver-tests [jvm]
.... firefox

ERROR in (with-driver-tests) (support.clj:201)
firefox
expected: (= "Webdriver Test Document" (e/with-driver :firefox driver (e/go driver test-page) (e/get-title driver)) (e/with-firefox nil driver (e/go driver test-page) (e/get-title driver)) (e/with-firefox {} driver (e/go driver test-page) (e/get-title driver)) (e/with-firefox driver (e/go driver test-page) (e/get-title driver)) (e/with-firefox-headless nil driver (is (= true (e/headless? driver))) (e/go driver test-page) (e/get-title driver)) (e/with-firefox-headless {} driver (is (= true (e/headless? driver))) (e/go driver test-page) (e/get-title driver)) (e/with-firefox-headless driver (is (= true (e/headless? driver))) (e/go driver test-page) (e/get-title driver)) (e2/with-firefox [driver] (e/go driver test-page) (e/get-title driver)) (e2/with-firefox-headless [driver] (is (= true (e/headless? driver))) (e/go driver test-page) (e/get-title driver)))
  actual: clojure.lang.ExceptionInfo: throw+: {:response {:value {:error "no such window", :message "Browsing context has been discarded", :stacktrace "RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8\nWebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:193:5\nNoSuchWindowError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:679:5\nassert.that/<@chrome://remote/content/shared/webdriver/Assert.sys.mjs:515:13\nassert.open@chrome://remote/content/shared/webdriver/Assert.sys.mjs:147:4\nGeckoDriver.prototype.navigateTo@chrome://remote/content/marionette/driver.sys.mjs:859:39\ndespatch@chrome://remote/content/marionette/server.sys.mjs:318:40\nexecute@chrome://remote/content/marionette/server.sys.mjs:289:16\nonPacket/<@chrome://remote/content/marionette/server.sys.mjs:262:20\nonPacket@chrome://remote/content/marionette/server.sys.mjs:263:9\n_onJSONObjectReady/<@chrome://remote/content/marionette/transport.sys.mjs:494:20\n"}}, :path "session/e6665b0d-7ad2-4f39-ad15-6f8196c8200c/url", :payload {:url "http://localhost:50663/test.html"}, :method :post, :type :etaoin/http-error, :port 50813, :host "127.0.0.1", :status 404, :webdriver-url nil, :driver {:args ("geckodriver" "--port" 50813), :process {:proc #object[java.lang.ProcessImpl 0x621a7d83 "Process[pid=7020, exitValue=\"not exited\"]"], :exit nil, :in #object[java.io.BufferedOutputStream 0x58de1da2 "java.io.BufferedOutputStream@58de1da2"], :out #object[java.lang.ProcessBuilder$NullInputStream 0x3c84c32f "java.lang.ProcessBuilder$NullInputStream@3c84c32f"], :err #object[java.lang.ProcessBuilder$NullInputStream 0x3c84c32f "java.lang.ProcessBuilder$NullInputStream@3c84c32f"], :prev nil, :cmd ["C:\\SeleniumWebDrivers\\GeckoDriver\\geckodriver.exe" "--port" "50813"]}, :locator "xpath", :type :firefox, :port 50813, :host "127.0.0.1", :url "http://127.0.0.1:50813/", :created-epoch-ms 1727190165049, :session "e6665b0d-7ad2-4f39-ad15-6f8196c8200c"}}
{:response {:value {:error "no such window", :message "Browsing context has been discarded", :stacktrace "RemoteError@chrome://remote/content/shared/RemoteError.sys.mjs:8:8\nWebDriverError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:193:5\nNoSuchWindowError@chrome://remote/content/shared/webdriver/Errors.sys.mjs:679:5\nassert.that/<@chrome://remote/content/shared/webdriver/Assert.sys.mjs:515:13\nassert.open@chrome://remote/content/shared/webdriver/Assert.sys.mjs:147:4\nGeckoDriver.prototype.navigateTo@chrome://remote/content/marionette/driver.sys.mjs:859:39\ndespatch@chrome://remote/content/marionette/server.sys.mjs:318:40\nexecute@chrome://remote/content/marionette/server.sys.mjs:289:16\nonPacket/<@chrome://remote/content/marionette/server.sys.mjs:262:20\nonPacket@chrome://remote/content/marionette/server.sys.mjs:263:9\n_onJSONObjectReady/<@chrome://remote/content/marionette/transport.sys.mjs:494:20\n"}}, :path "session/e6665b0d-7ad2-4f39-ad15-6f8196c8200c/url", :payload {:url "http://localhost:50663/test.html"}, :method :post, :type :etaoin/http-error, :port 50813, :host "127.0.0.1", :status 404, :webdriver-url nil, :driver {:args ("geckodriver" "--port" 50813), :process {:proc #object[java.lang.ProcessImpl 0x621a7d83 "Process[pid=7020, exitValue=1]"], :exit nil, :in #object[java.io.BufferedOutputStream 0x58de1da2 "java.io.BufferedOutputStream@58de1da2"], :out #object[java.lang.ProcessBuilder$NullInputStream 0x3c84c32f "java.lang.ProcessBuilder$NullInputStream@3c84c32f"], :err #object[java.lang.ProcessBuilder$NullInputStream 0x3c84c32f "java.lang.ProcessBuilder$NullInputStream@3c84c32f"], :prev nil, :cmd ["C:\\SeleniumWebDrivers\\GeckoDriver\\geckodriver.exe" "--port" "50813"]}, :locator "xpath", :type :firefox, :port 50813, :host "127.0.0.1", :url "http://127.0.0.1:50813/", :created-epoch-ms 1727190165049, :session "e6665b0d-7ad2-4f39-ad15-6f8196c8200c"}}
 at slingshot.support$stack_trace.invoke (support.clj:201)
    etaoin.impl.client$call.invokeStatic (client.clj:124)
    etaoin.impl.client$call.invoke (client.clj:82)
    etaoin.api$execute.invokeStatic (api.clj:264)
    etaoin.api$execute.invoke (api.clj:238)
    etaoin.api$go.invokeStatic (api.clj:469)
    etaoin.api$go.invoke (api.clj:457)
    etaoin.api_with_driver_test$fn__7811$fn__7880$fn__7906.invoke (api_with_driver_test.clj:210)
    etaoin.api_with_driver_test$fn__7811$fn__7880.invoke (api_with_driver_test.clj:209)
    etaoin.api_with_driver_test$fn__7811.invokeStatic (api_with_driver_test.clj:187)
    etaoin.api_with_driver_test/fn (api_with_driver_test.clj:119)
    clojure.test$test_var$fn__9761.invoke (test.clj:717)
    clojure.test$test_var.invokeStatic (test.clj:717)
    clojure.test$test_var.invoke (test.clj:708)
    clojure.test$test_vars$fn__9787$fn__9792.invoke (test.clj:735)
    clojure.test$default_fixture.invokeStatic (test.clj:687)
    clojure.test$default_fixture.invoke (test.clj:683)
    clojure.test$test_vars$fn__9787.invoke (test.clj:735)
    etaoin.api_test$test_server.invokeStatic (api_test.clj:123)
    etaoin.api_test$test_server.invoke (api_test.clj:106)
    clojure.test$compose_fixtures$fn__9755$fn__9756.invoke (test.clj:694)
    clojure.test$default_fixture.invokeStatic (test.clj:687)
    clojure.test$default_fixture.invoke (test.clj:683)
    clojure.test$compose_fixtures$fn__9755.invoke (test.clj:694)
    clojure.test$test_vars.invokeStatic (test.clj:731)
    clojure.test$test_all_vars.invokeStatic (test.clj:737)
    clojure.test$test_ns.invokeStatic (test.clj:758)
    clojure.test$test_ns.invoke (test.clj:743)
    clojure.core$map$fn__5884.invoke (core.clj:2759)
    clojure.lang.LazySeq.sval (LazySeq.java:42)
    clojure.lang.LazySeq.seq (LazySeq.java:51)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.boundedLength (RT.java:1793)
    clojure.lang.RestFn.applyTo (RestFn.java:130)
    clojure.core$apply.invokeStatic (core.clj:669)
    clojure.test$run_tests.invokeStatic (test.clj:768)
    clojure.test$run_tests.doInvoke (test.clj:768)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$apply.invoke (core.clj:662)
    cognitect.test_runner$test.invokeStatic (test_runner.clj:74)
    cognitect.test_runner$test.invoke (test_runner.clj:62)
    test_shared$do_test.invokeStatic (test_shared.clj:14)
    test_shared$do_test.invoke (test_shared.clj:6)
    test_shared$test.invokeStatic (test_shared.clj:20)
    test_shared$test.invoke (test_shared.clj:16)
    clojure.lang.Var.invoke (Var.java:384)
    babashka.cli.exec$main.invokeStatic (exec.clj:86)
    babashka.cli.exec$main.doInvoke (exec.clj:83)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.core$apply.invoke (core.clj:662)
    babashka.cli.exec$_main.invokeStatic (exec.clj:101)
    babashka.cli.exec$_main.doInvoke (exec.clj:88)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.Var.applyTo (Var.java:705)
    clojure.core$apply.invokeStatic (core.clj:667)
    clojure.main$main_opt.invokeStatic (main.clj:514)
    clojure.main$main_opt.invoke (main.clj:510)
    clojure.main$main.invokeStatic (main.clj:664)
    clojure.main$main.doInvoke (main.clj:616)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.Var.applyTo (Var.java:705)
    clojure.main.main (main.java:40)

Expected behavior
The test should pass consistently or fail with an actual hard failure, but not fail randomly.

Diagnosis
I think this is another case of the test suite kicking off an asynchronous action with the browser, the WebDriver returns to the test code, then the test code makes another WebDriver call before the browser is ready, and the browser returns something that the test code is not expecting.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions