How to automate a login on a website
Let's say you want to automate your workflow with the website. Most of the time, you sign on the website before doing anything else. You can automate that action too! In this article, you'll learn how to make a simple automation script, which will log in the website for you.
This article is meant for creating your script step-by-step. If you want to use the full script for reference – feel free to scroll to the end.
Step 1: prepare IDE or similar software
You'll need anything to write your script. It's up to you what to use, but we recommend to use IDE for that. Follow the first 4 steps from the following article: Getting started with automation scripting.
Step 2: create the script connecting to API and define functions
In this step, you'll need to make the script work with API. The script will include:
- API endpoints
- Variables for credentials
- Defined functions for signing in, opening and closing profile
- Imported modules, including
requests,hashlib,time. Some modules related to Selenium will be included as well - Sign in request
Use the following template for it:
import requests
import hashlib
import time
from selenium import webdriver
from selenium.webdriver.chromium.options import ChromiumOptions
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
MLX_BASE = "https://api.multilogin.com"
MLX_LAUNCHER = "https://launcher.mlx.yt:45001/api/v1"
MLX_LAUNCHER_V2 = (
"https://launcher.mlx.yt:45001/api/v2" # recommended for launching profiles
)
LOCALHOST = "http://127.0.0.1"
HEADERS = {"Accept": "application/json", "Content-Type": "application/json"}
# TODO: Insert your account information in both variables below
USERNAME = ""
PASSWORD = ""
# TODO: Insert the Folder ID and the Profile ID below
FOLDER_ID = ""
PROFILE_ID = ""
def signin() -> str:
payload = {
"email": USERNAME,
"password": hashlib.md5(PASSWORD.encode()).hexdigest(),
}
r = requests.post(f"{MLX_BASE}/user/signin", json=payload)
if r.status_code != 200:
print(f"\nError during login: {r.text}\n")
else:
response = r.json()["data"]
token = response["token"]
return token
def start_profile() -> webdriver:
r = requests.get(
f"{MLX_LAUNCHER_V2}/profile/f/{FOLDER_ID}/p/{PROFILE_ID}/start?automation_type=selenium",
headers=HEADERS,
)
response = r.json()
if r.status_code != 200:
print(f"\nError while starting profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} started.\n")
selenium_port = response["data"]["port"]
driver = webdriver.Remote(
command_executor=f"{LOCALHOST}:{selenium_port}", options=ChromiumOptions()
)
# For Stealthfox profiles use: options=Options()
# For Mimic profiles use: options=ChromiumOptions()
return driver
def stop_profile() -> None:
r = requests.get(f"{MLX_LAUNCHER}/profile/stop/p/{PROFILE_ID}", headers=HEADERS)
if r.status_code != 200:
print(f"\nError while stopping profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} stopped.\n")
token = signin()
HEADERS.update({"Authorization": f"Bearer {token}"})The template is similar to Selenium automation example, except it has the following imported module at the beginning (we will need for scraping):
from selenium.webdriver.common.by import By
Step 3: choose web page to automate login process
You can use any website that contains login page. But for this guide, we recommend trying this page – it’s great for practicing automation tasks: Login Page.
Step 4: look for the target info
In our case, it'll be the text bars for credentials and login button:

We'll get all 3 elements on this page. Here's what you can do:
- Open DevTools in your browser. Here's how to do that for Chromium- and Firefox-based browsers:
- Windows and Linux: press
Ctrl + Shift + I - macOS: press
Cmd + Option + I
- Windows and Linux: press
- Make sure that you are on the “Elements” tab
- Use search hot key to find the target value
- Windows and Linux:
CTRL + F - macOS:
Cmd + F
- Windows and Linux:
- Look for the values you need to use for scraping. In our case, they will be the following:
-
id="username"for Username text field -
id="password"for Password text field -
class="radius"for Login button
-
- Select the elements with the tags in the “Elements” tab
- Click the selected value and copy the value of
idorclassattributes. For example, if you seeid="username", you need to copyusername - Write down the values somewhere – you'll need it later

Step 5: get back to IDE and add new strings of code
- Get back to the IDE of your choice (for example, VS Code)
- Click the code field and add a variable for opening and performing actions in the profile:
driver = start_profile() - Add
driver.get(“<your website>”). In our case, it'll be the following command:driver.get("https://the-internet.herokuapp.com/login") - Now we need some delay for the script, so it will try to do the other commands 5 seconds after opening the web page:
time.sleep(5)
Step 6: make the script to find the element
Use this command to find the element: driver.find_element(By.<attribute on the page>, "<element>"). It tells the script exactly what to look for on the page. We copied several values for id and class attributes in our use case. Add the corresponding strings from the list below:
- Add the following string for username text field:
driver.find_element(By.ID, "username") - Add the following string for password text field:
password = driver.find_element(By.ID, "password") - Add the following string for login button:
button = driver.find_element(By.CLASS_NAME, "radius")
We'll need to use those value later, so we need to make variables for the commands. You can name them any way you want, here are the examples:
login = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")
button = driver.find_element(By.CLASS_NAME, "radius")Step 7: tell the script what to do
We told the script, what it should detect on the page. Now we are going to tell the script to add the credentials and log in the page. You'll use the following functions for that:
-
send_keys()to provide which symbols to type in the text fields -
click()to imitate left mouse click
In our use case, you may have noticed, that the website has stated the following values for credentials:
-
tomsmithfor the username -
SuperSecretPassword!for the password
We need to tell the script to type those values and click the login button. Here are the strings of code:
login.send_keys("tomsmith")
password.send_keys("SuperSecretPassword!")
button.click()Step 8: finish the script with the text notification
Our script is ready. You can proceed with preparations and run the script, but we recommend adding print() function, which will notify you about successful finishing of the script. Think of the text for the function and add it at the end of script:
print("Signed in")It is optional, but you can also add stop_profile() function after print(). We recommend not to use it, as that string misses the point of the script.
Step 9: prepare the script before running it
- Install the following Python libraries (look for documentation of your IDE for more details):
requestsselenium
- Insert your values into the below variables in the script:
Step 10: run the script
- Open the desktop app (or connect the agent if you are using the web interface)
- By default, the script below works for Mimic. To use it for Stealthfox, replace
options=ChromiumOptions()withoptions=Options()in the following line:driver = webdriver.Remote(command_executor=f'{LOCALHOST}:{selenium_port}', options=ChromiumOptions()) - Run the
.pyfile with your automation code
In order to run the script in VS Code, сlick “Run” → “Run without debugging” (or “Start debugging”).
If you've done everything correctly, you'll be able to see the result in the terminal. You'll also notice a logged in account in the profile.

Notes
Now you are good to go! You're not restricted to those only options. Python and Selenium are quite flexible tools, and there is more potential to them. Here are a couple of tips:
- You can force the script to wait based on specific conditions (for example, the script will wait until a specific element appears on the page). You can read about it in the corresponding Selenium doc: Waiting Strategies
- You can combine this and the script from the following article: Web scraping with Selenium 101. It will create a great starting point for your automation project!
- There are more ways of implementing Selenium. Check their help center for more details: Selenium Documentation
Full script
import requests
import hashlib
import time
from selenium import webdriver
from selenium.webdriver.chromium.options import ChromiumOptions
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
MLX_BASE = "https://api.multilogin.com"
MLX_LAUNCHER = "https://launcher.mlx.yt:45001/api/v1"
MLX_LAUNCHER_V2 = (
"https://launcher.mlx.yt:45001/api/v2" # recommended for launching profiles
)
LOCALHOST = "http://127.0.0.1"
HEADERS = {"Accept": "application/json", "Content-Type": "application/json"}
# TODO: Insert your account information in both variables below
USERNAME = ""
PASSWORD = ""
# TODO: Insert the Folder ID and the Profile ID below
FOLDER_ID = ""
PROFILE_ID = ""
def signin() -> str:
payload = {
"email": USERNAME,
"password": hashlib.md5(PASSWORD.encode()).hexdigest(),
}
r = requests.post(f"{MLX_BASE}/user/signin", json=payload)
if r.status_code != 200:
print(f"\nError during login: {r.text}\n")
else:
response = r.json()["data"]
token = response["token"]
return token
def start_profile() -> webdriver:
r = requests.get(
f"{MLX_LAUNCHER_V2}/profile/f/{FOLDER_ID}/p/{PROFILE_ID}/start?automation_type=selenium",
headers=HEADERS,
)
response = r.json()
if r.status_code != 200:
print(f"\nError while starting profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} started.\n")
selenium_port = response["data"]["port"]
driver = webdriver.Remote(
command_executor=f"{LOCALHOST}:{selenium_port}", options=ChromiumOptions()
)
# For Stealthfox profiles use: options=Options()
# For Mimic profiles use: options=ChromiumOptions()
return driver
def stop_profile() -> None:
r = requests.get(f"{MLX_LAUNCHER}/profile/stop/p/{PROFILE_ID}", headers=HEADERS)
if r.status_code != 200:
print(f"\nError while stopping profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} stopped.\n")
token = signin()
HEADERS.update({"Authorization": f"Bearer {token}"})
driver = start_profile()
driver.get("https://the-internet.herokuapp.com/login")
time.sleep(5)
login = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")
button = driver.find_element(By.CLASS_NAME, "radius")
login.send_keys("tomsmith")
password.send_keys("SuperSecretPassword!")
button.click()
print("Signed in")This article includes third-party links that we don’t officially endorse.