Python Automated Login Scripts for Process Automation

by | Python

Table of Contents

Introduction to Web Automation and Python

Web automation involves using scripts to interact with websites, automating repetitive tasks. This is particularly useful for tasks like logging into websites, filling out forms, data scraping, etc. Python is a common language for web automation due to its simplicity and the robustness of its libraries.

Prerequisites

Python Installation: Ensure Python is installed on your machine. You can download it from the official website.
Selenium Installation: This is a powerful tool for controlling web browsers through programs.
WebDriver Setup: Selenium requires a WebDriver specific to the browser you are using (ChromeDriver for Chrome, GeckoDriver for Firefox, etc.).
# Install Selenium
pip install selenium

Download the WebDriver for your browser and place it in a directory that’s in your system’s PATH.

Setup Instructions

Install Required Libraries

# Install selenium if not already installed
pip install selenium

Example: Automating Login to a Website

We’ll demonstrate how to automate logging into a website using Selenium.

Step-by-Step Guide

Import Necessary Libraries:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
Initialize WebDriver:
# Replace 'path_to_webdriver' with the actual path to the WebDriver executable
driver = webdriver.Chrome(executable_path='/path_to_webdriver/chromedriver')
Navigate to the Login Page:
# Replace 'login_page_url' with the actual URL of the login page
driver.get('https://example.com/login')
Locate and Fill Login Form:
# Find the username and password input fields - replace 'username_field' and 'password_field' with actual field names or identifiers
username = driver.find_element_by_name('username_field')
password = driver.find_element_by_name('password_field')

# Send the login credentials
username.send_keys('your_username')
password.send_keys('your_password')
Submit the Login Form:
# Find the login button - replace 'login_button' with the actual identifier
login_button = driver.find_element_by_name('login_button')
login_button.click()

# Alternatively, you can submit using the following line if the form is accessible:
# password.send_keys(Keys.RETURN)
Post-Login Task (Example: Navigating to a Dashboard):
# Wait to ensure login is processed
time.sleep(5)

# Navigate to the dashboard or any other post-login page
driver.get('https://example.com/dashboard')

Complete Script

Here’s a full script encompassing all the steps discussed:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# Initialize WebDriver
driver = webdriver.Chrome(executable_path='/path_to_webdriver/chromedriver')

# Navigate to the login page
driver.get('https://example.com/login')

# Entering login credentials
username = driver.find_element_by_name('username_field')
password = driver.find_element_by_name('password_field')
username.send_keys('your_username')
password.send_keys('your_password')

# Clicking the login button
login_button = driver.find_element_by_name('login_button')
login_button.click()

# Wait for the login process to complete
time.sleep(5)

# Navigate to the post-login page
driver.get('https://example.com/dashboard')

# Close the driver
driver.quit()

With this guide, you can automate the login process for a website using Python and Selenium, providing a basis for further automation tasks post-login.

Setting Up Your Environment and Tools

Step 1: Install Necessary Libraries

Firstly, we need to install the necessary libraries for our Python environment. These will include selenium for browser automation and webdriver-manager to easily install and manage browser drivers.

pip install selenium webdriver-manager

Step 2: Setting Up WebDriver

Download the browser driver you need for Selenium. Using the webdriver-manager simplifies this process:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

# Setting up Chrome browser with WebDriver manager
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

Step 3: Automate Logging into a Website

Below is a Python script that automates logging into a website. For this example, we’re using a hypothetical website http://example.com.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# Initialize the Chrome driver
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

# Open the website
driver.get("http://example.com")

# Find the login elements by their HTML element id, name, etc.
username_field = driver.find_element(By.ID, "username")
password_field = driver.find_element(By.ID, "password")
login_button = driver.find_element(By.ID, "loginButton")

# Input credentials
username_field.send_keys("your_username")
password_field.send_keys("your_password")

# Click the login button
login_button.click()

# You can also press Enter if there's no dedicated login button
# password_field.send_keys(Keys.RETURN)

# Wait and do other post-login tasks here if needed, for example:
# Perform actions after logging in:
# driver.find_element(By.ID, "someElement").click()

# Close the browser after tasks are completed
driver.quit()

Step 4: Handling Dynamic Website Elements

Websites often have elements that load dynamically, and Selenium needs to wait for these to appear. Use WebDriverWait and expected_conditions to handle such elements:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Wait for an element to be present before performing actions
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "someDynamicElement")))

# After ensuring the element is present:
element.click()

# Continue with other actions as needed

Step 5: Structuring Your Code

For maintainability, encapsulate the functionality in functions and possibly a class. Here’s an example of turning the above script into a class-based approach:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

class WebAutomation:
    def __init__(self, username, password, login_url):
        self.username = username
        self.password = password
        self.login_url = login_url
        self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
        
    def login(self):
        self.driver.get(self.login_url)
        self.driver.find_element(By.ID, "username").send_keys(self.username)
        self.driver.find_element(By.ID, "password").send_keys(self.password)
        self.driver.find_element(By.ID, "loginButton").click()
        
    def perform_post_login_tasks(self):
        # Add your post-login automation tasks here
        pass
    
    def close_browser(self):
        self.driver.quit()

if __name__ == "__main__":
    bot = WebAutomation("your_username", "your_password", "http://example.com")
    bot.login()
    bot.perform_post_login_tasks()
    bot.close_browser()

By breaking down tasks and encapsulating them in a class, you make it easier to maintain and extend your automation script.

Part #3: Handling Web Elements with Selenium

This section will cover interacting with web elements using Selenium with Python for process automation. By the end of this part, you should be able to automate tasks such as logging into websites and performing various post-login actions.

Import Required Libraries

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import time

Initialize WebDriver

# Setup Chrome WebDriver
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

Open the Target Website

url = 'http://example.com/login'
driver.get(url)

Locate Web Elements

Locating elements by ID, name, CSS selector, and XPath.

# Locate elements
username_field = driver.find_element(By.ID, 'username')
password_field = driver.find_element(By.NAME, 'password')
login_button = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')

Interact with Web Elements

Interact with the web elements to log in.

# Enter login credentials
username_field.send_keys('your_username')
password_field.send_keys('your_password')

# Click the login button
login_button.click()

Post-Login Actions

Wait for the new page to load and then perform additional actions.

time.sleep(5)  # Allow the new page to load

# Example post-login action: Search for an element and click it
post_login_element = driver.find_element(By.XPATH, '//a[text()="Desired Link"]')
post_login_element.click()

Extract Information

Extract information from the web page after logging in.

# Example: Get text from a specific element
post_login_text = driver.find_element(By.CLASS_NAME, 'post-login-element').text
print(post_login_text)

Clean Up

Close the browser once the task is completed.

driver.quit()

Full Script

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import time

# Setup Chrome WebDriver
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

# Open the target website
url = 'http://example.com/login'
driver.get(url)

# Locate elements
username_field = driver.find_element(By.ID, 'username')
password_field = driver.find_element(By.NAME, 'password')
login_button = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')

# Enter login credentials
username_field.send_keys('your_username')
password_field.send_keys('your_password')

# Click the login button
login_button.click()

# Allow the new page to load
time.sleep(5)

# Example post-login action: Search for an element and click it
post_login_element = driver.find_element(By.XPATH, '//a[text()="Desired Link"]')
post_login_element.click()

# Example: Get text from a specific element
post_login_text = driver.find_element(By.CLASS_NAME, 'post-login-element').text
print(post_login_text)

# Close the browser
driver.quit()

With this implementation, you should be able to automate logging into a website and perform various post-login tasks using Selenium with Python.

Securely Managing Credentials in Python

When automating the process of logging into websites, securely managing credentials is crucial to prevent sensitive data exposure. Below is a practical implementation using environment variables to securely manage credentials.

Using Environment Variables

Environment variables are a secure way to store and retrieve sensitive information such as usernames and passwords. Below are the steps for managing credentials using environment variables in a Python script.

Step 1: Set Environment Variables

Before running the script, set the environment variables in your operating system. For example:

On Windows:

setx USER_NAME "your_username"
setx USER_PASSWORD "your_password"

On macOS/Linux:

export USER_NAME="your_username"
export USER_PASSWORD="your_password"

Step 2: Create a Python Script to Retrieve and Use Credentials

Here’s how you can retrieve these environment variables within your Python script.

import os
from selenium import webdriver
from selenium.webdriver.common.by import By

# Retrieve credentials from environment variables
username = os.getenv('USER_NAME')
password = os.getenv('USER_PASSWORD')

if not username or not password:
    raise ValueError("Username or Password not found in environment variables")

# Initialize Selenium WebDriver
driver = webdriver.Chrome()

def login_to_website(url):
    try:
        # Open the login page
        driver.get(url)

        # Find the username and password fields and input values
        username_field = driver.find_element(By.NAME, 'username')
        password_field = driver.find_element(By.NAME, 'password')
        login_button = driver.find_element(By.NAME, 'login')

        username_field.send_keys(username)
        password_field.send_keys(password)

        # Click the login button
        login_button.click()
        
        # Check if login is successful
        # This part will be dependent on how the website displays login success or failure
        if "Dashboard" in driver.title:
            print("Login successful!")
        else:
            print("Login failed.")
    
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        # Close the browser
        driver.close()

# Replace 'http://example.com/login' with the actual login URL
login_to_website('http://example.com/login')

Explanation

Retrieve Credentials: The script uses os.getenv to retrieve the username and password stored in environment variables.
Error Handling: Checks if the environment variables are not defined, raising an error if they are missing.
Initialize WebDriver: Selenium WebDriver is initialized to automate browser interaction.
Load Login Page: Opens the login page using driver.get(url).
Interact with Web Elements: Finds the username, password fields, and login button by their names and inputs the retrieved credentials.
Login: Clicks the login button to submit the form.
Check for Login Success: Optionally checks if the login was successful based on the page title or other indicators.
Exception Handling: Catches and prints any exceptions that occur during execution.
Close WebDriver: Ensures that the browser is closed after the script runs.

By following this implementation, you can securely manage and use credentials in your Python automation scripts.

Automating Login Processes with Python and Selenium

Below is a clear, practical implementation of a script that automates logging into a website using Python and Selenium.

Code Implementation

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import time

# Your credentials
USERNAME = 'your_username'
PASSWORD = 'your_password'

# URL of the website
URL = 'https://www.example.com/login'

def login_website():
    # Initialize the Chrome driver
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
    
    try:
        # Navigate to the URL
        driver.get(URL)
        
        # Wait until the login elements are available
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "login_field"))  # Adjust according to actual element identifiers
        )
        
        # Find the username and password input elements
        username_input = driver.find_element(By.ID, 'login_field')  # Adjust according to actual element identifiers
        password_input = driver.find_element(By.ID, 'password')  # Adjust according to actual element identifiers

        # Enter username and password
        username_input.send_keys(USERNAME)
        password_input.send_keys(PASSWORD)
        
        # Submit the form (assuming the form is in a button with type="submit")
        password_input.send_keys(Keys.ENTER)

        # Wait until the login is finished and the next page loads
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "logout_button"))  # Adjust according to actual element identifiers
        )
        
        print("Login was successful!")
        
        # Perform post-login tasks if needed here
        # For example, navigate to a page after login
        driver.get('https://www.example.com/dashboard')

        # Add any other post-login actions

    except TimeoutException:
        print("Login failed or took too long.")
    finally:
        # Ensure the driver is closed even if an error occurs
        time.sleep(5)  # Optional: let the user see the result before closing
        driver.quit()

if __name__ == "__main__":
    login_website()

Notes

Required Modules:

selenium: Use pip install selenium.
webdriver_manager: Use pip install webdriver-manager.

Element Identifiers:

Replace "login_field", "password", and "logout_button" with the actual ID attributes from the webpage you’re automating.
If elements have different attributes like name or class, adjust the By methods accordingly, e.g., By.NAME, By.CLASS_NAME.

Exception Handling:

The TimeoutException is caught to handle scenarios where the login page or subsequent elements take too long to load.
Additional exception handling can be added for more granular control.

Post-Login Tasks:

Include any necessary post-login navigation and action steps within the script. Adjust the relevant URLs and element locators as needed.

Security:

Ensure secure handling of credentials. For more secure alternatives, consider using environment variables or secret management services.

This implementation provides a robust starting point for automating login processes using Selenium in Python. Adapt the element locators and post-login actions based on the specific requirements and structure of the target website.

Post-Login Task Automation

Overview

The following script demonstrates how to automate post-login tasks on a website using Python with the Selenium library. This example assumes you have already logged into the website and are looking to perform additional actions such as navigating to a specific page, filling out a form, or extracting data.

Implementation

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# Initialize the WebDriver (assumes Chrome WebDriver is in the PATH or the executable path is set)
driver = webdriver.Chrome()

try:
    # Navigate to the website (Assuming the user is already logged in)
    driver.get('https://example.com/dashboard')

    # Example Post-Login Task 1: Navigate to a specific section
    user_profile_link = driver.find_element(By.LINK_TEXT, 'Profile')
    user_profile_link.click()

    # Wait for the page to load
    time.sleep(3)

    # Example Post-Login Task 2: Fill out a form
    address_field = driver.find_element(By.ID, 'address')
    address_field.clear()
    address_field.send_keys('123 Main Street')

    city_field = driver.find_element(By.ID, 'city')
    city_field.clear()
    city_field.send_keys('Springfield')

    submit_button = driver.find_element(By.NAME, 'submit')
    submit_button.click()

    # Example Post-Login Task 3: Extract and print data from a specific element
    account_balance = driver.find_element(By.ID, 'account-balance')
    print('Account Balance:', account_balance.text)

    # Wait before closing to ensure all tasks are complete
    time.sleep(3)

finally:
    # Always close the driver
    driver.quit()

Explanation

Initialize the WebDriver: This uses the Chrome WebDriver to control browser automation.

Navigate to the Website: This takes the user to a specific page after login (e.g., /dashboard).

Navigate to Profile: Clicks the “Profile” link to navigate to the user’s profile page.

Fill Out a Form: Finds the form fields for the address and city, clears them if necessary, inputs new data, and submits the form.

Extract Data: Fetches specific information (e.g., account balance) from the webpage and prints it.

Handling Cleanup: Ensures to quit the WebDriver to close the browser properly.

Note

Adjust the selectors (e.g., By.ID, By.LINK_TEXT) based on the actual HTML structure of the target website.
Make sure to handle dynamic page elements and JavaScript-driven content appropriately by using Selenium’s wait methods if necessary. This example uses time.sleep() for simplicity.
Securely manage credentials, sessions, or cookies as required in your implementation to maintain login state.

This script provides a practical basis for automating post-login tasks once the initial login phase has been successfully completed.

Unit 7: Error Handling and Debugging in Web Automation with Python

Error handling and debugging are critical skills to ensure that your web automation scripts are robust and reliable. This section covers practical implementations for error handling and debugging while automating web tasks using Python with Selenium.

1. Importing Necessary Libraries

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, TimeoutException, WebDriverException
import logging

2. Setting Up Logging

logging.basicConfig(filename='automation.log', level=logging.DEBUG,
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

3. Implementing Error Handling

Example Function: Logging into a Website

def login_to_website(driver, url, username, password):
    try:
        driver.get(url)
        logger.info("Accessed the website at %s", url)

        # Locate username field and input username
        username_field = driver.find_element_by_name("username")
        username_field.send_keys(username)
        logger.info("Entered username")

        # Locate password field and input password
        password_field = driver.find_element_by_name("password")
        password_field.send_keys(password)
        logger.info("Entered password")

        # Locate and click the login button
        login_button = driver.find_element_by_name("login")
        login_button.click()
        logger.info("Clicked login button")

        # Verify login by checking the presence of a post-login element
        post_login_element = driver.find_element_by_id("post-login-element")
        logger.info("Successfully logged in")

    except NoSuchElementException as e:
        logger.error("Element not found: %s", e)
        return False

    except TimeoutException as e:
        logger.error("Timeout while loading page: %s", e)
        return False

    except WebDriverException as e:
        logger.error("Web Driver exception occurred: %s", e)
        return False

    except Exception as e:
        logger.error("An unexpected error occurred: %s", e)
        return False

    return True

4. Using the Function in a Script

if __name__ == "__main__":
    driver_path = 'path/to/chromedriver'
    url = 'http://example.com/login'
    username = 'yourUsername'
    password = 'yourPassword'

    try:
        driver = webdriver.Chrome(executable_path=driver_path)
        success = login_to_website(driver, url, username, password)
        if success:
            logger.info("Proceeding with post-login tasks")
            # Call your post-login automation tasks here
        else:
            logger.warning("Login failed, cannot proceed with post-login tasks")
    except WebDriverException as e:
        logger.error("Failed to initialize WebDriver: %s", e)
    finally:
        driver.quit()
        logger.info("Driver closed")

5. Debugging Tips

        • Verbose Logging: Ensure that your logging captures enough information to trace issues.
        • Breakpoints: Use breakpoints in your IDE to step through the script.
        • Exception Details: Always log exception details with stack traces for better diagnostics.
        • Screenshots: Capture screenshots on exceptions to visualize the issue.
import os

def capture_screenshot(driver, step_name):
    screenshot_path = os.path.join('screenshots', f'{step_name}.png')
    driver.save_screenshot(screenshot_path)
    logger.info("Captured screenshot for %s", step_name)

# Example usage in the above function
try:
    # your Selenium code
    pass
except Exception as e:
    capture_screenshot(driver, 'login_issue')
    logger.error("An error occurred: %s", e)

Conclusion

By incorporating robust error handling and detailed logging, you can make your web automation scripts more reliable and easier to debug. These practices help you quickly identify and address issues that arise during the automation process. Implement the above examples in your automation scripts to enhance stability and maintainability.

Best Practices and Advanced Techniques in Web Automation with Python

To build robust, maintainable, and secure scripts for web automation, it is essential to integrate best practices and advanced techniques into your Python code. Below are key implementation points for unit #8 of your project:

Using Page Object Model (POM)

The Page Object Model is a design pattern that enhances test maintenance and reduces code duplication. Here’s an example implementation:

Folder Structure

project_root/
    tests/
        test_login.py
    pages/
        login_page.py
        dashboard_page.py
    utils/
        __init__.py

login_page.py

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

class LoginPage:
    def __init__(self, driver):
        self.driver = driver
        self.username_field = (By.ID, 'username')
        self.password_field = (By.ID, 'password')
        self.login_button = (By.ID, 'loginBtn')
    
    def enter_username(self, username):
        self.driver.find_element(*self.username_field).send_keys(username)
    
    def enter_password(self, password):
        self.driver.find_element(*self.password_field).send_keys(password)
    
    def click_login_button(self):
        self.driver.find_element(*self.login_button).click()

dashboard_page.py

from selenium.webdriver.common.by import By

class DashboardPage:
    def __init__(self, driver):
        self.driver = driver
        self.profile_button = (By.ID, 'profileBtn')
    
    def click_profile_button(self):
        self.driver.find_element(*self.profile_button).click()

test_login.py

import unittest
from selenium import webdriver
from pages.login_page import LoginPage
from pages.dashboard_page import DashboardPage

class LoginTests(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://example.com')
        self.driver.implicitly_wait(10)
    
    def test_successful_login(self):
        login_page = LoginPage(self.driver)
        login_page.enter_username('your_username')
        login_page.enter_password('your_password')
        login_page.click_login_button()

        dashboard_page = DashboardPage(self.driver)
        self.assertTrue(dashboard_page.click_profile_button())

    def tearDown(self):
        self.driver.quit()

if __name__ == "__main__":
    unittest.main()

Using Fixtures for Setup and Teardown

Leveraging fixtures when using frameworks like pytest makes your code cleaner and more reusable.

import pytest
from selenium import webdriver
from pages.login_page import LoginPage

@pytest.fixture(scope="class")
def test_setup(request):
    driver = webdriver.Chrome()
    driver.get('https://example.com')
    driver.implicitly_wait(10)
    request.cls.driver = driver
    yield
    driver.quit()

@pytest.mark.usefixtures("test_setup")
class TestLogin:
    def test_valid_login(self):
        login_page = LoginPage(self.driver)
        login_page.enter_username('your_username')
        login_page.enter_password('your_password')
        login_page.click_login_button()
        
        # Add more assertions specific to your post-login tasks
        assert self.driver.title == "Dashboard"

Data-Driven Testing

To ensure broad coverage with different sets of input data, integrate data-driven tests using pytest‘s parameterization.

import pytest
from pages.login_page import LoginPage
from pages.dashboard_page import DashboardPage

@pytest.mark.parametrize("username, password, result", [
    ("valid_user", "valid_pwd", True),
    ("invalid_user", "valid_pwd", False),
    ("valid_user", "invalid_pwd", False)
])
def test_login(username, password, result, test_setup):
    login_page = LoginPage(test_setup.driver)
    login_page.enter_username(username)
    login_page.enter_password(password)
    login_page.click_login_button()

    if result:
        dashboard_page = DashboardPage(test_setup.driver)
        assert dashboard_page.click_profile_button() is not None
    else:
        assert "login failed" in test_setup.driver.page_source

Advanced JS Interactions and AJAX Handling

In certain automation scenarios, you may need to interact with dynamic elements or wait for AJAX requests to complete.

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class DashboardPage:
    def __init__(self, driver):
        self.driver = driver
        self.ajax_element = (By.ID, 'ajaxElement')

    def wait_for_ajax_element(self):
        WebDriverWait(self.driver, 20).until(
            EC.visibility_of_element_located(self.ajax_element)
        )

Advanced Task Automation Example

class DashboardPage:
    def __init__(self, driver):
        self.driver = driver
        self.profile_button = (By.ID, 'profileBtn')
        self.ajax_element = (By.ID, 'ajaxElement')
    
    def click_profile_button(self):
        self.driver.find_element(*self.profile_button).click()

    def fetch_ajax_data(self):
        self.wait_for_ajax_element()
        ajax_data = self.driver.find_element(*self.ajax_element).text
        return ajax_data

    def wait_for_ajax_element(self):
        WebDriverWait(self.driver, 20).until(
            EC.visibility_of_element_located(self.ajax_element)
        )

Integrating Advanced Task in Tests

def test_advanced_post_login_task(test_setup):
    dashboard_page = DashboardPage(test_setup.driver)
    dashboard_page.click_profile_button()
    ajax_data = dashboard_page.fetch_ajax_data()
    assert ajax_data == "Expected Data"

By applying these best practices and advanced techniques, you ensure your automation scripts are efficient, maintainable, and robust. This will enable seamless scaling and adaptability to future changes in the application under test.

Related Posts