2016-12-22 10 views
1

У меня странная ситуация, когда я немного изменил код веб-драйвера селена, чтобы разрешить запуск службы драйвера под другим пользователем, изменения кода 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)

+0

Вы все еще используете это для перевоплощения? – Zenuka

+1

Я больше не работаю над этим проектом, но в прошлый раз я все-таки использовал этот код. – MikeW

ответ

2

Пробовал ли вы эту настройку?

this.driverServiceProcess.StartInfo.LoadUserProfile = true;

+1

работает, спасибо, и я не могу поверить, что ответ был таким простым – MikeW