您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

218 行
8.3KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using OpenQA.Selenium;
  6. using OpenQA.Selenium.Chrome;
  7. using CSVDownloader.Code;
  8. using CSVDownloader.Store.CreditCSVData;
  9. using ExpectedConditions = OpenQA.Selenium.Support.UI.ExpectedConditions;
  10. namespace CSVDownloader.Web {
  11. class HelloTechnoController : WebController {
  12. private readonly String url_ = "https://skysun.crepass.net/40599/hello-techno/index.php";
  13. private List<CreditCSVData> csv_data_list_ = new List<CreditCSVData>();
  14. private enum XpathKey {
  15. INPUT_LOGIN_USERNAME,
  16. INPUT_LOGIN_PASSWORD,
  17. BUTTON_CREDIT_KESSAI,
  18. RADIO_TARGET_SPAN,
  19. SELECT_TARGET_FROM_YYYYMM,
  20. SELECT_TARGET_FROM_DD,
  21. SELECT_TARGET_TO_YYYYMM,
  22. SELECT_TARGET_TO_DD,
  23. BUTTON_CONFIRM_CSV,
  24. TABLE_CSV,
  25. PAGER,
  26. BUTTON_LOGOUT,
  27. };
  28. private IDictionary<XpathKey, string> xpath_map_ = new Dictionary<XpathKey, string>()
  29. {
  30. {XpathKey.INPUT_LOGIN_USERNAME,@"//*[@id='accountId']"},
  31. {XpathKey.INPUT_LOGIN_PASSWORD,@"//*[@id='myPassword']"},
  32. {XpathKey.BUTTON_CREDIT_KESSAI,@"//*[@id='history']/a"},
  33. {XpathKey.RADIO_TARGET_SPAN,@"//select[@name='yyyymm_s']/preceding-sibling::input[@name='term_type']"},
  34. {XpathKey.SELECT_TARGET_FROM_YYYYMM,$"//select[@name='yyyymm_s']" },
  35. {XpathKey.SELECT_TARGET_FROM_DD,$"//select[@name='dd_s']" },
  36. {XpathKey.SELECT_TARGET_TO_YYYYMM,$"//select[@name='yyyymm_e']" },
  37. {XpathKey.SELECT_TARGET_TO_DD,$"//select[@name='dd_e']" },
  38. {XpathKey.BUTTON_CONFIRM_CSV,$"//*[@id='mag_top3']/table/tbody/tr/td[1]/input" },
  39. {XpathKey.TABLE_CSV,$"/html/body/div[1]/div[5]/table[2]" },
  40. {XpathKey.PAGER,$"/html/body/div[1]/div[7]/p[1]" },
  41. {XpathKey.BUTTON_LOGOUT,$"//*[@id='log_out']/a/img" },
  42. };
  43. public HelloTechnoController(ChromeDriver driver) : base(driver) {
  44. agent_ = CreditAgent.HT;
  45. }
  46. public override ResultCode Login(LoginInfo info) {
  47. bool enter = true;
  48. try {
  49. driver_.Navigate().GoToUrl(url_);
  50. Send(xpath_map_[XpathKey.INPUT_LOGIN_USERNAME], info.user_name);
  51. Send(xpath_map_[XpathKey.INPUT_LOGIN_PASSWORD], info.password, enter);
  52. // ログイン後の明細データダウンロードが表示されることを確認する。
  53. wait_.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI])));
  54. } catch (Exception e) {
  55. logger_.Error(e.Message);
  56. return ResultCode.NG;
  57. }
  58. return ResultCode.OK;
  59. }
  60. public override ResultCode Download(DateTime from, DateTime to) {
  61. csv_data_list_.Clear();
  62. // クレジットカード承認結果一覧画面に移行
  63. Click(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI]);
  64. // 承認処理日のFrom-Toを入力
  65. Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_YYYYMM], from.ToString("yyyyMM"));
  66. Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_DD], from.ToString("dd"));
  67. Select(xpath_map_[XpathKey.SELECT_TARGET_TO_YYYYMM], to.ToString("yyyyMM"));
  68. Select(xpath_map_[XpathKey.SELECT_TARGET_TO_DD], to.ToString("dd"));
  69. // 各種ラジオチェックを入力
  70. Click(xpath_map_[XpathKey.RADIO_TARGET_SPAN]);
  71. // 条件確定
  72. Click(xpath_map_[XpathKey.BUTTON_CONFIRM_CSV]);
  73. GetAllData();
  74. return ResultCode.OK;
  75. }
  76. public override ResultCode Logout() {
  77. try {
  78. Click(xpath_map_[XpathKey.BUTTON_LOGOUT]);
  79. } catch (Exception e) {
  80. logger_.Error(e.Message);
  81. return ResultCode.NG;
  82. }
  83. return ResultCode.OK;
  84. }
  85. public override List<CreditCSVData> GetCreditCSVDataList() {
  86. return csv_data_list_;
  87. }
  88. private void GetAllData() {
  89. int page = 1;
  90. bool failed_flg = false;
  91. var failed_parking_name_hs_table = new HashSet<String>();
  92. while (true) {
  93. // TABLEからデータを取得する。
  94. var table = wait_.Until(ExpectedConditions.ElementIsVisible(By.XPath(xpath_map_[XpathKey.TABLE_CSV])));
  95. var tag_tr = table.FindElements(By.TagName("tr"));
  96. // ヘッダー行はスキップしたうえで進める。
  97. for (var i = 1; i < tag_tr.Count; i++) {
  98. var tag_td = tag_tr[i].FindElements(By.TagName("td"));
  99. if (tag_td.Count != 999) {
  100. //throw new Exception("想定外の行構成");
  101. }
  102. var parking_name = tag_td[(int)CreditCSVDataHelloTechno.ColName.ParkingCode].Text;
  103. try {
  104. var data = new CreditCSVDataHelloTechno() {
  105. spot_id = GetSpotID(parking_name),
  106. register_datetime = DateTime.Parse(tag_td[(int)CreditCSVDataHelloTechno.ColName.RegisterDatetime].Text),
  107. user_code = tag_td[(int)CreditCSVDataHelloTechno.ColName.UserCode].Text,
  108. parking_code = parking_name,
  109. device_no = tag_td[(int)CreditCSVDataHelloTechno.ColName.DeviceNo].Text,
  110. adjust_no = tag_td[(int)CreditCSVDataHelloTechno.ColName.AdjustNo].Text,
  111. trade = tag_td[(int)CreditCSVDataHelloTechno.ColName.Trade].Text,
  112. amount = int.Parse(tag_td[(int)CreditCSVDataHelloTechno.ColName.Amount].Text.Replace(",", "")),
  113. card_company_name = tag_td[(int)CreditCSVDataHelloTechno.ColName.CardCompanyName].Text,
  114. approval_no = tag_td[(int)CreditCSVDataHelloTechno.ColName.ApprovalNo].Text,
  115. response_no = tag_td[(int)CreditCSVDataHelloTechno.ColName.ResponseNo].Text,
  116. error = tag_td[(int)CreditCSVDataHelloTechno.ColName.Error].Text,
  117. };
  118. var cancel_date = tag_td[(int)CreditCSVDataHelloTechno.ColName.CancelDate].Text;
  119. if (cancel_date.Length != 0) {
  120. data.cancel_date = DateTime.Parse(cancel_date);
  121. }
  122. // リストに挿入する。
  123. csv_data_list_.Add(data);
  124. } catch (ArgumentException) {
  125. failed_parking_name_hs_table.Add(parking_name);
  126. failed_flg = true;
  127. continue;
  128. }
  129. }
  130. // ページ操作
  131. // 戻ると進むのボタンの組み合わせで操作を行う。
  132. var pager = driver_.FindElementByXPath(xpath_map_[XpathKey.PAGER]);
  133. var tag_a = pager.FindElements(By.TagName("a"));
  134. if (page == 1 && tag_a.Count == 1) {
  135. // 最初のページで次のボタン
  136. Click(tag_a[0]);
  137. page++;
  138. } else if (page != 1 && tag_a.Count == 2) {
  139. // 戻ると進むのボタンを検出
  140. Click(tag_a[1]);
  141. page++;
  142. } else if (page != 1 && tag_a.Count == 1) {
  143. // 最終ページを検出
  144. break;
  145. } else if (page == 1 && tag_a.Count == 0) {
  146. // 1ページのみ
  147. break;
  148. } else {
  149. // 想定外のパターン
  150. throw new Exception("ページング不正検出");
  151. }
  152. }
  153. if (failed_flg) {
  154. logger_.Error("失敗駐車場名");
  155. foreach (var ele in failed_parking_name_hs_table) {
  156. logger_.Error($"駐車場 \"{ele}\"");
  157. }
  158. throw new Exception("データ作成失敗");
  159. }
  160. }
  161. }
  162. }