selenium-webdriverappiumbrowserstack

Why does HTTP request to remote WebDriver server time out after 60 s despite commandTimeout of 120 s?


Using Selenium WebDriver on .NET, when testing a web application on Chrome on Android at BrowserStack, I occasionally get the error OneTimeSetUp: OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://hub-cloud.browserstack.com/wd/hub/session timed out after 60 seconds even though I pass a commandTimeout to the driver that is longer:

new AndroidDriver(
    myUrl,
    myDriverOptions,
    commandTimeout: TimeSpan.FromMinutes(2)
)

Other timeouts I have read about but do not set myself are:

So there should not be any timeout of 60 seconds. Where does this come from? And what can I do to prevent it?

Unfortunately I do not get a proper stack trace, just this:

OneTimeSetUp: OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://hub-cloud.browserstack.com/wd/hub/session timed out after 60 seconds.
  ----> System.Threading.Tasks.TaskCanceledException : The request was canceled due to the configured HttpClient.Timeout of 60 seconds elapsing.
  ----> System.TimeoutException : The operation was canceled.
  ----> System.Threading.Tasks.TaskCanceledException : The operation was canceled.
  ----> System.IO.IOException : Unable to read data from the transport connection: The I/O operation has been aborted because of either a thread exit or an application request..
  ----> System.Net.Sockets.SocketException : The I/O operation has been aborted because of either a thread exit or an application request.


Solution

  • I have found the culprit. It is a bug in Appium.WebDriver 5.0.0-rc.1. The commandTimeout I pass is ignored when the following constructor in class OpenQA.Selenium.Appium.AppiumDriver (lines 77-80) is (indirectly) called:

    public AppiumDriver(Uri remoteAddress, ICapabilities appiumOptions, TimeSpan commandTimeout)
        : this(remoteAddress, appiumOptions, DefaultCommandTimeout, AppiumClientConfig.DefaultConfig())
    {
    }
    

    In Appium.WebDriver 5.0.0-rc.4 (or earlier) it has been fixed:

    public AppiumDriver(Uri remoteAddress, ICapabilities appiumOptions, TimeSpan commandTimeout)
        : this(remoteAddress, appiumOptions, commandTimeout, AppiumClientConfig.DefaultConfig())
    {
    }