Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

226 rindas
8.7KB

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