Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

191 linhas
7.4KB

  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. while (true) {
  91. // TABLEからデータを取得する。
  92. var table = wait_.Until(ExpectedConditions.ElementIsVisible(By.XPath(xpath_map_[XpathKey.TABLE_CSV])));
  93. var tag_tr = table.FindElements(By.TagName("tr"));
  94. // ヘッダー行はスキップしたうえで進める。
  95. for (var i = 1; i < tag_tr.Count; i++) {
  96. var tag_td = tag_tr[i].FindElements(By.TagName("td"));
  97. if (tag_td.Count != 999) {
  98. //throw new Exception("想定外の行構成");
  99. }
  100. var data = new CSVDataHelloTechno() {
  101. spot_id = GetSpotID(tag_td[(int)CSVDataHelloTechno.ColName.ParkingCode].Text),
  102. register_datetime = DateTime.Parse(tag_td[(int)CSVDataHelloTechno.ColName.RegisterDatetime].Text),
  103. user_code = tag_td[(int)CSVDataHelloTechno.ColName.UserCode].Text,
  104. parking_code = tag_td[(int)CSVDataHelloTechno.ColName.ParkingCode].Text,
  105. device_no = tag_td[(int)CSVDataHelloTechno.ColName.DeviceNo].Text,
  106. adjust_no = tag_td[(int)CSVDataHelloTechno.ColName.AdjustNo].Text,
  107. trade = tag_td[(int)CSVDataHelloTechno.ColName.Trade].Text,
  108. amount = int.Parse(tag_td[(int)CSVDataHelloTechno.ColName.Amount].Text.Replace(",", "")),
  109. card_company_name = tag_td[(int)CSVDataHelloTechno.ColName.CardCompanyName].Text,
  110. approval_no = tag_td[(int)CSVDataHelloTechno.ColName.ApprovalNo].Text,
  111. response_no = tag_td[(int)CSVDataHelloTechno.ColName.ResponseNo].Text,
  112. error = tag_td[(int)CSVDataHelloTechno.ColName.Error].Text,
  113. };
  114. var cancel_date = tag_td[(int)CSVDataHelloTechno.ColName.CancelDate].Text;
  115. if (cancel_date.Length != 0) {
  116. data.cancel_date = DateTime.Parse(cancel_date);
  117. }
  118. csv_data_list_.Add(data);
  119. }
  120. // リストに挿入する。
  121. // ページ操作
  122. // 戻ると進むのボタンの組み合わせで操作を行う。
  123. var pager = driver_.FindElementByXPath(xpath_map_[XpathKey.PAGER]);
  124. var tag_a = pager.FindElements(By.TagName("a"));
  125. if (page == 1 && tag_a.Count == 1) {
  126. // 最初のページで次のボタン
  127. Click(tag_a[0]);
  128. page++;
  129. } else if (page != 1 && tag_a.Count == 2) {
  130. // 戻ると進むのボタンを検出
  131. Click(tag_a[1]);
  132. page++;
  133. } else if (page != 1 && tag_a.Count == 1) {
  134. // 最終ページを検出
  135. break;
  136. } else if (page == 1 && tag_a.Count == 0) {
  137. // 1ページのみ
  138. break;
  139. } else {
  140. // 想定外のパターン
  141. throw new Exception("ページング不正検出");
  142. }
  143. }
  144. }
  145. }
  146. }