System.ComponentModel.Win32Exception: ошибка "Доступ запрещен" при автоматизации приложения WPF с использованием FlaUI+SpecFlow
Я столкнулся с проблемой, которая возникает не очень часто. Я пытаюсь автоматизироватьUI testing
с помощью FlaUI and SpecFlow
. Я пытаюсь запустить приложениеexe
.The app runs for sometime and then throws the error.
Я получаю сообщение об ошибке ниже.
System.ComponentModel.Win32Exception: "Доступ запрещен"
Код:
public void Start()
{
try
{
_logger.Info("Synergy TestHub starting up in memory");
_testHub = new SynergyTestHub(locator =>
{
locator.RegisterFeatureService(Substitute.For<ISynergyLogger>());
locator.RegisterFeatureService(Substitute.For<ISynergyClientConfigService>());
}, Config.SynergyEnvironment);
// Run the Synergy Test Hub In Memory
AsyncBlockingDeadlockAvoidanceHack.SafeWait(
async () => await _testHub.RunUiApplicationAsync(
_pathBuilder.ShipTrackerExePath,
600,
false));
_controlAction.WaitFor(new TimeSpan(0, 0, 0, 50)); // Average time for ref data to load
var process = Process.GetProcessesByName(Config.ShipTrackerFileName)[0];
process.WaitForInputIdle();
Application = Application.Attach(process.Id);
ShipTrackerWindow = GetMainWindow();
}
catch (Exception exception)
{
_logger.Error($"Error Starting up Synergy TestHub in Memory. {exception.Message}");
_logger.Warning("Killing processes that could be hanging around .. please try to run the test again");
_processTerminator.KillProcess(new List<string>
{
Config.ShipTrackerFileName, Config.SynergyHubAppName
});
throw;
}
}
В StackTrace
является
Трассировки стека:
ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
Process.GetProcessHandle(Int32 access, Boolean throwIfExited)
Process.WaitForInputIdle(Int32 milliseconds)
Process.WaitForInputIdle()
ApplicationDriver.Start() line 79
Hooks.BeforeScenario() line 133
lambda_method(Closure , IContextManager )
BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) line 69
TestExecutionEngine.InvokeHook(IBindingInvoker invoker, IHookBinding hookBinding, HookType hookType) line 351
TestExecutionEngine.FireEvents(HookType hookType) line 340
TestExecutionEngine.FireScenarioEvents(HookType bindingEvent) line 321
TestExecutionEngine.OnScenarioStart() line 198
TestRunner.OnScenarioStart() line 54
RefreshTheViewsFeature.ScenarioStart()
RefreshTheViewsFeature.AutomationOfRefreshInManualPublishMode() line 34
Линия process.WaitForInputIdle();
выдает вышеупомянутую ошибку.
2 ответа
У вас нет разрешения на чтение всего процесса на вашем устройстве, попробуйте запустить его в режиме администратора
Мне удалось решить эту проблему, проведя активный сеанс RDP. В разделе «Проблемы» на github я увидел, что у кого-то возникла точно такая же проблема , когда он пытался щелкнуть элемент. Ему удалось обойти эту проблему, запустив активный локальный сеанс VNC.
Я также видел упоминания об использовании .Invoke для кнопки вместо использования .Click/LeftMouseClick и т. д., но мне не удалось полностью преобразовать свою программу так, чтобы она использовала только InvokePatterns для управления пользовательским интерфейсом.