web-dev-qa-db-ja.com

C#NUnitから複数のブラウザーでSeleniumテストを次々に実行する

Seleniumテストをいくつかのブラウザで次々と実行するための推奨される/最も良い方法を探しています。私がテストしているWebサイトは大きくないので、並列ソリューションはまだ必要ありません。

[SetUp][TearDown]、および[Test]を使用した通常のテストセットアップメソッドがあります。もちろん、SetUpは新しいISeleniumオブジェクトを、テストしたいブラウザでインスタンス化します。

だから私がしたいのはプログラムで言うことです:このテストはChrome、IE、Firefoxで順に実行されます。それ、どうやったら出来るの?

編集:

これは少し役立つかもしれません。ビルドが成功した後、CruiseControl.NETを使用してNUnitテストを開始しています。 NUnit実行可能ファイルにパラメーターを渡し、テストでそのパラメーターを使用する方法はありますか?このようにして、異なるブラウザーパラメーターでNUnitを数回実行することができます。

30
Edgar

NUnit 2.5+は、複数のブラウザーでのテストを非常に簡単にするGeneric Test Fixturesをサポートするようになりました。 http://www.nunit.org/index.php?p=testFixture&r=2.5

次の例を実行すると、GoogleTestが2回実行されます。1回はFirefoxで、もう1回はIEで実行されます。

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using System.Threading;

namespace SeleniumTests 
{
    [TestFixture(typeof(FirefoxDriver))]
    [TestFixture(typeof(InternetExplorerDriver))]
    public class TestWithMultipleBrowsers<TWebDriver> where TWebDriver : IWebDriver, new()
    {
        private IWebDriver driver;

        [SetUp]
        public void CreateDriver () {
            this.driver = new TWebDriver();
        }

        [Test]
        public void GoogleTest() {
            driver.Navigate().GoToUrl("http://www.google.com/");
            IWebElement query = driver.FindElement(By.Name("q"));
            query.SendKeys("Bread" + Keys.Enter);

            Thread.Sleep(2000);

            Assert.AreEqual("bread - Google Search", driver.Title);
            driver.Quit();
        }
    }
}
50
alanning

これは繰り返し起こる質問であり、いくつかの方法で解決されます。

  1. ファクトリメソッドはISeleniumオブジェクトを生成します-静的getSeleniumメソッドを持つヘルパークラスがあります。このメソッドは、必要なブラウザを文字列として定義するプロパティを持つ外部設定を読み込みます。次に、getSeleniumでブラウザを適切に構成します。これは、NUnitでの設定ファイルの使用に関する便利な投稿です http://blog.coryfoy.com/2005/08/nunit-app-config-files-its-all-about-the-nunit-file/ =

  2. その他は、IoCコンテナーを介してブラウザーを挿入することに成功しています。 TestNGはGuiceでJava土地でうまく機能するので、本当に気に入っています。しかし、NUnitとNinject、MEFなどを簡単に組み合わせることができるかどうかはわかりません...

5
pnewhook

これは基本的に、アラニングの答えを拡張したものです(11月10日21:20)。私のケースも似ていましたが、パラメーターなしのコンストラクターで実行したくない(つまり、ドライバーの実行可能ファイルへのデフォルトパスを使用したくない)だけです。テストしたいドライバーを含む別のフォルダーがあり、これはうまく機能しているようです:

[TestFixture(typeof(ChromeDriver))]
[TestFixture(typeof(InternetExplorerDriver))]
public class BrowserTests<TWebDriver> where TWebDriver : IWebDriver, new()
{
    private IWebDriver _webDriver;

    [SetUp]
    public void SetUp()
    {
        string driversPath = Environment.CurrentDirectory + @"\..\..\..\WebDrivers\";

        _webDriver = Activator.CreateInstance(typeof (TWebDriver), new object[] { driversPath }) as IWebDriver;
    }

    [TearDown]
    public void TearDown()
    {
        _webDriver.Dispose(); // Actively dispose it, doesn't seem to do so itself
    }

    [Test]
    public void Tests()
    {
        //TestCode
    }
}

}

5
Arve Systad

IWebドライバーのリストを使用して、すべてのブラウザーで行ごとにテストを実行します。

[ClassInitialize]
        public static void ClassInitialize(TestContext context) {
            drivers = new List<IWebDriver>();
            firefoxDriver = new FirefoxDriver();
            chromeDriver = new ChromeDriver(path);
            ieDriver = new InternetExplorerDriver(path);
            drivers.Add(firefoxDriver);
            drivers.Add(chromeDriver);
            drivers.Add(ieDriver);
            baseURL = "http://localhost:4444/";
        }

    [ClassCleanup]
    public static void ClassCleanup() {
        drivers.ForEach(x => x.Quit());
    }

..and then am able to write tests like this:

[TestMethod]
        public void LinkClick() {
            WaitForElementByLinkText("Link");
            drivers.ForEach(x => x.FindElement(By.LinkText("Link")).Click());
            AssertIsAllTrue(x => x.PageSource.Contains("test link")); 
        }

..各ドライバの操作を実行するために独自のメソッドWaitForElementByLinkTextおよびAssertIsAllTrueを書いていて、どこが失敗したか、どのブラウザが失敗したのかを特定するのに役立つメッセージを出力します:

 public void WaitForElementByLinkText(string linkText) {
            List<string> failedBrowsers = new List<string>();
            foreach (IWebDriver driver in drivers) {
                try {
                    WebDriverWait wait = new WebDriverWait(clock, driver, TimeSpan.FromSeconds(5), TimeSpan.FromMilliseconds(250));
                    wait.Until((d) => { return d.FindElement(By.LinkText(linkText)).Displayed; });
                } catch (TimeoutException) {
                    failedBrowsers.Add(driver.GetType().Name + " Link text: " + linkText);
                }
            }
            Assert.IsTrue(failedBrowsers.Count == 0, "Failed browsers: " + string.Join(", ", failedBrowsers));
        }

IEDriverはひどく遅いですが、これにより、3つのメインブラウザーがテストを「並行して」実行します。

3
DevDave

これは私が同様の問題を解決するのに役立ちました 2つの異なる設定でnUnitテストのセットを実行するにはどうすればよいですか?

セットアップ方法で異なるブラウザを設定するだけです:]

1
slawek

さて、1つの解決策は、さまざまなブラウザーでISeleniumオブジェクトをセットアップするラッパーテストを行うことです。次に、以前のように新しいオブジェクトを設定する代わりに、そのオブジェクトを使用する他のすべてのテストにそのオブジェクトを渡します。

欠点は、ブラウザーごとに1つの大きなテストを行うことです。最善の解決策でもありません。まだ探しています...

編集:

これにもう少し時間を費やした。私が思いついた解決策は、テストに使用するブラウザを指定するテキストファイルをソリューションに含めることです。 NUnitは、Seleniumオブジェクトをインスタンス化するときに設定を取得します。

CruiseControl.NETを使用して自動ビルドとテストを実行しています。そして、テストを1回実行するのではなく、2回実行するように構成しました。しかし、各テストの前に、構成テキストファイルでブラウザーを変更するコマンドラインコマンドを実行します。

<exec>
    <executable>cmd</executable>
    <buildArgs>/C echo firefox C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe > F:\...\Selenium_browser.txt</buildArgs>
</exec>
<exec>
    <executable>F:\...\NUnit 2.5.7\bin\net-2.0\nunit-console.exe</executable>
    <baseDirectory>F:\...\bin\Debug</baseDirectory>
    <buildArgs>F:\...\...nunit /xml:"F:\CCXmlLog\Project\nunit-results.xml" /noshadow</buildArgs>
    <successExitCodes>0</successExitCodes>
    <buildTimeoutSeconds>1200</buildTimeoutSeconds>
</exec>

<exec>
    <executable>cmd</executable>
    <buildArgs>/C echo googlechrome C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe > F:\...\Selenium_browser.txt</buildArgs>
</exec>
<exec>
    <executable>F:\...\NUnit 2.5.7\bin\net-2.0\nunit-console.exe</executable>
    <baseDirectory>F:\...\bin\Debug</baseDirectory>
    <buildArgs>F:\...\...nunit /xml:"F:\CCXmlLog\Project\nunit-results.xml" /noshadow</buildArgs>
    <successExitCodes>0</successExitCodes>
    <buildTimeoutSeconds>1200</buildTimeoutSeconds>
</exec>
1
Edgar

私は同じ問題について不思議に思っていました、そして最後に私は 解決策を得ました

プラグインをインストールすると、どのブラウザでシナリオをテストするかを制御できます。

機能例:

@Browser:IE
@Browser:Chrome
Scenario Outline: Add Two Numbers
    Given I navigated to /
    And I have entered <SummandOne> into summandOne calculator
    And I have entered <SummandTwo> into summandTwo calculator
    When I press add
    Then the result should be <Result> on the screen
    Scenarios:
        | SummandOne | SummandTwo | Result |
        | 50 | 70 | 120 |
        | 1 | 10 | 11 |

実装

[Given(@"I have entered '(.*)' into the commentbox")]
public void GivenIHaveEnteredIntoTheCommentbox(string p0)
{
            Browser.Current.FindElement(By.Id("comments")).SendKeys(p0);
}

詳細

1

そこにする必要がありますより良い方法ですが、 T4テンプレート を使用して、各ブラウザーに重複するテストクラスを生成できます-基本的に自動化各ブラウザのテストのコピーアンドペースト。

0
Massif