У меня странная ситуация, когда я немного изменил код веб-драйвера селена, чтобы разрешить запуск службы драйвера под другим пользователем, изменения кода GitHub являются:веб-драйвер selenium работает как другой пользователь, не получая профиль/сеанс пользователя
public void Start()
{
this.driverServiceProcess = new Process();
if (this.user != null)
{
this.driverServiceProcess.StartInfo.UserName = user.Name;
this.driverServiceProcess.StartInfo.Password = user.Password;
this.driverServiceProcess.StartInfo.Domain = user.Domain;
}
this.driverServiceProcess.StartInfo.FileName = Path.Combine(this.driverServicePath, this.driverServiceExecutableName);
this.driverServiceProcess.StartInfo.Arguments = this.CommandLineArguments;
this.driverServiceProcess.StartInfo.UseShellExecute = false;
this.driverServiceProcess.StartInfo.CreateNoWindow = this.hideCommandPromptWindow;
this.driverServiceProcess.Start();
bool serviceAvailable = this.WaitForServiceInitialization();
if (!serviceAvailable)
{
string msg = "Cannot start the driver service on " + this.ServiceUrl;
throw new WebDriverException(msg);
}
}
где данные пользователя передаются в от моего внешнего кода в вызове экземпляра веб-драйвера:
new ChromeDriver(userName, password, domain);
или
new InternetExplorerDriver(ieOptions, userName, password, domain);
и распространяется через.
Это успешно запускает драйвер chrome под требуемыми учетными данными пользователя, но имеет проблемы с IE.
Кроме того, хром-драйвер не имеет такого же поведения, как хром, запущенный как данный пользователь вручную (то есть не через драйвер селена). В частности, автоматическая передача учетных данных пользователя в вызове NTLM не происходит.
Я обнаружил, что если у меня есть интерактивный сеанс, работающий как нужный пользователь (просто используйте runas /user:<theUser> cmd.exe
из командной строки и оставьте сеанс открытым), тогда все функциональные возможности браузеров будут такими, как ожидалось, при запуске через селен веб-драйвера, включая автоматический ответ на вызов NTLM.
Если я использую Process.Start()
для запуска cmd.exe в качестве желаемого пользователя перед созданием веб-драйвера, это не сработает.
Мой вопрос заключается в следующем:
Чем отличается запуск процесса программно (с использованием Process.Start()
) по сравнению с запуском интерактивного сеанса процесса из командной строки?
И можно ли каким-либо образом точно воспроизвести эффект запуска сеанса из командной строки в коде, чтобы я мог автоматизировать процесс и заставить мои веб-драйверы выполнять, как я желаю?
примечание: Я пытался запускать WebDriver с использованием .net олицетворения (как это было предложено here и here), а не изменения кода селена для запуска службы драйвера под другим пользователем, но запросы, посылаемые от водителя к серверу были все (см. here)
Вы все еще используете это для перевоплощения? – Zenuka
Я больше не работаю над этим проектом, но в прошлый раз я все-таки использовал этот код. – MikeW