using System; using System.Collections.Generic; using System.IO; using System.Text; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using CSVDownloader.Code; using CSVDownloader.Store.CreditCSVData; using ExpectedConditions = OpenQA.Selenium.Support.UI.ExpectedConditions; namespace CSVDownloader.Web { class HelloTechnoController : WebController { private readonly String url_ = "https://skysun.crepass.net/40599/hello-techno/index.php"; private List csv_data_list_ = new List(); private enum XpathKey { INPUT_LOGIN_USERNAME, INPUT_LOGIN_PASSWORD, BUTTON_CREDIT_KESSAI, RADIO_TARGET_SPAN, SELECT_TARGET_FROM_YYYYMM, SELECT_TARGET_FROM_DD, SELECT_TARGET_TO_YYYYMM, SELECT_TARGET_TO_DD, BUTTON_CONFIRM_CSV, TABLE_CSV, PAGER, BUTTON_LOGOUT, }; private IDictionary xpath_map_ = new Dictionary() { {XpathKey.INPUT_LOGIN_USERNAME,@"//*[@id='accountId']"}, {XpathKey.INPUT_LOGIN_PASSWORD,@"//*[@id='myPassword']"}, {XpathKey.BUTTON_CREDIT_KESSAI,@"//*[@id='history']/a"}, {XpathKey.RADIO_TARGET_SPAN,@"//select[@name='yyyymm_s']/preceding-sibling::input[@name='term_type']"}, {XpathKey.SELECT_TARGET_FROM_YYYYMM,$"//select[@name='yyyymm_s']" }, {XpathKey.SELECT_TARGET_FROM_DD,$"//select[@name='dd_s']" }, {XpathKey.SELECT_TARGET_TO_YYYYMM,$"//select[@name='yyyymm_e']" }, {XpathKey.SELECT_TARGET_TO_DD,$"//select[@name='dd_e']" }, {XpathKey.BUTTON_CONFIRM_CSV,$"//*[@id='mag_top3']/table/tbody/tr/td[1]/input" }, {XpathKey.TABLE_CSV,$"/html/body/div[1]/div[5]/table[2]" }, {XpathKey.PAGER,$"/html/body/div[1]/div[7]/p[1]" }, {XpathKey.BUTTON_LOGOUT,$"//*[@id='log_out']/a/img" }, }; public HelloTechnoController(ChromeDriver driver) : base(driver) { agent_ = CreditAgent.HT; } public override ResultCode Login(LoginInfo info) { bool enter = true; try { driver_.Navigate().GoToUrl(url_); Send(xpath_map_[XpathKey.INPUT_LOGIN_USERNAME], info.user_name); Send(xpath_map_[XpathKey.INPUT_LOGIN_PASSWORD], info.password, enter); // ログイン後の明細データダウンロードが表示されることを確認する。 wait_.Until(ExpectedConditions.ElementToBeClickable(By.XPath(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI]))); } catch (Exception e) { logger_.Error(e.Message); return ResultCode.NG; } return ResultCode.OK; } public override ResultCode Download(DateTime from, DateTime to) { csv_data_list_.Clear(); // クレジットカード承認結果一覧画面に移行 Click(xpath_map_[XpathKey.BUTTON_CREDIT_KESSAI]); // 承認処理日のFrom-Toを入力 Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_YYYYMM], from.ToString("yyyyMM")); Select(xpath_map_[XpathKey.SELECT_TARGET_FROM_DD], from.ToString("dd")); Select(xpath_map_[XpathKey.SELECT_TARGET_TO_YYYYMM], to.ToString("yyyyMM")); Select(xpath_map_[XpathKey.SELECT_TARGET_TO_DD], to.ToString("dd")); // 各種ラジオチェックを入力 Click(xpath_map_[XpathKey.RADIO_TARGET_SPAN]); // 条件確定 Click(xpath_map_[XpathKey.BUTTON_CONFIRM_CSV]); GetAllData(); return ResultCode.OK; } public override ResultCode Logout() { try { Click(xpath_map_[XpathKey.BUTTON_LOGOUT]); } catch (Exception e) { logger_.Error(e.Message); return ResultCode.NG; } return ResultCode.OK; } public override List GetCreditCSVDataList() { return csv_data_list_; } private void GetAllData() { int page = 1; while (true) { // TABLEからデータを取得する。 var table = wait_.Until(ExpectedConditions.ElementIsVisible(By.XPath(xpath_map_[XpathKey.TABLE_CSV]))); var tag_tr = table.FindElements(By.TagName("tr")); // ヘッダー行はスキップしたうえで進める。 for (var i = 1; i < tag_tr.Count; i++) { var tag_td = tag_tr[i].FindElements(By.TagName("td")); if (tag_td.Count != 999) { //throw new Exception("想定外の行構成"); } var data = new CSVDataHelloTechno() { spot_id = GetSpotID(tag_td[(int)CSVDataHelloTechno.ColName.ParkingCode].Text), register_datetime = DateTime.Parse(tag_td[(int)CSVDataHelloTechno.ColName.RegisterDatetime].Text), user_code = tag_td[(int)CSVDataHelloTechno.ColName.UserCode].Text, parking_code = tag_td[(int)CSVDataHelloTechno.ColName.ParkingCode].Text, device_no = tag_td[(int)CSVDataHelloTechno.ColName.DeviceNo].Text, adjust_no = tag_td[(int)CSVDataHelloTechno.ColName.AdjustNo].Text, trade = tag_td[(int)CSVDataHelloTechno.ColName.Trade].Text, amount = int.Parse(tag_td[(int)CSVDataHelloTechno.ColName.Amount].Text.Replace(",", "")), card_company_name = tag_td[(int)CSVDataHelloTechno.ColName.CardCompanyName].Text, approval_no = tag_td[(int)CSVDataHelloTechno.ColName.ApprovalNo].Text, response_no = tag_td[(int)CSVDataHelloTechno.ColName.ResponseNo].Text, error = tag_td[(int)CSVDataHelloTechno.ColName.Error].Text, }; var cancel_date = tag_td[(int)CSVDataHelloTechno.ColName.CancelDate].Text; if (cancel_date.Length != 0) { data.cancel_date = DateTime.Parse(cancel_date); } csv_data_list_.Add(data); } // リストに挿入する。 // ページ操作 // 戻ると進むのボタンの組み合わせで操作を行う。 var pager = driver_.FindElementByXPath(xpath_map_[XpathKey.PAGER]); var tag_a = pager.FindElements(By.TagName("a")); if (page == 1 && tag_a.Count == 1) { // 最初のページで次のボタン Click(tag_a[0]); page++; } else if (page != 1 && tag_a.Count == 2) { // 戻ると進むのボタンを検出 Click(tag_a[1]); page++; } else if (page != 1 && tag_a.Count == 1) { // 最終ページを検出 break; } else if (page == 1 && tag_a.Count == 0) { // 1ページのみ break; } else { // 想定外のパターン throw new Exception("ページング不正検出"); } } } } }