/// <summary>
        /// 新しいタブで対象のURLを開く
        /// </summary>
        /// <param name="chrome"></param>
        /// <param name="argURL"></param>
        /// <returns>新しく開いたURLのハンドル</returns>
        public static string OpenNewWindowTab(ChromeDriverEx chrome, string argURL)
        {
            string newWindow = string.Empty;

            try
            {
                // 新規タブを開く
                chrome.ExecuteScript("window.open()");
                //chrome.ExecuteScript("window.open(arguments[0], 'newtab')", argURL);

                // 開いたウィンドウのハンドルを取得
                newWindow = chrome.WindowHandles[chrome.WindowHandles.Count - 1];

                // 作業対象を切り替え
                chrome.SwitchTo().Window(newWindow);

                chrome.Url = argURL;

                // 指定のURLを開く
                //chrome.Url = argURL;
            }
            catch (Exception e)
            {
                newWindow = string.Empty;
                //throw;
            }

            return(newWindow);
        }
        /// <summary>
        /// ハイローにエントリーする
        /// </summary>
        /// <param name="sig">シグナル情報 コンテナ</param>
        /// <returns>True エントリー成功 / False エントリー失敗</returns>
        public Boolean EntryHighLow(ref SignalOrder sig)
        {
            try
            {
                // シグナルのステータスがエントリーのみ実行
                if (sig.mainState != SignalState.soEntry)
                {
                    return(false);
                }

                // ハイローをアクティブに
                this.IsActivate();

                // 要素が押せるようにスクロールをトップに
                chrome.ExecuteScript("document.scrollingElement.scrollTop = 140");

                // 対象の取引する銘柄へ移動
                // ===== ===== ===== ===== ===== =====
                // 銘柄リストを開く
                // ===== ===== ===== ===== ===== =====
                IWebElement BrandList = this.chrome.FindElementByXPath("//*[@id='highlow-asset-filter']");
                CommonDriverControl.ScrollTargetElementView(BrandList);
                BrandList.Click();
                CommonControl.SleepWait(500);

                // ===== ===== ===== ===== ===== =====
                // 銘柄を選ぶ
                // ===== ===== ===== ===== ===== =====
                // 検索にかける
                IWebElement eleSearchBox = this.chrome.FindElementById("searchBox");
                eleSearchBox.SendKeys(sig.tradeBrand);
                CommonControl.SleepWait(200);

                // ヒットした一番目を選択(1つしかないはず)
                IWebElement eleResultList = this.chrome.FindElementByXPath("//*[@id='assetsFilteredList']/div[1]");
                eleResultList.Click();

                // ===== ===== ===== ===== ===== =====
                // 15分固定
                // ===== ===== ===== ===== ===== =====
                IWebElement timeTab = this.chrome.FindElementByXPath(
                    "//*[@id='assetsCategoryFilterZoneRegion']/div/div[2]");
                CommonDriverControl.ScrollTargetElementView(timeTab);
                timeTab.Click();
                CommonControl.SleepWait(500);

                // ===== ===== ===== ===== ===== =====
                // エントリーする判定時刻 フレーム時間のタブを見つける
                // ===== ===== ===== ===== ===== =====
                IReadOnlyCollection <IWebElement> frameTimeDigits =
                    this.chrome.FindElementsByXPath("//*[@class='time-digits']");

                // 最大3つある フレームタイムの時間を見に行き、同じ時間を探す
                bool findFrameFlag = false;
                for (int i = 0; i < frameTimeDigits.Count(); i++)
                {
                    //シグナル時間の取得
                    string chkFrameTime = frameTimeDigits.ElementAt(i).GetAttribute("textContent");

                    // 次のシグナルの時間か?
                    if (sig.tradeTimeFrame.Equals(chkFrameTime))
                    {
                        // 表示
                        frameTimeDigits.ElementAt(i).Click();
                        findFrameFlag = true;       // 見つかった
                        break;                      // 1つしかない
                    }
                }

                // 見つからなかったとき
                if (findFrameFlag == false)
                {
                    // エントリー失敗
                    CommonControl.DebugPrint("entryHighLow", "対象のタイムフレーム時間が見つからなかった為、エントリー出来ませんでした");
                    CommonControl.DebugPrint("探そうとしたタイムフレーム" + sig.tradeTimeFrame);
                    return(false);
                }

                CommonControl.SleepWait(500);

                // ===== ===== ===== ===== ===== =====
                // エントリー金額を入力する
                // ===== ===== ===== ===== ===== =====
                // TODO:実際は総資金の10分の1入札する この仕組みは後に作る 今は単純に10分の1でエントリーする
                // 10分1が20万を超えた場合は以下のようにする
                // 例:22万円の場合、11万*2回エントリーする
                // 30万円の場合、15万円*2回エントリーする

                //  残高
                // タイムフレームを押した後、読み込み中である可能性があるので取得可能になるまで待つ(GetSafeWebElementById)
                IWebElement eleBalance = CommonDriverControl.GetSafeWebElementById(chrome, Constants.HTML_ID_HL_Balance);
                int         balance    = int.Parse(eleBalance.GetAttribute("textContent")
                                                   .Replace(@"¥", "").Replace(",", ""));

                //  入力
                IWebElement eleAmount = chrome.FindElementById(Constants.HTML_ID_HL_Amount);
                // TODO:たまに失敗してる? 要調査 念のため2回おこなう
                CommonDriverControl.ScrollTargetElementView(eleAmount);                         // 見えていないとクリアできない
                CommonDriverControl.ScrollTargetElementView(eleAmount);                         // 見えていないとクリアできない
                eleAmount.Clear();                                                              // 既存入力額をクリア
                CommonControl.SleepWait(200);

                int amount = balance / 2000;                // 資産の 20分の1で
                amount = amount * 100;                      // 100の倍数にする

                if (amount < 1000)
                {
                    amount = 1000;                      // 1000円未満になった場合は1000円
                }
                if (amount > 200000)
                {
                    amount = 200000;                     // 20万を超える場合は20万 (20万以上はエントリーできないため)
                }
                eleAmount.SendKeys(amount.ToString());

                // ===== ===== ===== ===== ===== =====
                // High Or Low 入力
                // ===== ===== ===== ===== ===== =====
                // 要素が押せるようにスクロールトップの調整
                chrome.ExecuteScript("document.scrollingElement.scrollTop = 275");
                IWebElement btn;
                switch (sig.arrow)
                {
                case arrowState.asLow:
                    btn = this.chrome.FindElementByXPath(Constants.XPATH_HL_Low_Button);
                    break;

                case arrowState.asHigh:
                    btn = this.chrome.FindElementByXPath(Constants.XPATH_HL_High_Button);
                    break;

                default:
                    CommonControl.DebugPrint("ハイ、又はローが分かりませんでした。");
                    return(false);
                }
                btn.Click();
                CommonControl.SleepWait(200);

                // ===== ===== ===== ===== ===== =====
                // エントリー時間になるまで待つ
                // ===== ===== ===== ===== ===== =====
                IWebElement rTime   = this.chrome.FindElementByXPath(Constants.XPATH_HL_Remaining_Time);
                string[]    timeTxt = rTime.GetAttribute("textContent").Split(new string[] { ":" }, StringSplitOptions.None);

                // 後どれだけ待てば良いかを求める 5分前まで
                TimeSpan tsReman = new TimeSpan(0, int.Parse(timeTxt[0]), int.Parse(timeTxt[1])) - new TimeSpan(0, 5, 0);

                while (true)
                {
                    // 残り時刻が5分切るまで待機
                    if (tsReman > new TimeSpan(0, 0, 0))
                    {
                        CommonControl.SleepWait((int)tsReman.TotalMilliseconds);
                    }
                    break;
                }

                // 成功するまで エントリーを行う
                int  tryTime   = 0;
                bool entryFlag = false;
                while (entryFlag == false)
                {
                    IWebElement entryBtn = this.chrome.FindElementById("invest_now_button");
                    entryBtn.Click();
                    CommonControl.SleepWait(1250);

                    IWebElement eleNotice = this.chrome.FindElementById(Constants.HTML_ID_HL_NoticeMsg);
                    if (eleNotice.Text.Equals("成功"))
                    {
                        //エントリーに成功した
                        entryFlag = true;
                    }
                    tryTime += 1;
                    if (tryTime > 2)
                    {
                        break;                  // 3回目失敗したら強制終了
                    }
                }
#if debug
                if (tryTime == 3)
                {
                    CommonControl.DebugPrint("3回エントリー失敗した");
                }
#endif
                //  処理自体のエントリー結果を返す
                return(entryFlag);
            }
            catch (Exception e)
            {
                // エントリーに失敗した
                CommonControl.DebugPrint(e, "EntryHighLow エントリーに失敗しました");
                //throw;// 投げない
                return(false);
            }
        }
 /// <summary>
 /// 対象のID要素のテキストボックスを全選択状態にする
 /// </summary>
 /// <param name="chrome">ドライバ</param>
 /// <param name="argId">要素ID</param>
 public static void selectAllTextBox(ChromeDriverEx chrome, string argId)
 {
     // 使えない
     chrome.ExecuteScript("return document.getElementById('{0}').select()", argId);
 }