Windows 10 + C# + Selenium4 で Chrome と Edge を headlessで起動してみる

# 目的
C\# + Selenium4は以下との変更部分が多そうなので、メモっておく
[Windows 10 + C# + selenium で headless chrome を試してみる](https://qiita.com/tabizou/items/d378c5c9c5f4f79bd479)
[Windows 10 + C# + selenium で headless edge(Chromium) を試してみる](https://qiita.com/tabizou/items/ef8c77b33ab2a46d2977)

[ドキュメント/WebDriver/待機](https://www.selenium.dev/ja/documentation/webdriver/waits/)の実装例としては以下の2案が考えられる？(でいいのか？？)
```cs
# 案１
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement firstResult = wait.Until(e => e.FindElement(By.XPath("//*[@id='sb_privacy']")));
# 案２
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10))
    .Until(ExpectedConditions.ElementExists(By.XPath("//*[@id='sb_privacy']")));
```
## 追加パッケージ
VS2022 .NET6でプロジェクトを作成後
プロジェクト -> NuGetパッケージの管理より以下を追加する(作成日のバージョン)
```cs
Selenium.WebDriver(4.3.0)
Selenium.Support(4.3.0)
SeleniumExtras.WaitHelpers(1.0.2)
```

## サンプルコード

```cs
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using SeleniumExtras.WaitHelpers;
using System.Diagnostics;

//
// Edge版
//
private void btnEdge_Click(object sender, EventArgs e)
{
    var service = EdgeDriverService.CreateDefaultService();
    service.UseVerboseLogging = true;

    var options = new EdgeOptions();
    options.AddArgument("headless");    // headless

    var driver = new EdgeDriver(service, options);

    try
    {
        driver.Url = "https://bing.com";

        driver.FindElement(By.Id("sb_form_q")).SendKeys("WebDriver" + OpenQA.Selenium.Keys.Enter);

        // 下部の[プライバシーと Cookie]を確認
        //  案１
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
        IWebElement firstResult = wait.Until(e => e.FindElement(By.XPath("//*[@id='sb_privacy']")));

        //  案２
        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10))
                .Until(ExpectedConditions.ElementExists(By.XPath("//*[@id='sb_privacy']")));

        //ページソースの出力
        Debug.WriteLine(driver.PageSource);

        Thread.Sleep(5000);
    }
    finally
    {
        driver.Quit();
    }
}

//
// Chrome版
//
private void btnChrome_Click(object sender, EventArgs e)
{
    var service = ChromeDriverService.CreateDefaultService();
    //service.UseVerboseLogging = true;

    var options = new ChromeOptions();
    options.AddArgument("headless");    // headless

    var driver = new ChromeDriver(service, options);

    try
    {
        driver.Url = "https://bing.com";

        driver.FindElement(By.Id("sb_form_q")).SendKeys("WebDriver" + OpenQA.Selenium.Keys.Enter);

        // 検索結果下部の[プライバシーと Cookie]を確認
        //  案１
        WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
        IWebElement firstResult = wait.Until(e => e.FindElement(By.XPath("//*[@id='sb_privacy']")));

        //  案２
        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10))
                .Until(ExpectedConditions.ElementExists(By.XPath("//*[@id='sb_privacy']")));

        Thread.Sleep(5000);
    }
    finally
    {
        driver.Quit();
    }
}
```
# 参考にしたのは以下のサイト
[Seleniumブラウザー自動化プロジェクト](https://www.selenium.dev/ja/documentation/)
[WebDriver を使用して Microsoft Edge を自動化する](https://docs.microsoft.com/ja-jp/microsoft-edge/webdriver-chromium/?tabs=c-sharp)
[TimeSpan.ToString メソッド](https://docs.microsoft.com/ja-jp/dotnet/api/system.timespan.tostring?view=net-6.0)
[Windows 10 + C# + selenium で headless chrome を試してみる](https://qiita.com/tabizou/items/d378c5c9c5f4f79bd479)
[Windows 10 + C# + selenium で headless edge(Chromium) を試してみる](https://qiita.com/tabizou/items/ef8c77b33ab2a46d2977)