/// <summary> /// ハイローからログアウトする /// </summary> /// <returns></returns> public void Logout() { try { IsActivate(); IWebElement eleLogoutBtn = CommonDriverControl.GetSafeWebElementById(this.chrome, "Logout"); eleLogoutBtn.Click(); } catch (Exception) { // 投げない //throw; } }
/// <summary> /// ラインにログインする /// </summary> public void LoginLINE(String address, String passWord) { try { this.chrome.Url = Constants.URL_LINE_Index; // TODO:空白ぺージを完全と誤って判断している? 読み込み待ち用 chrome.WaitCompleteDelay(1000); // ラインのハンドルをキープ Constants.CHROME_HANDLE_LINE = chrome.CurrentWindowHandle; // アドレス 一回入力すれば、プロファイルから省略可 //IWebElement eleAdrs = this.chrome.FindElementById("line_login_email"); //eleAdrs.SendKeys(address); // パス IWebElement eleLoginPwd = CommonDriverControl.GetSafeWebElementById(this.chrome, "line_login_pwd"); eleLoginPwd.SendKeys(passWord); Thread.Sleep(500); // ログイン IWebElement eleLoginBtn = CommonDriverControl.GetSafeWebElementById(this.chrome, "login_btn"); eleLoginBtn.Click(); // 部屋名が現れるまで待つ CommonControl.SleepWait(1000); CommonDriverControl.WaitElementArrivalById(this.chrome, Constants.HTML_ID_LINE_ChatRoomDivId); // TODO:LINEの読み込み処理を完全に待つ方法がわからない this.chrome.WaitCompleteDelay(2000); // 部屋リストを最後までスクロールして部屋名リストを全部読みこむ ChatRoomListScrollEnd(); CommonControl.SleepWait(300); ChatRoomListScrollTop(); CommonControl.SleepWait(500); } catch (Exception e) { throw e; } }
/// <summary> /// 【正規版】本番にログインを行う /// </summary> public void Login() { try { //// ログインボタンを押す IWebElement loginBtn = CommonDriverControl.GetSafeWebElementByXPath( this.chrome, "//*[@id='header']/div/div/div/div/div/span/span/a[2]"); loginBtn.Click(); // ログイン後、ロードが走る場合があるのでそれを考慮 CommonControl.SleepWait(2000); // ログインID IWebElement eleLoginId = CommonDriverControl. GetSafeWebElementById(this.chrome, "login-username"); eleLoginId.SendKeys(Constants.Login_HL_ID); CommonControl.SleepWait(500); // ログインパスワード IWebElement eleLoginPassWord = CommonDriverControl. GetSafeWebElementById(this.chrome, "login-password"); eleLoginPassWord.SendKeys(Constants.Login_HL_PassWord); CommonControl.SleepWait(500); // なんかログインボタンがうまく取れないのでエンターで代用 eleLoginPassWord.SendKeys("\r\n"); //// ログインボタン 押下 //IWebElement eleLoginTriggerBtn = CommonDriverControl. // GetSafeWebElementByXPath(this.chrome, "//*[@id='signin - popup']/div[1]/div/div[2]/div[1]/form/div/div[6]"); //eleLoginTriggerBtn.Click(); } catch (Exception e) { // 何らかの原因でログインに失敗した CommonControl.DebugPrint(e, "HighLow Login"); throw; } }
/// <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); } }