2015-09-08 5 views
0

У меня есть несколько тестов, которые кажутся случайным сбоем из-за таймаута при ошибке занятости в Internet Explorer.Тайм-аут при ошибке занятости в Internet Explorer, когда Browser.AttachTo

WatiN.Core.Exceptions.TimeoutException: Timeout while Internet Explorer busy 

Они ошибки, как представляется, вызваны только на линиях с кодом:

WatiN.Core.Browser.AttachTo[T](Constraint constraint)

Мой метод установки:

[SetUp] 
[Timeout(1000)] 
public void WithAnInstanceOfTheBrowser() 
{ 
    Settings.AttachToBrowserTimeOut = 200; 
    Settings.WaitUntilExistsTimeOut = 200; 
    Settings.WaitForCompleteTimeOut = 200; 
    Settings.SleepTime = 60; 

    BrowserExtension.KillAllIEProcess(); 

    var securePassword = new SecureString(); 
    foreach (var c in UserConfig.GetConfigPassword()) 
    { 
     securePassword.AppendChar(c); 
    } 

    string address = UserConfig.GetConfigUrl(); 
    string username = UserConfig.GetConfigUserName(); 
    ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Program Files\Internet Explorer\iexplore.exe", address); 
    startInfo.UserName = username; 
    startInfo.Password = securePassword; 
    startInfo.UseShellExecute = false; 
    startInfo.LoadUserProfile = true; 
    Process.Start(startInfo); 
    _browser = Browser.AttachTo<IE>(Find.ByUrl(UserConfig.GetConfigUrl())); 
} 

_browser глобальная переменная на уровне класса:

IE _browser; 

Затем в тесте я выполняю ряд действий в открывшемся окне, и одно из этих действий нажимает кнопку, и эта кнопка открывает новую вкладку в приложении. Затем, чтобы получить ссылку на эту новую страницу я использую следующие строки:

Thread.Sleep(6000); //even sleeping but to no avail 
Browser workItem = Browser.AttachTo<IE>(Find.ByTitle(new Regex(workItemRegex))); 

Это кажется откидывать ошибки случайным образом, иногда это работает, и иногда я получаю сообщение об ошибке.

Я не совсем уверен, что здесь происходит неправильно, потому что кажется логичным, что это должно сработать.

В TearDown теста все процессы IE убиты, а значение _browser равно null.

Любые идеи?

ответ

0

Я видел это раньше, и это случилось со мной, пытаясь закрыть и повторно открыть IE, а затем снова подключиться к браузеру. Но в то время как я не могу найти логическое объяснение, почему это не удается, я выяснил, почему это было время для меня (по крайней мере, в моем случае), и это потому, что даже когда вы убиваете объект IE перед созданием нового, выключение из IE занимает больше времени, чем ожидалось (поверьте, я пробовал несколько минут), поэтому единственным решением для меня было просто убить процесс, который я использовал, прежде чем создавать новый, и с этого момента у меня не было никаких проблем. Надеюсь, это поможет вашей ситуации.

+0

Я пробовал эту проблему, используя комбинацию AttachToNoWait и Thread.Sleep (XXXX). Я также пытался структурировать свои тесты по-разному в том, что передаю текущее окно, в котором я работаю, для вспомогательных методов вместо создания ссылки на конкретную страницу как часть вспомогательных методов. Я согласен с вашим ответом, так как в моем опыте именно это и вызывает проблему. Это всего лишь некоторые работы, которые я использовал. – Ben

+0

Я был там раньше, и я использовал один экземпляр и перемещал его между классами, но я также нашел ситуации, когда альтернативы нет, кроме запуска другого экземпляра и прикрепления к нему, instatiate и в этом случае убийство процесса отлично работает. – ProgrammerV5