C# Seleniumで要素取得　--メモ--

Visual Studio 2019 Communityを使用
NuGetでWebDriver　chromedriver firefoxdriverなどを適宜インストール

※　例外処理はしていません。

#Seleniumにおける要素の取得

ロケーターの種類は８種類

|ロケータ|詳細|
|:-----------|:------------|
|class name|class名に値を含む要素を探す (複合クラス名は使えない)|
|css selector|CSSセレクタが一致する要素を探す|
|id|id属性が一致する要素を探す|
|name|name属性が一致する要素を探す|
|link text|a要素のテキストが一致する要素を探す|
|partial link text|a要素のテキストが部分一致する要素を探す|
|tag name|タグ名が一致する要素を探す|
|xpath|XPathと一致する要素を探す|

#FindElementsByClassNameでクラスを指定

```csharp
using System;
using System.IO;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Reflection;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {

            ChromeDriver driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));

            driver.Navigate().GoToUrl(@"目的のURL");
            ReadOnlyCollection<IWebElement> itemList = driver.FindElementsByClassName("クラス名");

            foreach (IWebElement elm in itemList)
            {
                string str = elm.Text;
                Console.WriteLine(str);
            }

   
            Console.ReadKey();
            driver.Quit();
        }
    }
}

```

#XPathでIDを指定

ここではFirefoxDriverを使った。

Firefoxなどの開発ツールでXPathをコピーするが、//*[@id="ID名"]のようにダブルクオートが含まれる。
これはC#ではエスケープする必要があるが、ここではシングルクオートで置換した。
XPathをコピーしたあと、次のPowerShellを実行。クリップボードに　置換後の文字列が格納される。

```PowerShell
 (Get-Clipboard) -replace "`"" , "'" | Set-Clipboard
```


```csharp
          IWebDriver driver = new FirefoxDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
            driver.Navigate().GoToUrl(@"https://member.livedoor.com/login/");
            driver.Manage().Window.Maximize();

            driver.FindElement(By.XPath(@"//*[@id='livedoor_id']")).SendKeys(@"LivedoorブログID");
            driver.FindElement(By.XPath(@"//*[@id='password']")).SendKeys(@"Livedoorブログパス");
            driver.FindElement(By.XPath(@"//*[@id='check_auto_login']")).Click();
            driver.FindElement(By.XPath(@"//*[@id='submit']")).Click();
            driver.Navigate().GoToUrl(@"http://www.livedoor.com/");
            Console.ReadKey();
            driver.Quit();
```

#CssSelectorでクラス指定

FindElement と　FindElements　で単数,複数の違いがあるようです。

```csharp

using System;
using System.IO;
using System.Collections.ObjectModel;
using System.Reflection;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

            IWebDriver driver = new FirefoxDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
            driver.Navigate().GoToUrl(@"https://www.w3schools.com/css/css_selectors.asp");

            //FindElementで単数形

            IWebElement elm = driver.FindElement(By.CssSelector(".w3-example"));
            Console.WriteLine(elm.Text);
            Console.WriteLine("■■■■■■■■■■■■■■■■■■■\n\n");

            //FindElement"s"  で複数形
            ReadOnlyCollection<IWebElement>  itemList= driver.FindElements(By.CssSelector(".w3-example"));
            foreach (IWebElement i in itemList)
            {
                Console.WriteLine(i.Text);
            }

            Console.ReadKey();
            driver.Quit();
        }
    }
}


```

[参考にした記事]
 [C#：SeleniumでWeb解析](https://qiita.com/tanaka_2_10_1024/items/fb3bbf137bb9547dcb51)
[Seleniumドキュメント 要素を探す](https://www.selenium.dev/documentation/ja/webdriver/locating_elements/)
[Seleniumで要素を選択する方法まとめ](https://qiita.com/VA_nakatsu/items/0095755dc48ad7e86e2f)