class GLSMech

Utilize mechanize to do stuff on GLS webpage.

Attributes

mech[RW]
pass[RW]
user[RW]

Public Class Methods

new() click to toggle source

Setup the mech.

# File lib/gls_agent/gls_mech.rb, line 14
def initialize
  @mech = Mechanize.new
  @mech.user_agent_alias = 'Windows Mozilla'
  @mech.agent.allowed_error_codes = [404]
end

Public Instance Methods

log_to(filename) click to toggle source

Enable logging to given file.

# File lib/gls_agent/gls_mech.rb, line 21
def log_to filename
  @mech.log = Logger.new filename
end
save_parcel_label(parcel_job, filename) click to toggle source

Saves parcel label as pdf, does not overwrite file if exists, returns filename that label was saved to, or nil if login, creation or redirect failed.

# File lib/gls_agent/gls_mech.rb, line 63
def save_parcel_label parcel_job, filename
  if !login! @user, @pass
    raise GLSAgent::GLSEndpointError.new page_error_text
  end

  form = @mech.page.forms.first
  fill_parcel_form form, parcel_job

  @mech.submit(form, form.buttons.first)

  pdf_iframe = @mech.page.iframes.first

  if @mech.log
    @mech.page.save_as "save_label#{DateTime.now.strftime('%s')}.html"
  end

  if page_has_error?
    raise GLSAgent::GLSEndpointError.new page_error_text
  end

  if pdf_iframe
    return pdf_iframe.content.save_as filename
  elsif @mech.log
    @mech.page.save_as "gls_agent_debug_save-parcel-fail.html"
  end
  return nil
end
save_parcel_labels(parcel_jobs, filenames) { |"not logged in", nil| ... } click to toggle source

Saves parcel labels as pdf, does not overwrite file if exists, yields error, filename that was saved to. Later is nil if login, creation or redirect failed.

# File lib/gls_agent/gls_mech.rb, line 28
def save_parcel_labels parcel_jobs, filenames
  return nil if !login! @user, @pass

  parcel_jobs.zip(filenames).each do |parcel, filename|
    if @mech.page.uri.to_s != @@parcel_creation_url
      @mech.get @@parcel_creation_url
    end

    if @mech.page.uri.to_s != @@parcel_creation_url
      yield "not logged in", nil
      next
    end

    form = @mech.page.forms.first
    fill_parcel_form form, parcel
    
    @mech.submit(form, form.buttons.first)

    pdf_iframe = @mech.page.iframes.first

    @mech.page.save_as "save_label#{DateTime.now.strftime('%s')}.html"
    
    if page_has_error?
      yield page_error_text, nil
    elsif pdf_iframe
      yield nil, pdf_iframe.content.save_as(filename)
    else
      yield 'unkown error', nil
    end
  end
end

Private Instance Methods

fill_parcel_form(form, parcel_job) click to toggle source
# File lib/gls_agent/gls_mech.rb, line 106
def fill_parcel_form form, parcel_job
  @mech.page.save_as 'form.html'
  d = DateTime.now
  timestamp = d.strftime("%Y%m%d%H%M") + (d.second_fraction.to_f*1000).to_i.to_s
  form.field_with(:name => 'txtConsigneeNo').value = timestamp
  form.field_with(:name => 'txtName1').value = parcel_job.name
  form.field_with(:name => 'txtName2').value = parcel_job.company
  form.field_with(:name => 'txtStreet').value = parcel_job.street
  form.field_with(:name => 'txtBlockNo').value = parcel_job.streetno
  form.field_with(:name => 'txtZipCodeDisplay').value = parcel_job.zip
  form.field_with(:name => 'txtCity').value = parcel_job.city
  form.field_with(:name => 'txtWeight').value = parcel_job.weight
  form.field_with(:name => 'txtDate').value = parcel_job.date
end
login!(username, password) click to toggle source

Login to GLS parcel creation web page using provided credentials. returns true if login and navigation afterwards succeeded.

# File lib/gls_agent/gls_mech.rb, line 95
def login! username, password
  page = @mech.get @@parcel_creation_url
  form = page.forms.first
  form.fields[5].value = username
  form.fields[6].value = password
  form.submit
  # Move on to target page.
  page = @mech.get @@parcel_creation_url
  page.uri.to_s == @@parcel_creation_url
end
page_error_text() click to toggle source

Error text (div with .prefix class) of the current page.

# File lib/gls_agent/gls_mech.rb, line 127
def page_error_text
  error_div = @mech.page.search(".prefix")[0]
  error_div ? error_div.text : "general error"
end
page_has_error?() click to toggle source

Is there an error (div with .prefix class) on the current page?

# File lib/gls_agent/gls_mech.rb, line 122
def page_has_error?
  !@mech.page.search(".prefix").empty?
end