blob: bc9fed6f5b8fe897f8e975869a8d7e345cdefc93 [file] [log] [blame] [edit]
// <copyright file="RemoteSeleniumServer.cs" company="Selenium Committers">
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
// </copyright>
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace OpenQA.Selenium.Environment;
public class RemoteSeleniumServer
{
private Process webserverProcess;
private string serverJarName = @"java/src/org/openqa/selenium/grid/selenium_server_deploy.jar";
private string projectRootPath;
private bool autoStart;
public RemoteSeleniumServer(string projectRoot, bool autoStartServer)
{
projectRootPath = projectRoot;
autoStart = autoStartServer;
}
public async Task StartAsync()
{
if (autoStart && (webserverProcess == null || webserverProcess.HasExited))
{
serverJarName = serverJarName.Replace('/', Path.DirectorySeparatorChar);
if (!File.Exists(Path.Combine(projectRootPath, serverJarName)))
{
throw new FileNotFoundException(
string.Format(
"Selenium server jar at {0} didn't exist - please build it using something like {1}",
serverJarName,
"go //java/src/org/openqa/grid/selenium:selenium"));
}
webserverProcess = new Process();
webserverProcess.StartInfo.FileName = "java.exe";
webserverProcess.StartInfo.Arguments = " -jar " + serverJarName + " standalone --port 6000 --selenium-manager true --enable-managed-downloads true";
webserverProcess.StartInfo.WorkingDirectory = projectRootPath;
webserverProcess.Start();
DateTime timeout = DateTime.Now.Add(TimeSpan.FromSeconds(30));
bool isRunning = false;
// Poll until the webserver is correctly serving pages.
using var httpClient = new HttpClient();
while (!isRunning && DateTime.Now < timeout)
{
try
{
using var response = await httpClient.GetAsync("http://localhost:6000/wd/hub/status");
if (response.StatusCode == HttpStatusCode.OK)
{
isRunning = true;
}
}
catch (Exception ex) when (ex is HttpRequestException || ex is TimeoutException)
{
}
}
if (!isRunning)
{
throw new TimeoutException("Could not start the remote selenium server in 30 seconds");
}
}
}
public async Task StopAsync()
{
if (autoStart && webserverProcess != null && !webserverProcess.HasExited)
{
using (var httpClient = new HttpClient())
{
try
{
using var response = await httpClient.GetAsync("http://localhost:6000/selenium-server/driver?cmd=shutDownSeleniumServer");
}
catch (Exception ex) when (ex is HttpRequestException || ex is TimeoutException)
{
}
}
webserverProcess.WaitForExit(10000);
if (!webserverProcess.HasExited)
{
webserverProcess.Kill();
}
webserverProcess.Dispose();
webserverProcess = null;
}
}
}