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

242 行
9.1KB

  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.Store.QRCSVData;
  10. using ExpectedConditions = OpenQA.Selenium.Support.UI.ExpectedConditions;
  11. namespace CSVDownloader.Web {
  12. class DaitoController : WebController {
  13. private readonly String url_ = "https://crevation.net";
  14. private readonly String home_url_ = "https://crevation.net/";
  15. private readonly String filename_credit = "daito_credit.csv";
  16. private readonly String filename_qr = "daito_qr.csv";
  17. private enum XpathKey {
  18. INPUT_LOGIN_USERNAME,
  19. INPUT_LOGIN_PASSWORD,
  20. BUTTON_MENU,
  21. BUTTON_KESSAI_KANRI,
  22. BUTTON_CREDIT_KESSAI,
  23. BUTTON_QR_KESSAI,
  24. INPUT_TARGET_FROM,
  25. INPUT_TARGET_TO,
  26. BUTTON_DOWNLOAD_CSV,
  27. BUTTON_LOGOUT,
  28. };
  29. private IDictionary<XpathKey, string> xpath_map_ = new Dictionary<XpathKey, string>()
  30. {
  31. {XpathKey.INPUT_LOGIN_USERNAME,@"//*[@id='wrapper']/div/div/div/div/div[2]/form/fieldset/div[1]/input" },
  32. {XpathKey.INPUT_LOGIN_PASSWORD,@"//*[@id='wrapper']/div/div/div/div/div[2]/form/fieldset/div[2]/input" },
  33. {XpathKey.BUTTON_MENU,@"//*[@id='js-show-popup']" },
  34. {XpathKey.BUTTON_KESSAI_KANRI,@"//*[@id='side-menu']/li[4]/a" },
  35. {XpathKey.BUTTON_CREDIT_KESSAI,@"//*[@id='side-menu']/li[4]/ul/li[1]/a" },
  36. {XpathKey.BUTTON_QR_KESSAI,@"//*[@id='side-menu']/li[4]/ul/li[2]/a" },
  37. {XpathKey.INPUT_TARGET_FROM,@"//*[@id='settlementTimeFrom']" },
  38. {XpathKey.INPUT_TARGET_TO,@"//*[@id='settlementTimeTo']" },
  39. {XpathKey.BUTTON_DOWNLOAD_CSV,@"//*[@id='submitCreateCsv']" },
  40. {XpathKey.BUTTON_LOGOUT,@"//*[@id='side-menu']/li[11]/a" },
  41. };
  42. public DaitoController(ChromeDriver driver) : base(driver) {
  43. agent_ = CreditAgent.Daito;
  44. }
  45. public override ResultCode Login(LoginInfo info) {
  46. bool enter = true;
  47. try {
  48. driver_.Navigate().GoToUrl(url_);
  49. Send(xpath_map_[XpathKey.INPUT_LOGIN_USERNAME], info.user_name);
  50. Send(xpath_map_[XpathKey.INPUT_LOGIN_PASSWORD], info.password, enter);
  51. // ログイン後のメニューボタンが表示されることを確認する。
  52. wait_.Until(ExpectedConditions.ElementExists(By.XPath(xpath_map_[XpathKey.BUTTON_MENU])));
  53. } catch (Exception e) {
  54. logger_.Error(e.Message);
  55. return ResultCode.NG;
  56. }
  57. return ResultCode.OK;
  58. }
  59. public override ResultCode Download(DateTime from, DateTime to) {
  60. // クレジットカード承認結果一覧画面に移行
  61. Click(xpath_map_[XpathKey.BUTTON_MENU]);
  62. Click(xpath_map_[XpathKey.BUTTON_KESSAI_KANRI]);
  63. Click(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI]);
  64. // 承認処理日のFrom-Toを入力
  65. const String date_format = "yyyy年MM月dd日";
  66. Send(xpath_map_[XpathKey.INPUT_TARGET_FROM], from.ToString(date_format));
  67. Send(xpath_map_[XpathKey.INPUT_TARGET_TO], to.ToString(date_format));
  68. // CSV吐き出しボタンをクリックし、CSVをダウンロード
  69. wait_.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpath_map_[XpathKey.BUTTON_DOWNLOAD_CSV])));
  70. Click(xpath_map_[XpathKey.BUTTON_DOWNLOAD_CSV]);
  71. WaitForDownload(filename_credit);
  72. // QR決済結果結果一覧画面に移行
  73. Click(xpath_map_[XpathKey.BUTTON_MENU]);
  74. Click(xpath_map_[XpathKey.BUTTON_KESSAI_KANRI]);
  75. Click(xpath_map_[XpathKey.BUTTON_QR_KESSAI]);
  76. // 承認処理日のFrom-Toを入力
  77. Send(xpath_map_[XpathKey.INPUT_TARGET_FROM], from.ToString(date_format));
  78. Send(xpath_map_[XpathKey.INPUT_TARGET_TO], to.ToString(date_format));
  79. // CSV吐き出しボタンをクリックし、CSVをダウンロード
  80. wait_.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpath_map_[XpathKey.BUTTON_DOWNLOAD_CSV])));
  81. Click(xpath_map_[XpathKey.BUTTON_DOWNLOAD_CSV]);
  82. WaitForDownload(filename_qr);
  83. return ResultCode.OK;
  84. }
  85. public override ResultCode Logout() {
  86. driver_.Navigate().GoToUrl(home_url_);
  87. Click(xpath_map_[XpathKey.BUTTON_MENU]);
  88. Click(xpath_map_[XpathKey.BUTTON_LOGOUT]);
  89. wait_.Until(ExpectedConditions.ElementIsVisible(By.XPath(xpath_map_[XpathKey.INPUT_LOGIN_USERNAME])));
  90. return ResultCode.OK;
  91. }
  92. public override List<CreditCSVData> GetCreditCSVDataList() {
  93. var result_list = new List<CreditCSVData>();
  94. var list = GetFileContents(filename_credit);
  95. bool failed_flg = false;
  96. var failed_parking_name_hs_table = new HashSet<String>();
  97. foreach (var line in list) {
  98. var parking_name = line[(int)CreditCSVDataDaito.ColName.ParkingName];
  99. try {
  100. result_list.Add(new CreditCSVDataDaito() {
  101. spot_id = GetSpotID(parking_name),
  102. parking_name = parking_name,
  103. developer = line[(int)CreditCSVDataDaito.ColName.Developer],
  104. adjust_type = line[(int)CreditCSVDataDaito.ColName.AdjustType],
  105. fee_type = line[(int)CreditCSVDataDaito.ColName.FeeType],
  106. reception_datetime = DateTime.Parse(line[(int)CreditCSVDataDaito.ColName.ReceptionDatetime]),
  107. amount = int.Parse(line[(int)CreditCSVDataDaito.ColName.Amount]),
  108. reception_no = line[(int)CreditCSVDataDaito.ColName.ReceptionNo],
  109. response_no = line[(int)CreditCSVDataDaito.ColName.ResponseNo],
  110. error_code1 = line[(int)CreditCSVDataDaito.ColName.ErrorCode1],
  111. error_code2 = line[(int)CreditCSVDataDaito.ColName.ErrorCode2]
  112. });
  113. } catch (ArgumentException) {
  114. failed_parking_name_hs_table.Add(parking_name);
  115. failed_flg = true;
  116. continue;
  117. }
  118. }
  119. if (failed_flg) {
  120. logger_.Error("失敗駐車場名");
  121. foreach (var ele in failed_parking_name_hs_table) {
  122. logger_.Error($"駐車場 \"{ele}\"");
  123. }
  124. throw new Exception("データ作成失敗");
  125. }
  126. return result_list;
  127. }
  128. public override List<QRCSVData> GetQRCSVDataList() {
  129. var result_list = new List<QRCSVData>();
  130. var list = GetFileContents(filename_qr);
  131. bool failed_flg = false;
  132. var failed_parking_name_hs_table = new HashSet<String>();
  133. foreach (var line in list) {
  134. var parking_name = line[(int)QRCSVDataDaito.ColName.ParkingName];
  135. try {
  136. result_list.Add(new QRCSVDataDaito() {
  137. spot_id = GetSpotID(parking_name),
  138. parking_name = parking_name,
  139. developer = line[(int)QRCSVDataDaito.ColName.Developer],
  140. reception_datetime = DateTime.Parse(line[(int)QRCSVDataDaito.ColName.ReceptionDatetime]),
  141. company = line[(int)QRCSVDataDaito.ColName.Company],
  142. amount = int.Parse(line[(int)QRCSVDataDaito.ColName.Amount]),
  143. adjust_no = line[(int)QRCSVDataDaito.ColName.AdjustNo],
  144. error_code = line[(int)QRCSVDataDaito.ColName.ErrorCode],
  145. });
  146. } catch (ArgumentException) {
  147. failed_parking_name_hs_table.Add(parking_name);
  148. failed_flg = true;
  149. continue;
  150. }
  151. }
  152. if (failed_flg) {
  153. logger_.Error("失敗駐車場名");
  154. foreach (var ele in failed_parking_name_hs_table) {
  155. logger_.Error($"駐車場 \"{ele}\"");
  156. }
  157. throw new Exception("データ作成失敗");
  158. }
  159. return result_list;
  160. }
  161. private List<String[]> GetFileContents(String filename) {
  162. var list = new List<String[]>();
  163. var dir = new DirectoryInfo(DriverFactory.GetDownloadDir());
  164. var config = new CSVConfig() {
  165. header = true,
  166. };
  167. config.remove_char.Add("\"");
  168. var sjis_enc = Encoding.GetEncoding("Shift-JIS");
  169. foreach (var file in dir.GetFiles()) {
  170. if (file.Name.Contains(filename)) {
  171. var result = ReadCsv(file.FullName, config, sjis_enc);
  172. list.AddRange(result);
  173. }
  174. }
  175. return list;
  176. }
  177. }
  178. }