Модульное тестирование с WatiN и NUnit - PullRequest
5 голосов
/ 20 января 2010

Похоже, что общая тема среди вопросов SO относительно WatiN связана с тем, чтобы все заработало, и я не исключение.

Я скачал последнюю версию WatiN (2.0.20.1089) и пытаюсь создать NUnit / WatiN эквивалент Hello, World:

using WatiN.Core;
using NUnit.Framework;

namespace Foo.Browser.Tests
{
    [TestFixture]
    public class BrowserTests
    {
        [Test]
        [STAThread]
        public void ExampleTest()
        {

            IE ie = new IE("http://www.google.com");

            ie.TextField(Find.ByName("q")).TypeText("WatiN");
            ie.Button(Find.ByValue("Google Search")).Click();
            Link link = ie.Link(Find.ByUrl("http://watin.sourceforge.net/"));

            Assert.That(link.Text == "WatiN Home");
        }

        [Test]
        public void FirefoxTest()
        {
            FireFox ff = new FireFox("http://www.google.com");

            ff.TextField(Find.ByName("q")).TypeText("WatiN");

            ff.Button(Find.ByValue("Google Search")).Click();
            Link link = ff.Link(Find.ByUrl("http://watin.sourceforge.net/"));

            Assert.That(link.Text == "WatiN Home");
        }
    }

Это приводит к окончанию IE (8) после возможного тайм-аута со следующей трассировкой стека:

в WatiN.Core.UtilityClasses.TryFuncUntilTimeOut.ThrowTimeOutException (Exception lastException, String message) в WatiN.Core.UtilityClasses.TryFuncUntilTimeOut.HandleTimeOut () в WatiN.Core.UtilityClasses.TryFuncUntilTimeOut.Try [Т] (DoFunc'1 func) в WatiN.Core.WaitForCompleteBase.WaitUntil (DoFunc'1 waitWhile, BuildTimeOutExceptionMessage исключение сообщения) в WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitWhileFrameDocumentNotAvailable (IWebBrowser2 кадр) в WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitForFramesToComplete (IHTMLDocument2 документ) в WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitForFramesToComplete (IHTMLDocument2 документ) в WatiN.Core.Native.InternetExplorer.IEWaitForComplete.WaitForCompleteOrTimeout () в WatiN.Core.WaitForCompleteBase.DoWait () в WatiN.Core.DomContainer.WaitForComplete (IWait waitForComplete) в WatiN.Core.IE.WaitForComplete (Int32 waitForCompleteTimeOut) в WatiN.Core.DomContainer.WaitForComplete () в WatiN.Core.Browser.GoTo (Uri url) в WatiN.Core.IE.FinishInitialization (Uri ури) в WatiN.Core.IE.CreateNewIEAndGoToUri (Uri Uri, IDialogHandler logonDialogHandler, Boolean createInNewProcess) в WatiN.Core.IE..ctor (String url) в Foo.Browser.Tests.BrowserTests.ExampleTest () в C: \ Development \ Foo \ Foo.Browser.Tests \ BrowserTests.cs: линия 19

У меня есть требуемый файл конфигурации в папке bin \ debug (Foo.Browser.Tests.dll.config), как указано на странице документации WatiN , так что еще это может быть? У кого-нибудь есть предложения, что может быть причиной проблемы?

Ответы [ 6 ]

5 голосов
/ 10 февраля 2010

Похоже, Фил, возможно, ответил на ваш вопрос, но я нашел и ваш пример для исключения. Чтобы исправить эту проблему, я изменил Поиск ссылок, чтобы он выглядел по атрибуту (href), как показано ниже.

[Test]
public void ExampleTest()
{
    IE ie = new IE("http://www.google.com"); 

    ie.TextField(Find.ByName("q")).TypeText("WatiN"); 
    ie.Button(Find.ByValue("Google Search")).Click(); 
    Link link = ie.Link(Find.By("href", "http://watin.sourceforge.net/"));

    Assert.That(link.Text == "WatiN Home"); 
}

Обратите внимание, что я тестировал только IE, поскольку в этом окне не установлен FireFox.

5 голосов
/ 29 января 2010

Фил,

Посмотрите на InnerException выданного TimeoutExcepetion.Это, скорее всего, будет содержать больше информации для решения вашей проблемы.

HTH Йерун ван Менен Ведущий разработчик

2 голосов
/ 09 марта 2012

У меня была похожая проблема с этим кодом

var link1 = WebBrowser.Current.Link(Find.ByText("Log Off"));
var exists = link1.Exists;

, который был решен таким образом ...

var link1 = WebBrowser.Current.Link(Find.ByText("Log Off"));
link1.WaitUntilExists();
var exists = link1.Exists;
1 голос
/ 20 января 2010

Сам не сталкивался с большими проблемами WatiN через xUnit.net.

Вот список прачечной, в который люди могут свободно редактировать и / или предлагать обновления:

  • Является ли процесс NUnit администратором? Является ли IE его порождающим администратором? посмотрите в диспетчере задач. (Не то, чтобы работать от имени администратора - это панацея - в идеале вы хотите избежать этого, но как способ устранить причины, по которым он не работает)
  • Помогает ли запуск через TestDriven.net, CodeRush или ReSharper?
  • Вы [ссылались на соответствующие dll как способ получить] зависимые библиотеки DLL, такие как shdocvvw.dll, сидящие рядом с вашей тестовой сборкой]?
  • Вы пытались увидеть, показывает ли Фиддлер что-нибудь, что истекло?
  • Вы пробовали просматривать страницы вручную, чтобы убедиться, что все диалоги безопасности были в порядке? например, иногда ваш тестовый контекст может быть администратором, тогда как ваш обычный профиль просмотра может не быть (зависит от браузера) - например, если вы проигнорировали предупреждение сертификата в одном контексте, но не в другом, это может вызвать проблему.

Один большой недостаток, который меня укусил в отношении WatiN, заключается в том, что после нескольких тысяч вызовов WS08 IE откажется сотрудничать, пока вы не выйдете из системы и снова войдите в систему (см. Один из моих нерешенных вопросов). Маршрут, по которому я пошел (мне нужен был безошибочный мониторинг), состоял в том, чтобы использовать рекордер WatiN, а затем перенести его на HtmlAgilityPack с LINQ-запросом с помощью GET / POST-кода, написанного вручную, с помощью WebRequest, который работает довольно хорошо, но, очевидно, не обрабатывает JavaScript, который явно отрисовывает это академично для многих сценариев.

0 голосов
/ 12 августа 2010
public void ExampleTest() 
    { 

        IE ie = new IE("http://www.google.com"); 

        ie.TextField(Find.ByName("q")).TypeText("WatiN"); 
        var btnSearch = ie.Button(Find.ByValue("Google Search"));
        btnSearch.ClickNoWait();
        ie.WaitforComplete(); 
        Link link = ie.Link(Find.ByUrl("http://watin.sourceforge.net/")); 

        Assert.That(link.Text == "WatiN Home"); 
    } 
0 голосов
/ 28 января 2010

У меня возникли проблемы, схожие с проблемами Рубена, в отношении ситуации выхода из системы. Лучшее объяснение, которое я смог найти, связано с тем, что WatiN использует IE с использованием COM-сервера. Могут быть проблемы с утилизацией, но это совсем другая Опра ...

Что касается ситуации тайм-аута, то это происходит время от времени, но, как правило, всплывает сообщение в консоли NUnit и продолжается. Одна большая разница, которую я вижу между вашей реализацией и моей, заключается в том, что я запускаю экземпляр IE как одноэлементный объект. Таким образом, мне никогда не придется закрывать и открывать IE между тестами, и с тех пор у меня не возникало проблем с выходом из системы. Следовательно, мои циклы тестирования короче, даже когда IE виден и не работает в фоновом режиме.

...