Python Selenium自动化测试:无法定位用户名与确认密码字段求助
OrangeHRM添加员工页面:用户名与确认密码字段的Selenium定位问题
我正在用Python Selenium做OrangeHRM的自动化测试,现在卡在了添加员工页面的用户名和确认密码字段定位上,求这两个字段的正确定位代码。
我尝试过的方法示例
- 用户名字段的尝试代码:
username_field = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '(//input[@class="oxd-input oxd-input--active"])[1]'))) username_field.send_keys('TestUsername')
- 密码字段可以正常工作:
Password = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@type="password"]'))).send_keys('madara123')
我的完整代码
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 import time driver = webdriver.Firefox() driver.get('https://opensource-demo.orangehrmlive.com/web/index.php/auth/login') username = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Username"]'))) username.send_keys('Admin') password = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@placeholder="Password"]'))) password.send_keys('admin123') driver.maximize_window() login_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[@type="submit"]'))) time.sleep(1) login_button.click() driver.get('https://opensource-demo.orangehrmlive.com/web/index.php/pim/viewEmployeeList') addbtn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[@class="oxd-button oxd-button--medium oxd-button--secondary"]'))) addbtn.click() first_name = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@class="oxd-input oxd-input--active orangehrm-firstname"]'))).send_keys('employe') mid_name = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@class="oxd-input oxd-input--active orangehrm-middlename"]'))).send_keys('x') last_name = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@class="oxd-input oxd-input--active orangehrm-lastname"]'))).send_keys('ONE') # 等待复选框加载 checkbox = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="oxd-switch-wrapper"]/label/input[@type="checkbox"]'))) # 用JavaScript点击复选框 driver.execute_script("arguments[0].click();", checkbox) # 尝试定位用户名字段(失败) username = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//label[text()="Username"]/following-sibling::div/input'))) username.send_keys('your_username') # 密码字段正常 Password = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@type="password"]'))).send_keys('madara123') # 尝试定位确认密码字段(失败) confirm_password_field = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '(//input[@class="oxd-input oxd-input--active"])[2]'))) confirm_password_field.send_keys(Password)
修复后的正确代码
针对用户名和确认密码字段,使用更稳定的定位方式,避免依赖动态变化的class或索引:
# 定位用户名字段:通过标签文本关联输入框 username_field = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, '//div[contains(@class, "oxd-input-group") and .//label[text()="Username"]]//input')) ) username_field.send_keys('TestUsername') # 定位密码字段 password_field = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, '//div[contains(@class, "oxd-input-group") and .//label[text()="Password"]]//input')) ) password_field.send_keys('madara123') # 定位确认密码字段:通过标签文本"Confirm Password"关联 confirm_password_field = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, '//div[contains(@class, "oxd-input-group") and .//label[text()="Confirm Password"]]//input')) ) confirm_password_field.send_keys('madara123')
说明
- 改用
visibility_of_element_located代替presence_of_element_located,确保元素不仅存在还可见,避免定位到未渲染完成的元素 - 基于标签文本(如"Username"、"Confirm Password")和父容器定位,比依赖动态class或索引更稳定,因为OrangeHRM的class会随交互状态变化
- 确认密码字段不能直接传入
Password变量(因为它是send_keys的返回值,为None),需要传入明文密码字符串
内容的提问来源于stack exchange,提问作者Md. Jahangir Alam
相关产品推荐
相关产品推荐

