azukipochette's weblog

memory dump (mini)

Selenium を使って Microsoft Edge の UI テストをする

はじめに

Selenium は Firefox との相性がとても良い。WebDriver のインストールは不要、テストもなるべく失敗しようなような動きをしてくれる。 だが、ほかのブラウザーではそうはいかない。そこで、今回は Microsoft Edge におけるテストについて説明する。

Selenium を使うためにインストールが必要な NuGet パッケージ

Visual Studio の好きな言語で単体テストのプロジェクトを作成し、次の NuGet パッケージをインストールすればよい。

  • Selenium.Support
  • Selenium.WebDriver

Microsoft Edge Web Driver のインストール

Microsoft Edge Web Driver は下記からダウンロードできる。

注意してほしいのは、使用されている Windows 10 のバージョンによってインストールするドライバーが違うということだ。 自分自身が使っているバージョンをしっかり確認したほうがいい。

コード記述例

後は下記のようなテストを書くだけだ。 下記のテストは、amazon.co.jp に移動し、いくつかの検索条件で検索したあと、その画面をキャプチャするものである。 テキストの入力、ボタンのクリック、検索後の遅延待ちや、画面取得というのはよくある話なので、その辺を理解するのに役に立つと思う。

using System;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Interactions;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Support.Extensions;
using OpenQA.Selenium.Support.UI;

namespace SeleniumTests
{
    public static class WebDriverExtensions
    {
        public static void SaveScreenshot(this IWebDriver driver, string fileName, ImageFormat format)
        {
            Screenshot screenshot = driver.TakeScreenshot();
            screenshot.SaveAsFile(fileName, format);
        }
    }

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void AmazonSearchTest()
        {
            RemoteWebDriver driver = null;
            try
            {
                var list = new[] { "Visual Studio", "Windows 10", "ビール", "少年ジャンプ" };

                string serverPath = "Microsoft Web Driver";
                serverPath = Path.Combine(Environment.ExpandEnvironmentVariables(Environment.Is64BitOperatingSystem ? "%ProgramFiles(x86)%" : "%ProgramFiles%"), serverPath);
                EdgeOptions options = new EdgeOptions { PageLoadStrategy = EdgePageLoadStrategy.Normal };
                driver = new EdgeDriver(serverPath, options);

                // 暗黙的待機 (要素を検索するときに、見つけられるまで指定時間分だけ待つ)
                driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5));

                foreach (var keyword in list)
                {
                    driver.Url = "http://www.amazon.co.jp";

                    // 本当はこれで検索ボックスに文字列を入力できるが...
                    //IWebElement element = driver.FindElement(By.Name("field-keywords"));
                    //element.SendKeys(keyword);

                    // Edge は 日本語 を SendKeys すると Unknown Error になるので、ExecuteScript で回避
                    driver.ExecuteScript($"document.getElementsByName('field-keywords')[0].value = \"{keyword}\"");

                    // 検索ボタンをクリック
                    IWebElement element2 = driver.FindElementByClassName("nav-input");
                    element2.Submit();

                    // 検索結果のページが読み込み完了するまで待機する
                    WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
                    wait.Until(_ => driver.ExecuteScript("return document.readyState").Equals("complete"));

                    // 画面ショットを取る
                    driver.SaveScreenshot($"{keyword}.png", ImageFormat.Png);
                }
            }
            finally
            {
                driver?.Quit();
            }
        }
    }
}

テストのコツ

実際に動かしてみるとわかるが、Microsoft Edge の Web Driver は、Edge が起動していると一度すべて閉じてしまう。なので、インターネットで調べ物をしながらコードを書いているなら Microsoft Edge を使わない方がいい。 また、Edge を起動したままにしていると、どうもテストの失敗率が高くなるので、テスト前には Microsoft Edge 自体を落としておくほうがよい。

Edge が起動しなくなったときの対処

上記のコードにも Try-finally で EdgeDriver.Quite() を呼び出しているが、このメソッドがちゃんと呼び出されないと次回以降の起動ができなくなることがよくある。 ただ、上記コードを書いていても、デバッグなどで途中停止したりすると同じ現象になることがある。 その場合はコンピューターを再起動する、または sihost.exe (Shell Infrastructure Host) を Kill するとよい (当然、自己責任で)。