LeapSalesforce Ui

UI capability built on top of leap_salesforce gem to aid getting started with UI testing in Salesforce fast and easy.

This only works in Lightning view, not classic. If you need UI testing of classic, raise an issue

Installation

Add this line to your application's Gemfile:

gem 'leap_salesforce_ui'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install leap_salesforce_ui

Usage

This gem is an extension to leap salesforce Setup leap_salesforce with leap_salesforce init and use the retrospective rake tasks to create soql objects.

Add the line require 'leap_salesforce_ui/rake' to your Rakefile. Then run the Rake task rake leaps:create_poms which will generate page objects based upon the soql_objects

Set the current UI user to be used with the LeapSalesforce.ui_user attribute.

E.g

LeapSalesforce.ui_user = '[email protected]'

See leap salesforce test users section for details on ways to set test users.

Example spec_helper

Following is example code that can be used to setup and teardown each test.

require 'leap_salesforce_ui'
RSpec.configure do |config|
  LeapSalesforce.ui_user = LeapSalesforce::Users.list.first
  config.before(:each) do |example|
    # Start browser with test name as metadata
    LeapSalesforce.browser example.full_description
  end

  config.after(:each) do |example|
    # Take screenshot on failure
    screenshot = "logs/#{tidy_description(example.full_description.to_s)}_failure.png"
    LeapSalesforce.browser.screenshot.save screenshot if example.exception
    # Use a fresh browser for each test
    LeapSalesforce.close_browser 
  end

  # Tidy RSpec example description so it's suitable for a screenshot name
  # @return [String] Description of test suitable for file name
  def tidy_description(rspec_description)
    rspec_description.delete("#<RSpec::Core::Example").delete('>".:{}').delete("=").delete(" ")
  end
end

Populate form using label in metadata

Following is a walk through of one of the tests. If you've copied the above code into spec/spec_helper.rb you should be able to copy this code into a new test file and execute it.

It may or may not work depending on how the fields Contact has in your org

RSpec.describe "Creating record" do
  let(:first_name) { Faker::Name.first_name }
  let(:last_name) { Faker::Name.last_name }
  let(:salutation) { Contact::Salutation.sample }
  let(:other_street) { Faker::Address.full_address }
  it "populate form and save" do
     = FactoryBot.create(:account)
    CreateContactPage.visit.submit_with({ "First Name" => first_name,
                                          last_name: last_name,
                                          salutation: salutation,
                                          other_street: other_street,
                                          account_id: . })
    contact_id = ViewContactPage.id
    @contact = Contact.find(id: contact_id)
    expect(@contact.first_name).to eq first_name
    expect(@contact.last_name).to eq last_name
    expect(@contact.salutation).to eq salutation
    expect(@contact.other_street).to eq other_street
    expect(@contact.).to eq .id
  end
end

One does not have to identify how to recognise first_name, last_name, etc. From the metadata it works out what kind of field (textfield, textarea, reference) and then finds the corresponding label and uses that to fill in the field.

This test then uses the API to setup a dependent account (through FactoryBot) and then to find the contact created to verify that what was entered on the UI was saved as expected.

To specify a record_type, call the set_record_type method after the visit method. The default record type can be used by calling visit with

visit(use_record_type: false)

See create spec for example

Manually specify label

Sometimes the label on the UI does not match the metadata label. In that case, one case manually specify the type of object, the label and what to set it to. E.g.,

UpdateAccountPage.visit(@account.id).set_picklist("Type", Account::AccountType.prospect).save

This will set a picklist with the label Type to the value defined by the picklist AccountType, and the value prospect.

Follow other examples in spec to build tests using the auto-generated classes.

These tests require that you disable 2 step authentication for users unless run from an IP address that your Salesforce Org trusts. Many shared CI environments have runners that would be hard to whitelist as the address is dynamic.

Options

To run tests in headless mode, set headless mode to true.

LeapSalesforce.headless = true

Authentication

If IP address for user profile is not allowed you will need to use a security token. See leap_salesforce for how to set this for each user's key through environment variables.

Helpful commands

Go to Salesforce instance defined by logging in

LeapSalesforce.browser.goto SoqlHandler.instance_url

Login through SOAP session to get information for browser

user = LeapSalesforce::Users.where username: LeapSalesforce.ui_user
session = LeapSalesforce::Session.new user.username, LeapSalesforce.password,
                                      user.security_token

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitLab at https://gitlab.com/leap-dojo/leap_salesforce_ui. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the LeapSalesforceUi project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.