My recent client work has been on testing a migration(data & business processes) to Salesforce CRM platform.
As part of Test execution, I took the initiative to build a POC to exercise automation of Salesforce both by interacting with the Lightning UI and the APEX Salesforce API interface.
This post is to share the hurdles I faced and lessons I learnt in building the POC for UI automation.
1. Choice of tools – Cypress.io & Selenium WebDriver
I exercised two tools sets that I am experienced with for UI automation – Cypress.io and Selenium Webdriver API (using Python) .
I could not go far wth Cypress, as it has limited support for iframes ( by design) , covered in this open issue thread.
Basically, as soon as I automated the login process, hit an error where Cypress terminated with an error “Whoops there is no test to run”
I tried some of the workarounds mentioned in the thread that worked for some folks, but not success.
So, once I exhausted my time box for Cypress I moved onto Selenium Webdriver.
2. Bypassing Email verification after login
The first hurdle I hit was the email 2FA that was set on the Salesforce sandbox environment that I was testing.
If I would have been automating at the API layer, there are various secure ways (e.g. API tokens) to authenticate but with email verification from the UI,Salesforce bases it on IP addresses. So, to work around that I to create another test user & profile that had either my IP whitelisted or basically no-IP filtered out.
Instructions from here were helpful –> https://github.com/neozenith/testcafe-sfdc-poc
3. Explicit waits & dealing with dynamic UI ids
Goes without saying that we have to explicitly wait for elements to load, to create robust tests, I had to write heaps of explicit waits to the interact with the Lightning UI (as it is a very “busy” UI)
Another interesting quirk I found , was ,even though some elements that I wanted to interact with has unique ids that I could as a selector, but as I found later through flakiness in my tests, that those ids especially for modal dialogs were being generated dynamically, most likely per login.
this piece of code although using id, was flaky because webdriver could not find the same id across sessions. The value “11:1355;a” would change to “11:3435;a” on subsequent test runs for the same modal dialog box.
So, instead I went with a different approach to not use id for the dynamic modal dialogs, instead search by XPath in this case and awaiting for element to be clickable
That worked and finally I was able to complete a basic UI automation flow of logging in , interacting with dynamic elements, adding user input and asserting some test conditions 🙂