Automating SignalR applications with Selenium WebDriver

Last Updated on by

Post summary: This post is about an “No response from server for url” issue during automation of web application using SignalR with Selenium WebDriver. Issue was resolved by configuring application to connect to server through WebSocket protocol.

I had to automate with Selenium WebDriver (version 2.43) a single page web application which was build with SignalR. First thing to do when you start an automation is to automate a smoke test scenario. So did I. It run fine on Internet Explorer (version 11) and Chrome (version 37). I was happy and confident I’m going to finish this project on time. The happy face was dramatically changed when I run the suite on Firefox (version 33). The driver timed out with “No response from server for url” issue. I searched the net for similar problems with no luck. I couldn’t find an end-to-end solution on issues with SignalR automation so I prepared this post.

About SignalR

ASP.NET SignalR is a library for building “real-time” applications that enables server to push events to client instead on relying client to request data from server. Once application is started SignalR client tries to connect to server with transport protocols in order shown in the list: WebSocket, Server-sent events, Forever Frame (IE only) and finally Ajax long polling.

My application was forced to connect to server with Long Polling transport (later on I discovered this was caused by a bug in application’s connection logic). Client (browser) opens connection to server. Server keeps this connection open for relatively long time (2 minutes in my case). Seems like this open connection is confusing Selenium and it doesn’t actually know when browser is ready. “Unstable” page loading strategy did not worked out:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("webdriver.load.strategy", "unstable");
WebDriver driver = new FirefoxDriver(profile);

The only solution to make Selenium working with SignalR in all three browsers was to make application under test working with WebSocket transport protocol.

It is also beneficial for application itself to work with WebSockets. There are several SignalR prerequisites in order to use it with WebSockets: IIS 8 or IIS 8 Express with enabled WebSockets. In order to get enabled Web Sockets are installed additionally to IIS as a Windows feature.

If you find this post useful, please share it to reach more people. Sharing is caring!
Share on FacebookShare on LinkedInTweet about this on TwitterShare on Google+Email this to someone
  • Ngan Menegay

    Hello,

    I’m facing a similar issue but mine is with IEDriverServer. Pretty much all of my Click() events end up with an exception of “Timed out waiting for page to load.” My application also uses SignalR on some of its pages (and these pages are where my timeout exceptions happen). How did you manage to get yours to work with IEDriverServer?

    PS: I also posted my question here: http://stackoverflow.com/questions/41069560/c-sharp-protractor-angularjs-iedriverserver-click-exception-timed-out-waiting

    • Lyudmil Latinov

      Back there for me the only solution I found was to make SignalR to work through WebSockets. So I guess you need dev/admin/devops assistance to configure your application.