Отправка нескольких нажатий клавиш WatiN - PullRequest
2 голосов
/ 20 декабря 2011

Хорошо, я запускаю тесты в WatiN и использую метод SendKeys. В соответствии с веб-сайтом MSDN я могу ввести:

System.Windows.Forms.SendKeys.SendWait("{LEFT 2}");

И это войдет влево два раза. Это, однако, не работает, я считаю, потому что приложение требует времени между каждым нажатием клавиши. Я приказал сделать то, что мне нужно, чтобы программа делала, я использовал Thread.Sleep между каждым нажатием клавиши, чтобы убедиться, что они читаются. Есть ли более эффективный / правильный способ сделать это? Это мой текущий код метода:

System.Windows.Forms.SendKeys.SendWait("{LEFT}");
Thread.Sleep(500);
System.Windows.Forms.SendKeys.SendWait("{LEFT}");
Thread.Sleep(500);
System.Windows.Forms.SendKeys.SendWait("{ENTER}");

1 Ответ

3 голосов
/ 20 декабря 2011

К сожалению, я не верю, что есть.Согласно MSDN существуют проблемы синхронизации с SendKeys:

Класс SendKeys подвержен проблемам синхронизации, которые некоторым разработчикам приходилось обходиться.Обновленная реализация по-прежнему подвержена ошибкам синхронизации, но немного быстрее и может потребовать внесения изменений в обходные пути.

Класс SendKeys сначала пытается использовать предыдущую реализацию, а в случае неудачи использует новую реализацию.

В результате класс SendKeys может вести себя по-разному в разных операционных системах. Кроме того, когда класс SendKeys использует новую реализацию, метод SendWait не будет ожидать обработки сообщений при их отправке в другой процесс. Если ваше приложение использует согласованное поведение независимо от операционной системы, выможет заставить класс SendKeys использовать новую реализацию, добавив следующий параметр приложения в файл app.config.

<appSettings> 
  <add key="SendKeys" value="SendInput"/> 
</appSettings> 

Чтобы заставить класс SendKeys использовать предыдущую реализацию, используйте вместо этого значение «JournalHook».

Вы можете попробовать изменить между реализациями напосмотрите, есть ли изменения в ваших результатах.

Альтернативно, согласно этому сообщению просто используйте Thread.Sleep(0); после того, как ваш ввод должен работать.Не самое элегантное решение, но если оно работает, оно будет быстрее, чем пауза 500 мс.

...