/// <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="chrome">ドライバ</param> /// <param name="by">対象</param> private static Boolean WaitElementArrivalBy(ChromeDriverEx chrome, By by) { //const int waitTimeLimit = 60000; // 待機限界 //int waitTime = 0 ; // カウンタ bool ret = false; // 返り値 try { // 旧仕様 // 最大3分待つ IWait <IWebDriver> wait = new WebDriverWait(chrome, TimeSpan.FromMinutes(1)); // 旧方式でつくる wait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(by)); //// 見つかるまでループ //while (!ret) //{ // ReadOnlyCollection<IWebElement> target = chrome.FindElements(by); // if (target.Count > 0) // { // // 見つかった // ret = true; // } // else // { // // 見つからなかった // ret = false; // } // CommonControl.SleepWait(500); // waitTime += 500; // if (waitTime > waitTimeLimit) // break; //} ret = true; } catch (Exception) { ret = false; } return(ret); }
/// <summary> /// 【ID版】 /// 対象の要素が取得できる状態になってから /// 安全に取得する /// </summary> /// <param name="chrome">ドライバ</param> /// <param name="elementId"></param> /// <returns></returns> public static IWebElement GetSafeWebElementById(ChromeDriverEx chrome, string elementId) { try { IWebElement element; WaitElementArrivalById(chrome, elementId); element = chrome.FindElementById(elementId); return(element); } catch (Exception e) { CommonControl.DebugPrint(e); } // error return(null); }
/// <summary> /// ドライバを作成する /// </summary> /// <returns></returns> public static ChromeDriverEx CreateNewChromeDriver() { ChromeDriverEx chrome; try { // Chromeに入れるオプションの作成 ChromeOptions chromeOptions = new ChromeOptions(); // LINEセット chromeOptions.AddExtension(Constants.PATH_CRX_LINE); // プロファイルセット 2段階認証 Skip用 chromeOptions.AddArgument("user-data-dir=" + Constants.PATH_ProfileDir); chromeOptions.AddArgument("--profile-directory=" + Constants.UsingProfileName); chrome = new ChromeDriverEx(Constants.PATH_ChromeDriver, chromeOptions); // エレメント待機の設定 IWait <IWebDriver> wait = new WebDriverWait(chrome, TimeSpan.FromSeconds(30)); // 最大30秒待つ // ブラウザを最大化 chrome.Manage().Window.Maximize(); } catch (Exception e) { Console.WriteLine(e.StackTrace); throw new Exception("ブラウザの起動に失敗しました。\r\n 原因" + e.Message); } finally { // Nothing } return(chrome); }
public investingCalender(ref ChromeDriverEx chromeDriver) { }
public InvestingCalender(ref ChromeDriverEx chrome) { this.chrome = chrome; }
static void Main(string[] args) { //ForDebugOnly(); // デバッグ用関数 //return; try { // ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== // 起動準備 & 引数用意 // ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== ===== // パラメータ設定の初期化(取得) Constants.Initialize(); // ブラウザ立ち上げ ChromeDriverEx chrome = CreateNewChromeDriver(); // 経済指標を取得 //InvestingCalender InvC = new InvestingCalender(ref chrome); //InvC.GetInvestingCalender(); //// LINE用 LINEControl cLINE = new LINEControl(ref chrome); // ログイン ライン cLINE.LoginLINE(); //// 初回ログイン時はログイン情報だけを記憶させて終了 //if (Constants.Login_Line_First) return; //// highlow 本トレ HighLowControl cHighLow_Real = new HighLowControl(ref chrome); cHighLow_Real.Open(false); // 本番OPEN cHighLow_Real.Login(); // 本トレログイン ///// highlowデモ HighLowControl cHighLow_Demo = new HighLowControl(ref chrome); cHighLow_Demo.Open(true); // デモOPEN cHighLow_Demo.demoLogin(); // デモログイン CommonControl.SleepWait(500); // ユーザーによるコマンド受付 情報保持用 string userCommandStatus = string.Empty; //ハイロー入札履歴 List <BoHistroyContainer> HL_History = new List <BoHistroyContainer>(); #if DEBUG //ForDebugOnly(chrome); //return; #endif // シグナルが来るまで待つか、[コマンド]終了を受け付けたら終了 while (true) { //CommonControl.DebugPrint("待機開始・・・"); // メッセージを待つ string signalRoomName = WaitLineGroupsNewArraival(cLINE); // なければ、終了定期処理へ if (string.IsNullOrEmpty(signalRoomName)) { CommonControl.DebugPrint("この時間来ませんでした" + DateTime.Now); goto finallyProcess; // 終了まで飛ばす } // 以下、シグナル受信していたら // メッセージが来た時 // 新着対象の部屋のメッセージ群を取得する ArrayList newMsgList = cLINE.getNewMsgText(signalRoomName); // メッセージがあるか?(通知に気づいたときには古いメッセージしかなくて新着メッセージないときは抜ける) if (newMsgList.Count == 0) { // 新着に気づいたが、メッセージが古い時間のものしか無かった時 CommonControl.DebugPrint("気づくのが遅かった・・・部屋名:" + signalRoomName); goto finallyProcess; // 終了まで飛ばす } string newMsg = ""; if (!userCommandStatus.Equals("stop")) { // エントリーの情報1つのみに絞り込むか又は命令メッセージ(最初に見つかったエントリー メッセージを取得) newMsg = HighLowControl.SelectSignalMsg(signalRoomName, newMsgList); } else { newMsg = (string)newMsgList[newMsgList.Count - 1]; } if (Constants.LINE_RECEIVER_SIDE) { // 子機の場合は冒頭についているどの部屋から来たか情報を取り出し // メッセージの冒頭の親からのヘッダパラメータをカットしてシグナル文のみにする signalRoomName = HighLowControl.AnalysisReceiverSide(ref newMsg); } // ※Stop時以外 // 命令かバイナリー配信かを判断する if (IsSignalMsg(signalRoomName, newMsg)) { // バイナリー配信の時 // 親機の時のみ if (Constants.LINE_RECEIVER_SIDE == false) { // 対象の部屋(グループ)へメッセージをコピー cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_BoSignal, signalRoomName, newMsg); } // シグナル解析 SignalOrder sig = HighLowControl.AnalysisWord(signalRoomName, newMsg); // 指標の高い重要度の時間帯でないか\ // 又は、指定した時間帯 //if (!InvC.JudgeEnvironmentSignalZone(ref sig, ref cLINE)) //sig.Environment = EnvState.esTest; // 無条件デモ HighLowControl.JudgeRealDemo(ref sig); // エントリー結果 bool entryResult = false; if (sig.Environment.Equals(EnvState.esReal)) { // リアルトレード entryResult = cHighLow_Real.EntryHighLow(ref sig); } else { // デモトレード entryResult = cHighLow_Demo.EntryHighLow(ref sig); } // 結果をラインに表示 if (entryResult) { //成功時 cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_CmdLine, signalRoomName, "エントリーに成功。" + Constants.LINE_CRLF + sig.getEntryNoticeMsg()); // シグナル履歴にストック BoHistroyContainer boc = new BoHistroyContainer(HistoryState.hsWaitResult, sig); HL_History.Add(boc); } else { CommonControl.DebugPrint("エントリーに失敗。" + sig.rawOriginalMessage); // デバッグ用 //cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_CmdLine, signalRoomName, "エントリーに失敗。" + sig.rawOriginalMessage); } // 待機に戻る } else { // バイナリー配信ではなくて、命令の時 ステータスにセット if (signalRoomName.Equals(Constants.ROOM_NAME_CmdLine)) // 命令は指定のルームからのメッセージのみ受け取る { // 命令の抽出 string comResult = CommandProc(newMsg, userCommandStatus, out userCommandStatus); // エラーがあった場合 if (comResult.Length != 0) { cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_CmdLine, "", comResult); } // 命令実行 TODO:今は仮 if (userCommandStatus.IndexOf("end") >= 0) // 終了時 { cLINE.putSignalMsgToRoom(Constants.ROOM_NAME_CmdLine, signalRoomName, "プログラムを終了します。" + newMsg); break; } } } // 1通り終了時 定期的に行う処理 finallyProcess: // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // 溜まったタスクを消化 // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- System.Windows.Forms.Application.DoEvents(); ClickActionTrigger += 1; // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // 結果を見に行き、新着があればそれを部屋に出力 // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- cHighLow_Real.getSignalResult(ref HL_History); // 本トレ cHighLow_Demo.getSignalResult(ref HL_History); // デモ それぞれに見に行く for (int i = 0; i < HL_History.Count; i++) { if (HL_History[i].State == HistoryState.hsDone) { continue; // 全て完了済みのものは飛ばす } bool ret = false; HL_History[i].PostResultData = CommonControl.PostBoResult(HL_History[i]); // Google送信 // postデータが作られていたら成功 HL_History[i].State = string.IsNullOrEmpty(HL_History[i].PostResultData) ? HL_History[i].State : HistoryState.hsPostDataComplete; // 成功したかどうか ret = CommonControl.OutPutTextBoResult(HL_History[i]); // テキスト吐き出し // テキスト掃き出しできたらすべて完了 HL_History[i].State = ret ? HistoryState.hsDone : HL_History[i].State; } // TODO: コンプリートしたBOコンテナ要素はここで削除しても良いかも // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // 2minに一回何らかのアクションを起こしてメッセージの受信頻度を上げる // スリープ(LINE受信しなくなる)対策 // ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- if (ClickActionTrigger % 2 == 0) { CommonControl.ClickAction(); ClickActionTrigger = 0; // 受信が行われるようにActiveWindowsの切り替えを行う //TODO:実験成功? 画面のライトがONOFFしなくても受信できるかチェックする SendKeys.SendWait("%{TAB}"); CommonControl.SleepWait(500); SendKeys.SendWait("%{TAB}"); // ネットワークが切れていれば 再ログイン 効果未確認 cHighLow_Real.RetryLogin(); } // debug用 //break; } // main end // ハイローログアウト //cHighLow_Demo.Logout(); //cHighLow_Real.Logout(); chrome.Quit(); } catch (Exception e) { // 想定外エラー発生時 // 原因調査用 CommonControl.DebugPrint(e, "Main Exception"); } finally { CommonControl.DebugPrint("プログラムを終了しました"); } }
private string CHROME_HANDLE_HIGH_LOW_ME; // 自身に切り替えるためのハンドラ /// <summary> /// コンストラクタ /// </summary> /// <param name="chrome"></param> public HighLowControl(ref ChromeDriverEx chrome) { this.chrome = chrome; }
/// <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); }
/// <summary> /// ターゲット要素が出現するまで待機する /// XPath /// </summary> /// <param name="chrome">対象ドライバ</param> /// <param name="XPath">対象要素</param> public static Boolean WaitElementArrivalByXPath(ChromeDriverEx chrome, String XPath) { //対象のXパスの要素が現れるまで待つ return(WaitElementArrivalBy(chrome, By.XPath(XPath))); }
/// <summary> /// ターゲット要素が出現するまで待機する /// </summary> /// <param name="chrome">対象ドライバ</param> /// <param name="elementId">対象要素</param> public static Boolean WaitElementArrivalById(ChromeDriverEx chrome, String elementId) { return(WaitElementArrivalBy(chrome, By.Id(elementId))); }
///// <summary>新着を受けたルーム名</summary> //public string NewArraivalRoomName //{ // get { return NewArraivalRoomName; } // private set { NewArraivalRoomName = value; } //} /// <summary> /// コンストラクタ /// </summary> /// <param name="chromeDriver"></param> public LINEControl(ref ChromeDriverEx chromeDriver) { this.chrome = chromeDriver; }