Advertisement
Guest User

Untitled

a guest
Sep 20th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.98 KB | None | 0 0
  1. main.rb
  2. require 'watir'
  3. require 'nokogiri'
  4. require 'pry'
  5. require_relative 'transaction'
  6.  
  7. class Moldindconbank
  8.  
  9. attr_reader :browser
  10.  
  11. def initialize
  12. @browser = Watir::Browser.new(:chrome)
  13. end
  14.  
  15. def collect_data
  16. log_in
  17. result = {accounts: parse_accounts[0].merge!(transactions: parse_transactions)}
  18. log_out
  19.  
  20. result
  21. end
  22.  
  23. private
  24.  
  25. def log_in
  26. browser.goto("https://wb.micb.md/")
  27. puts "Write your Username: "
  28. browser.text_field(class: "username").set(gets.chomp)
  29. puts "Write your Password: "
  30. browser.text_field(id: "password").set(gets.chomp)
  31. browser.button(class: "wb-button").click
  32. raise "Invalid Username or Password" if browser.div(class: %w(page-message error)).present?
  33. wait_until { browser.div(class: "contract-cards").present? }
  34. end
  35.  
  36. def parse_accounts
  37. accounts_div = browser.divs(class: %w(contract status-active))
  38.  
  39. accounts_div.map do |element|
  40. element.div(class: "contract-cards").a.click
  41. wait_until { browser.a(href: "#contract-information").present? }
  42.  
  43. browser.a(href: "#contract-information").click
  44. wait_until { browser.div(id: "contract-information").present? }
  45.  
  46. parse_account(Nokogiri::HTML(browser.div(id: "contract-information").html))
  47. end
  48. end
  49.  
  50. def parse_account(html)
  51. {
  52. name: html.css('tr')[-3].css('td')[1].text,
  53. balance: html.css('tr')[-1].css('td')[1].css('span')[0].text.gsub(",",".").to_f,
  54. currency: html.css('tr')[-1].css('td')[1].css('span')[1].text,
  55. description: html.css('tr')[3].css('td')[1].text.gsub("2. De baza - ","")
  56. }
  57. end
  58.  
  59. def go_to_transactions_info
  60. browser.link(href: "#contract-history").click
  61. wait_until { browser.text_field(class: %w(filter-date from maxDateToday hasDatepicker)).present? }
  62.  
  63. browser.text_field(class: %w(filter-date from maxDateToday hasDatepicker)).click
  64. wait_until { browser.link(class: %w(ui-datepicker-prev ui-corner-all)).present? }
  65.  
  66. browser.link(class: %w(ui-datepicker-prev ui-corner-all)).click
  67. wait_until { browser.link(class: "ui-state-default").present? }
  68.  
  69. browser.link(class: "ui-state-default").click
  70. wait_until { browser.div(class: "operations").li.present? }
  71. end
  72.  
  73. def parse_transactions
  74. go_to_transactions_info
  75.  
  76. transaction_list = browser.div(class: "operations").lis
  77.  
  78. transaction_list.map do |li|
  79. li.link(class: "operation-details").click
  80.  
  81. wait_until { browser.div(class: "operation-details-body").present? && browser.div(class: "operation-details-header").present? }
  82.  
  83. transaction_body = Nokogiri::HTML.parse(browser.div(class: "operation-details-body").html)
  84. transaction_header = Nokogiri::HTML.parse(browser.div(class: "operation-details-header").html)
  85.  
  86. browser.send_keys :escape
  87.  
  88. parse_transaction(transaction_body, transaction_header).to_hash
  89. end
  90. end
  91.  
  92. def parse_transaction(transaction_body, transaction_header)
  93. date = transaction_body.css('.operation-details-body').css('.details-section')[0].css('.value')[0].text
  94. description = transaction_header.css('.operation-details-header').text.gsub(" ", "")
  95. amount = transaction_body.css('.details-section.amounts').css('.value')[0].text.split[0].gsub(",", ".").to_f
  96.  
  97. Transaction.new(date, description, amount)
  98. end
  99.  
  100. def log_out
  101. browser.span(class: "logout-link-wrapper").click
  102. wait_until { browser.text_field(class: "username").present? }
  103. end
  104.  
  105. def wait_until(&block)
  106. Watir::Wait.until {yield}
  107. end
  108.  
  109. end
  110.  
  111. if __FILE__ == $0
  112.  
  113. webbanking = Moldindconbank.new
  114. puts JSON.pretty_generate(webbanking.collect_data)
  115.  
  116. end
  117.  
  118.  
  119.  
  120. transaction.rb
  121.  
  122. require 'time'
  123.  
  124. class Transaction
  125.  
  126. def initialize(date, description, amount)
  127. @date = Time.parse date
  128. @description = description
  129. @amount = amount
  130. end
  131.  
  132. def to_hash
  133. {
  134. date: @date.to_s,
  135. description: @description,
  136. amount: @amount
  137. }
  138. end
  139.  
  140. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement