Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

C# Seleniumの例外処理

背景

前回C#Seleniumを使う方法についてまとめた。 今回は実際に使う上での注意点をまとめる.

hope-is-dream.hatenablog.com

概要

Seleniumの例外がややややこしかったので整理する.

サンプルコードで説明

ついでに非同期処理のスニペットとなっている。

async void button_Click(object sender, EventArgs e)
{

    await Task.Run(() =>
    {
        using (IWebDriver driver = new ChromeDriver())
        {
            // 終了判定
            bool NonError = true;

            while (NonError)
            {

                try
                {
                
                    driver.Url = "https://google.com";
                    
                    // エラー発生させる
                    IWebElement element = driver.FindElement(By.Id("unknowns"));
                    
                    // 下のように要素を探すとエラーはでない。(メモ)
                    var elements = driver.FindElements(By.Id("gsr"));
                    if ( elements.Count > 0)
                    {
                        elements[0].Click();
                    }
                }
                catch (OpenQA.Selenium.NoSuchElementException ex)
                {
                    Console.WriteLine($"[ERROR] HTML要素が存在しない場合のエラー");
                    Console.WriteLine(ex.Message);
                }
                catch (OpenQA.Selenium.NoSuchWindowException ex)
                {
                    Console.WriteLine($"[ERROR] ブラウザが閉じられた場合のエラー");
                    Console.WriteLine(ex.Message);
                    NonError = false;
                }
                catch (OpenQA.Selenium.WebDriverException ex)
                {
                    Console.WriteLine($"[ERROR] WebDriverのエラー. WebDriverが閉じられた場合のエラー");
                    Console.WriteLine(ex.Message);
                    NonError = false;

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    NonError = false;
                }


                // 一時待機
                //System.Threading.Thread.Sleep(100);
                driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(1);

            }
        }

        Console.WriteLine("[while] end..");

    });

}

動作の概要としては、SeleniumWebDriverからブラウザを操作する. 例えば、C#Seleniumを起動させると黒い画面とブラウザが立ち上がる.

f:id:hope_is_dream:20181211202630p:plain

黒い画面を閉じると、WebDriverException が投げられる. ブラウザを閉じると、NoSuchWindowException が投げられる.

これまでは良く分かってなかったが、 WebDriverからSocket通信をしてブラウザを操作しているよう.

要素の検索としては、driver.FindElement()だと、要素が存在しない場合にNoSuchElementException が投げられる. 似たようなメソッドだが、driver.FindElements()を利用すると、要素が存在しない場合は、コレクションのlenghtが0になるので、それで判断すると良い.

まとめ

seleniumの例外処理について整理した。 例外処理をキチンとしていないと、アプリを動作させていると、WebDriverの操作から外れた幽霊ブラウザが発生するので注意が必要

参考

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)