Path: blob/trunk/dotnet/test/common/Environment/RemoteSeleniumServer.cs
2868 views
// <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; } } }