You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Selenium循环逻辑与多旅行者场景自动化代码编写求助

Hey there! Let's break down your two Selenium-related needs step by step with practical, reusable code examples.

1. Implementing Loop Logic in Selenium

Loops are super handy in Selenium for repetitive tasks like iterating over elements, retrying flaky actions, or waiting for dynamic content. Here are the most common use cases:

a. Looping through a list of elements

If you need to process multiple similar elements (like search results, list items), grab all elements first then loop through them:

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

driver = webdriver.Chrome()
driver.get("your_target_url")

# Grab all list items (adjust the locator to match your page's actual elements)
list_items = driver.find_elements(By.CSS_SELECTOR, ".list-item")

# Iterate through each item and perform actions
for item in list_items:
    print(f"Processing item: {item.text}")
    # Add your custom actions here (click, extract data, etc.)

driver.quit()

b. Retrying an action with a loop

For elements that might be temporarily unclickable (due to loading overlays, animations), use a loop to retry the action:

from selenium.common.exceptions import ElementClickInterceptedException
import time

max_retries = 3
retry_count = 0
action_succeeded = False

while retry_count < max_retries and not action_succeeded:
    try:
        submit_button = driver.find_element(By.ID, "submit-btn")
        submit_button.click()
        action_succeeded = True
        print("Action completed successfully!")
    except ElementClickInterceptedException:
        retry_count += 1
        time.sleep(1)  # Wait a second before retrying
        print(f"Retrying ({retry_count}/{max_retries})...")

if not action_succeeded:
    print("Failed to complete action after all retries.")

c. Waiting for dynamic elements with a loop

If you need to wait for an element to load without Selenium's explicit wait (though explicit wait is recommended!), a loop works too:

import time

timeout = 10  # Wait up to 10 seconds
start_time = time.time()
element_found = False

while time.time() - start_time < timeout and not element_found:
    try:
        target_element = driver.find_element(By.ID, "target-element")
        element_found = True
        print("Element located successfully!")
    except:
        time.sleep(0.5)  # Check every 0.5 seconds

if not element_found:
    print("Element not found within timeout window.")

2. Automated Handling for the Travel Insurance Insured People Scenario

For your specific use case—handling 1, 2, or 3 insured travelers based on list tag count—here's a straightforward implementation:

Core Logic

  1. Locate all list tags that represent insured travelers (use browser dev tools to get the correct selector).
  2. Count the number of these elements to determine how many travelers there are.
  3. Use if-elif-else to run the corresponding code block for each scenario.

Code Example

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

driver = webdriver.Chrome()
driver.get("your_insurance_website_url")

# Wait for the insured people list to load (critical for dynamic pages)
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.TAG_NAME, "li"))  # Adjust locator to match your page
)

# Get the count of insured travelers
insured_travelers = driver.find_elements(By.TAG_NAME, "li")
traveler_count = len(insured_travelers)

# Execute scenario-specific code
if traveler_count == 1:
    print("Processing 1 insured traveler...")
    # Add your code here: fill single traveler's details, select options, etc.
    # Example: driver.find_element(By.ID, "traveler-1-name").send_keys("Jane Doe")
elif traveler_count == 2:
    print("Processing 2 insured travelers...")
    # Add code for two travelers: fill both forms, verify details, etc.
    # Example: driver.find_element(By.ID, "traveler-2-email").send_keys("jane@example.com")
else:
    # Default to 3 travelers (since you specified count is 1,2, or3)
    print("Processing 3 insured travelers...")
    # Add code for three travelers here

driver.quit()

Key Tips

  • Adjust Locators: Replace By.TAG_NAME, "li" with the actual selector for your website's insured people lists (e.g., By.CSS_SELECTOR, ".insured-person-item" if each traveler has a specific class).
  • Dynamic Content: Always use explicit waits (like WebDriverWait) to ensure elements are loaded before interacting with them—this avoids random NoSuchElementException errors.

内容的提问来源于stack exchange,提问作者usha sree

火山引擎 最新活动