private void LogWatcher_FileDataRecieved(
            object sender,
            FileSystemEventArgs e)
        {
            if (e.ChangeType != WatcherChangeTypes.Changed)
            {
                return;
            }

            // Check if the correct file was modified.
            var fileInfo = new FileInfo(Options.Log);

            if (fileInfo.FullName != e.FullPath)
            {
                return;
            }

            // Read & parse the last line.
            var lastLine = File.ReadLines(fileInfo.FullName).Last();
            var logEntry = SeleniumLogEntry.ParseString(lastLine);

            // Ignore exception messages.
            if (logEntry.IsException)
            {
                return;
            }

            // Check if the node is up and running.
            if (logEntry.Message.Contains("Selenium Server is up and running on port"))
            {
                var match = Regex.Match(
                    logEntry.Message,
                    @"(http[^\s]*)");

                var port = match.Groups[1];
                nodeUrl = new Uri($"http://localhost:{port}");
            }

            // Check if the node is ready.
            if (logEntry.Message.Contains("The node is registered to the hub and ready to use"))
            {
                signal.Set();
            }
        }
        private void LogWatcher_Log(object sender, FileSystemEventArgs e)
        {
            if (e.ChangeType != WatcherChangeTypes.Changed)
            {
                return;
            }

            var fileInfo = new FileInfo(Options.Log);

            if (fileInfo.FullName != e.FullPath)
            {
                return;
            }

            // Read & parse the last line.
            var lastLine = File.ReadLines(fileInfo.FullName).Last();
            var logEntry = SeleniumLogEntry.ParseString(lastLine);

            hubLogs.Add(lastLine);
        }
        private void LogWatcher_OutputDataRecieved(
            object sender,
            FileSystemEventArgs e)
        {
            if (e.ChangeType != WatcherChangeTypes.Changed)
            {
                return;
            }

            var fileInfo = new FileInfo(Options.Log);

            if (fileInfo.FullName != e.FullPath)
            {
                return;
            }

            // Read & parse the last line.
            var lastLine = File.ReadLines(fileInfo.FullName).Last();
            var logEntry = SeleniumLogEntry.ParseString(lastLine);

            // Ignore exception messages.
            if (logEntry.IsException)
            {
                return;
            }

            // Check if the hub is ready.
            if (lastLine.Contains("Nodes should register to"))
            {
                var match = Regex.Match(
                    lastLine,
                    @"Nodes should register to\s+(.*)");

                NodeRegisterUrl = new Uri(match.Groups[1].Value);

                signal.Set();
            }
        }
 /// <summary>
 /// Gets the logs.
 /// </summary>
 /// <returns></returns>
 /// <exception cref="NotImplementedException"></exception>
 public override IList <SeleniumLogEntry> GetLogs()
 {
     return(nodeLogs
            .Select(l => SeleniumLogEntry.ParseString(l))
            .ToList());
 }