google / webdriver.dart

Dart WebDriver client
https://pub.dev/packages/webdriver
Apache License 2.0
138 stars 45 forks source link

SessionNotCreatedException throws when the Port is already in Use #223

Open barath-uni opened 4 years ago

barath-uni commented 4 years ago

The following error throws when the Port is not available.

session not created: This version of ChromeDriver only supports Chrome version 78
  (Driver info: chromedriver=78.0.3904.70 (edb9c9f3de0247fd912a77b7f6cae7447f6d3ad5-refs/branch-heads/3904@{#800}),platform=Mac OS X 10.14.6 x86_64)
#0      parseJsonWireResponse (package:webdriver/src/handler/json_wire/utils.dart:79:9)
#1      JsonWireSessionHandler.parseInfoResponse (package:webdriver/src/handler/json_wire/session.dart:26:21)
#2      JsonWireSessionHandler.parseCreateResponse (package:webdriver/src/handler/json_wire/session.dart:18:7)
#3      AsyncRequestClient.send (package:webdriver/src/common/request_client.dart:96:25)
<asynchronous suspension>
#4      createDriver (package:webdriver/async_core.dart:64:32)
#5      createDriver (package:webdriver/async_io.dart:42:5)
#6      _launchChrome (file:///Users/baradwav/Documents/dart-automation/main.dart:29:20)

It even defaults to chromeDriver=78.* and throws 'ChromeDriver only supports Chrome version 78' which is not a proper error message.

Checking the port with netstat -vanp tcp | grep 4444 shows that the port is occupied. Killing the Port manually solves the problem.

Shouldn't the package take care of this by itself? Kindly also provide a proper 'Error' message which is relevant to the issue.

jingbian commented 4 years ago

Hello there!

I'm not very sure what the problem is here. It can either of the following two cases:

  1. Is the port actually occupied by an older ChromeDriver? And thus it is responding the message as the current Chrome is not his expected version. And in which case, the package outputs this as expected.

  2. Or do you mean no matter what process occupies the port, it always produces this message? In which case, it should be a bug.

Please kindly help me confirm which case it is. Thanks!

barath-uni commented 4 years ago

As far as i can see, it is the '1st' you have mentioned. When you say, 'the package outputs this as expected', should it not say the port is occupied rather than throw a weird error with that exception message?

jingbian commented 4 years ago

So from the point of view of the library (or the Dart part), it talks through the http port and sends a request to create the session.

It gets a valid response, even though it's an error. It should output the error as is. The same error can happen if you just forget to update the chromedriver after Chrome updates, in which case, saying the port is occupied is very confusing.

The chromedriver instance (supposedly the new one) is not started by Dart code (or this library). The occupied problem should be spotted when you start chromedriver manually. It will show something like the following, which is very obvious:

[1583275583.382][SEVERE]: bind() failed: Address already in use (48)
[1583275583.382][INFO]: listen on IPv4 failed with error ERR_ADDRESS_IN_USE
IPv4 port not available. Exiting...

If you are using a different workflow, please let me know.