第3篇:UI自动化核心操作:输入、点击、弹窗、下拉框全场景实战

前言: Hello 大家好!我是励志死磕计算机~ 上一篇我们搞定了UI自动化的"基石"------元素定位,相信大家已经能熟练找到网页上的各种元素了。但定位到元素只是第一步,更核心的是"对元素进行操作"------比如输入文本、点击按钮、处理弹窗、选择下拉框等。这篇文章我会聚焦"定位后的核心操作",覆盖表单交互、特殊元素操作、等待机制等企业高频场景,全程用实战代码讲解,还会配套"特殊元素避坑手册",帮你彻底解决"定位到元素却操作失败"的问题!

本文核心目标:

  • 掌握表单交互核心操作(输入、清空、点击、文本获取、状态判断)

  • 精通企业高频特殊元素操作(下拉框、弹窗、文件上传、iframe切换、窗口切换)

  • 理解并掌握3种等待机制,写出稳定不报错的自动化脚本

  • 完成完整登录流程综合实战,串联所有核心操作

一、前置知识:操作元素的核心逻辑

在开始操作之前,我们先明确一个核心逻辑:所有操作都必须建立在"元素已定位且可交互"的基础上。如果元素未加载完成、被遮挡、不可点击,直接执行操作就会报错。

Selenium操作元素的通用步骤:

  1. 通过定位方式找到元素(得到元素对象)

  2. 调用元素对象的操作方法(如输入、点击)

  3. (可选)验证操作结果(如获取文本、判断状态)

避坑提示:操作元素前,优先确认元素状态------是否可见(is_displayed())、是否可点击(is_enabled()),避免因元素不可交互导致操作失败。

二、基础交互操作:表单场景核心(必掌握)

表单是网页最常见的交互场景(如登录页、注册页、搜索页),核心操作包括"输入文本、清空内容、点击按钮、获取文本/属性、判断状态",这5种操作是UI自动化的基础,必须熟练掌握!我们以"登录页"为实战场景,逐一讲解。

1. 输入与清空:send_keys() & clear()

适用场景:输入框(如账号、密码、搜索框),核心是"先清空再输入"(避免输入框有默认文本导致输入错误)。

实战代码(登录页账号密码输入):

复制代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 基础交互:输入与清空

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time

# 初始化驱动
driver = webdriver.Chrome(ChromeDriverManager().install())
# 访问测试登录页(这里用模拟登录页,实际可替换为自己的目标页面)
driver.get("https://xxx.com/login")  # 替换为真实登录页URL
time.sleep(2)

# 1. 定位账号输入框,先清空再输入
username_input = driver.find_element_by_id("username")  # 假设账号输入框id为username
username_input.clear()  # 清空输入框(避免默认文本干扰)
username_input.send_keys("test_user123")  # 输入账号

# 2. 定位密码输入框,先清空再输入
password_input = driver.find_element_by_id("password")  # 假设密码输入框id为password
password_input.clear()
password_input.send_keys("test_pass456")  # 输入密码

time.sleep(3)  # 查看输入效果
driver.quit()

小技巧:输入特殊字符(如空格、回车)可使用Keys类,需导入from selenium.webdriver.common.keys import Keys,示例:send_keys(Keys.ENTER)(输入回车)、send_keys(Keys.SPACE)(输入空格)。

2. 点击操作:click() & 悬浮点击

适用场景:按钮(如登录按钮、搜索按钮)、链接、复选框等,分为"普通点击"和"悬浮后点击"两种常见情况。

(1)普通点击:click()

实战代码(登录按钮点击):

复制代码
# 延续上面的登录页场景,定位登录按钮并点击
login_button = driver.find_element_by_id("loginBtn")  # 假设登录按钮id为loginBtn
login_button.click()  # 普通点击
(2)悬浮点击:ActionChains(鼠标悬浮后再点击)

适用场景:下拉菜单(如导航栏的下拉选项,需要悬浮后才显示)、悬浮按钮等。

复制代码
# 悬浮点击实战:定位导航栏"我的账户",悬浮后点击"个人中心"
from selenium.webdriver.common.action_chains import ActionChains  # 导入鼠标操作类

# 访问目标页面
driver.get("https://xxx.com")
time.sleep(2)

# 1. 定位"我的账户"导航项(需要悬浮的元素)
my_account = driver.find_element_by_link_text("我的账户")

# 2. 初始化ActionChains对象,执行悬浮操作
action = ActionChains(driver)
action.move_to_element(my_account).perform()  # 悬浮到"我的账户"上
time.sleep(1)  # 等待下拉菜单显示

# 3. 点击下拉菜单中的"个人中心"
personal_center = driver.find_element_by_link_text("个人中心")
personal_center.click()

time.sleep(3)
driver.quit()

3. 文本与属性获取:text & get_attribute()

适用场景:验证操作结果(如登录成功后显示用户名、获取元素的属性值),核心是两个常用方法:

  • element.text:获取元素的可见文本(如按钮上的"登录"、链接文本)

  • element.get_attribute("属性名"):获取元素的指定属性值(如input的value、a标签的href)

实战代码(验证登录成功):

复制代码
# 延续登录场景,登录成功后验证用户名是否正确
driver.get("https://xxx.com/login")
time.sleep(2)

# 输入账号密码并点击登录(代码同上)
username_input = driver.find_element_by_id("username")
username_input.send_keys("test_user123")
password_input = driver.find_element_by_id("password")
password_input.send_keys("test_pass456")
driver.find_element_by_id("loginBtn").click()
time.sleep(3)

# 1. 获取登录后的用户名文本,验证是否登录成功
welcome_text = driver.find_element_by_id("welcome").text  # 假设欢迎语元素id为welcome
print("欢迎语:", welcome_text)
if "test_user123" in welcome_text:
    print("登录成功!")
else:
    print("登录失败!")

# 2. 获取首页logo的href属性
logo_href = driver.find_element_by_id("logo").get_attribute("href")
print("logo链接:", logo_href)

driver.quit()

4. 状态判断:is_displayed() & is_enabled()

适用场景:判断元素是否可见、是否可点击(避免操作不可见/不可点击的元素导致报错)。

  • element.is_displayed():返回布尔值,True表示元素可见,False表示不可见

  • element.is_enabled():返回布尔值,True表示元素可点击,False表示不可点击

实战代码(登录按钮状态判断):

复制代码
driver.get("https://xxx.com/login")
time.sleep(2)

# 定位登录按钮,判断状态
login_button = driver.find_element_by_id("loginBtn")

# 判断是否可见
if login_button.is_displayed():
    print("登录按钮可见")
else:
    print("登录按钮不可见")

# 判断是否可点击
if login_button.is_enabled():
    print("登录按钮可点击,执行点击操作")
    login_button.click()
else:
    print("登录按钮不可点击,无法操作")

driver.quit()

三、特殊元素操作:企业高频场景(重点攻克)

除了基础表单操作,下拉框、弹窗、文件上传、iframe、窗口切换这些"特殊元素"是企业自动化测试中的高频场景,也是新手容易卡壳的地方。下面逐一讲解核心操作方法和避坑技巧。

1. 下拉框选择:Select类(必掌握)

适用场景:网页中的下拉选择框(如地址选择、日期选择、性别选择),Selenium提供了Select类专门处理下拉框,无需手动点击展开再选择。

核心用法(3种选择方式):
  • select_by_index(索引):根据下拉选项的索引选择(索引从0开始)

  • select_by_value("值"):根据选项的value属性值选择

  • select_by_visible_text("文本"):根据选项的可见文本选择(最常用)

实战代码(地址下拉框选择):

复制代码
# 下拉框操作实战
from selenium.webdriver.support.select import Select  # 导入Select类

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://xxx.com/register")  # 假设是注册页,有地址下拉框
time.sleep(2)

# 定位下拉框元素(必须是<select>标签)
address_select = driver.find_element_by_id("address")

# 初始化Select对象
select = Select(address_select)

# 方式1:根据索引选择(选择第2个选项,索引为1)
# select.select_by_index(1)

# 方式2:根据value属性选择(假设选项的value为"beijing")
# select.select_by_value("beijing")

# 方式3:根据可见文本选择(选择"北京市")
select.select_by_visible_text("北京市")

time.sleep(3)

# 可选:获取当前选中的选项文本
selected_option = select.first_selected_option.text
print("当前选中的地址:", selected_option)

driver.quit()

避坑提示:Select类仅适用于<select>标签的下拉框!如果是自定义下拉框(用div、ul模拟的),需要用"点击展开下拉框→定位选项并点击"的方式操作(类似悬浮点击)。

2. 弹窗处理:alert/confirm/prompt(3种类型)

网页弹窗分为3种:警告弹窗(alert)、确认弹窗(confirm)、输入弹窗(prompt),Selenium通过switch_to.alert切换到弹窗进行操作。

核心操作方法:
  • driver.switch_to.alert:切换到当前弹窗

  • alert.text:获取弹窗文本

  • alert.accept():点击"确认"按钮

  • alert.dismiss():点击"取消"按钮(仅confirm/prompt可用)

  • alert.send_keys("文本"):在弹窗中输入文本(仅prompt可用)

实战代码(3种弹窗全处理):

复制代码
# 弹窗处理实战
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://xxx.com/popup")  # 包含弹窗的测试页面
time.sleep(2)

# 1. 处理警告弹窗(alert)
driver.find_element_by_id("alertBtn").click()  # 点击触发警告弹窗
time.sleep(1)
alert = driver.switch_to.alert  # 切换到弹窗
print("警告弹窗文本:", alert.text)
alert.accept()  # 点击确认关闭弹窗
time.sleep(2)

# 2. 处理确认弹窗(confirm)
driver.find_element_by_id("confirmBtn").click()  # 点击触发确认弹窗
time.sleep(1)
confirm = driver.switch_to.alert
print("确认弹窗文本:", confirm.text)
# confirm.accept()  # 点击确认
confirm.dismiss()  # 点击取消
time.sleep(2)

# 3. 处理输入弹窗(prompt)
driver.find_element_by_id("promptBtn").click()  # 点击触发输入弹窗
time.sleep(1)
prompt = driver.switch_to.alert
print("输入弹窗文本:", prompt.text)
prompt.send_keys("测试输入内容")  # 输入文本
prompt.accept()  # 点击确认
time.sleep(3)

driver.quit()

3. 文件上传:send_keys()(避坑关键)

文件上传是新手常踩坑的场景,很多人会试图点击"上传按钮"打开系统文件选择框,但系统弹窗无法用Selenium操作。正确做法是:定位到上传控件的input标签,用send_keys()直接传入文件路径

实战代码(文件上传):

复制代码
# 文件上传实战
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://xxx.com/upload")  # 包含文件上传的页面
time.sleep(2)

# 定位文件上传的input标签(关键:必须是input标签,type="file")
upload_input = driver.find_element_by_id("fileUpload")

# 用send_keys()传入文件的绝对路径(无需点击上传按钮)
# 注意:路径中的反斜杠用双反斜杠(\\)或前面加r(原始字符串)
file_path = r"C:\test_files\test.txt"  # 替换为自己的文件路径
upload_input.send_keys(file_path)

time.sleep(3)  # 等待上传完成
print("文件上传成功!")

driver.quit()

避坑技巧:如果找不到input标签(被隐藏了),可以用JavaScript代码先让input标签可见,再进行操作。示例:driver.execute_script("document.getElementById('fileUpload').style.display='block';")

4. iframe切换:解决"元素定位不到"的高频问题

iframe是网页中的"子网页",如果元素在iframe内,直接定位会提示"no such element"。解决方法:先切换到iframe,再定位元素;操作完成后,切换回主页面

切换iframe的3种方式:
  • 通过id切换:driver.switch_to.frame("iframe_id")

  • 通过name切换:driver.switch_to.frame("iframe_name")

  • 通过元素对象切换:driver.switch_to.frame(iframe_element)

实战代码(iframe切换):

复制代码
# iframe切换实战
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://xxx.com/iframeTest")  # 包含iframe的页面
time.sleep(2)

# 1. 切换到iframe(假设iframe的id为"testIframe")
driver.switch_to.frame("testIframe")
# 此时可以定位iframe内的元素了
iframe_input = driver.find_element_by_id("iframeInput")
iframe_input.send_keys("在iframe内输入文本")
time.sleep(2)

# 2. 切换回主页面(如果需要操作主页面的元素)
driver.switch_to.default_content()
# 此时可以定位主页面的元素了
main_button = driver.find_element_by_id("mainBtn")
main_button.click()

time.sleep(3)
driver.quit()

5. 窗口切换:新窗口打开后操作

点击链接或按钮后,有时会打开新窗口(如点击"帮助中心"链接打开新页面),此时代码默认仍在原窗口操作,需要切换到新窗口才能定位新窗口的元素。

核心步骤:
  1. 获取所有窗口的句柄(窗口的唯一标识):driver.window_handles

  2. 切换到目标窗口:driver.switch_to.window(handle)

实战代码(窗口切换):

复制代码
# 窗口切换实战
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://xxx.com")  # 主页面
time.sleep(2)

# 1. 获取原窗口句柄(第一个窗口)
original_window = driver.window_handles[0]
print("原窗口句柄:", original_window)

# 2. 点击链接打开新窗口(假设"帮助中心"链接会打开新窗口)
driver.find_element_by_link_text("帮助中心").click()
time.sleep(2)

# 3. 获取所有窗口句柄(此时有2个窗口)
all_windows = driver.window_handles
print("所有窗口句柄:", all_windows)

# 4. 切换到新窗口(最后一个窗口,索引为-1)
driver.switch_to.window(all_windows[-1])
# 操作新窗口的元素
help_title = driver.find_element_by_id("helpTitle").text
print("新窗口标题:", help_title)
time.sleep(2)

# 5. 切换回原窗口
driver.switch_to.window(original_window)
print("切换回原窗口,原窗口标题:", driver.title)

driver.quit()

四、等待机制:自动化稳定性的核心(必掌握)

新手写的自动化脚本经常报错,很大一部分原因是"没有加等待"------代码执行速度比网页加载速度快,元素还没出现就开始定位,导致定位失败。Selenium提供了3种等待机制,核心原则:显式等待>隐式等待>强制等待

1. 强制等待:time.sleep(秒数)(不推荐)

原理:固定等待指定的秒数,不管元素是否加载完成。

优缺点:优点是简单;缺点是浪费时间(元素早加载完成仍要等)、不稳定(网络慢时等待时间不够仍会报错)。

适用场景:仅用于调试,不推荐在正式脚本中使用。

复制代码
import time
time.sleep(5)  # 强制等待5秒

2. 隐式等待:implicitly_wait(秒数)(全局生效)

原理:设置一个全局等待时间,在这个时间内,Selenium会不断尝试定位元素,直到元素出现或超时。

优缺点:优点是全局生效,无需重复写等待代码;缺点是只能等待元素"出现",不能等待元素"可交互"(如元素已出现但还不可点击,仍会报错)。

适用场景:作为基础等待,配合显式等待使用。

复制代码
# 隐式等待实战
driver = webdriver.Chrome(ChromeDriverManager().install())
# 设置隐式等待10秒(全局生效)
driver.implicitly_wait(10)

driver.get("https://xxx.com")
# 此时会在10秒内不断尝试定位元素,直到出现或超时
element = driver.find_element_by_id("targetId")
element.click()

driver.quit()

3. 显式等待:WebDriverWait+expected_conditions(精准等待,推荐)

原理:针对指定元素,设置等待时间和"等待条件"(如元素可点击、元素可见),在等待时间内,每隔0.5秒检查一次条件是否满足,满足则继续执行,超时则报错。

核心优势:精准控制,可等待元素"可交互",是企业级脚本的首选等待方式。

常用等待条件(expected_conditions):
  • EC.element_to_be_clickable((定位方式, 定位值)):元素可点击

  • EC.presence_of_element_located((定位方式, 定位值)):元素存在(已加载完成)

  • EC.visibility_of_element_located((定位方式, 定位值)):元素可见

  • EC.text_to_be_present_in_element((定位方式, 定位值), 文本):元素包含指定文本

实战代码(显式等待):

复制代码
# 显式等待实战
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By  # 导入定位方式类

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://xxx.com")

# 显式等待:等待10秒,直到元素可点击
# 第一个参数:driver对象;第二个参数:等待时间(秒)
wait = WebDriverWait(driver, 10)
# 等待条件:元素(id为targetBtn)可点击
target_element = wait.until(
    EC.element_to_be_clickable((By.ID, "targetBtn"))
)

# 元素可点击后,执行点击操作
target_element.click()

driver.quit()

最佳实践:隐式等待(全局基础等待)+ 显式等待(关键元素精准等待)结合使用,既保证效率,又保证稳定性。

五、综合实战:完整登录流程串联所有操作

下面我们用一个完整的登录流程,串联前面学的所有核心操作:输入账号密码→点击登录→处理弹窗→切换iframe→验证登录成功→切换窗口→关闭浏览器,配套完整代码和注释。

复制代码
# 完整登录流程综合实战
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

# 初始化驱动,设置隐式等待10秒
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.implicitly_wait(10)
driver.maximize_window()  # 最大化浏览器窗口(可选,提升稳定性)

try:
    # 1. 访问登录页
    driver.get("https://xxx.com/login")
    print("成功访问登录页:", driver.title)

    # 2. 输入账号密码(先清空再输入)
    username_input = driver.find_element_by_id("username")
    username_input.clear()
    username_input.send_keys("test_user123")
    
    password_input = driver.find_element_by_id("password")
    password_input.clear()
    password_input.send_keys("test_pass456")
    print("账号密码输入完成")

    # 3. 点击登录按钮(显式等待按钮可点击)
    login_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "loginBtn"))
    )
    login_button.click()
    print("登录按钮点击完成")

    # 4. 处理登录成功后的弹窗
    alert = driver.switch_to.alert
    print("登录弹窗文本:", alert.text)
    alert.accept()
    print("弹窗处理完成")

    # 5. 切换到iframe内,验证用户信息
    driver.switch_to.frame("userIframe")
    user_info = driver.find_element_by_id("userInfo").text
    print("当前登录用户信息:", user_info)
    if "test_user123" in user_info:
        print("登录成功!")
    else:
        print("登录失败!")

    # 6. 切换回主页面,点击"帮助中心"打开新窗口
    driver.switch_to.default_content()
    help_link = driver.find_element_by_link_text("帮助中心")
    help_link.click()
    print("打开帮助中心新窗口")

    # 7. 切换到新窗口,获取帮助中心标题
    driver.switch_to.window(driver.window_handles[-1])
    print("帮助中心窗口标题:", driver.title)

except Exception as e:
    # 捕获异常并打印
    print("执行过程中出现错误:", str(e))

finally:
    # 无论是否出错,都等待3秒后关闭浏览器
    import time
    time.sleep(3)
    driver.quit()
    print("浏览器已关闭")

六、实战练习(巩固知识点)

请大家动手完成以下练习,巩固今天所学的核心操作:

需求:访问淘宝首页(https://www.taobao.com),完成以下操作:

  1. 输入"Python编程书籍"并点击搜索(基础输入+点击)。

  2. 搜索结果页中,悬浮到"分类"导航项,点击"计算机/互联网"(悬浮点击)。

  3. 选择下拉框中的"平装"选项(下拉框操作)。

  4. 点击某本书籍链接,打开新窗口(窗口切换)。

  5. 在新窗口中,获取书籍名称和价格(文本获取)。

提示:遇到登录弹窗可先手动关闭;淘宝的下拉框可能是自定义的,需要用"点击展开→定位选项点击"的方式操作。

七、总结与下一篇预告

本篇文章我们掌握了UI自动化的核心操作,总结一下重点:

  • 基础交互操作:输入(send_keys)、清空(clear)、点击(click)、文本/属性获取(text/get_attribute)、状态判断(is_displayed/is_enabled)。

  • 特殊元素操作:下拉框(Select类)、弹窗(switch_to.alert)、文件上传(input标签+send_keys)、iframe切换(switch_to.frame)、窗口切换(switch_to.window)。

  • 等待机制:显式等待是核心,配合隐式等待使用,保证脚本稳定性。

下一篇文章我们将进入"进阶阶段",学习企业级框架搭建------Pytest测试框架+PO模式,解决"零散脚本维护困难"的问题,从"写脚本"升级到"做项目",让你的自动化代码更规范、可复用!

如果这篇文章对你有帮助,别忘了点赞+收藏+关注,后续会持续更新UI自动化系列教程~ 有任何问题欢迎在评论区留言!

专栏地址:【保姆级实战】UI自动化从入门到企业落地全系列(持续更新)

相关推荐
27669582922 小时前
vercel 安全检测逆向 x-vercel-challenge-solution
开发语言·python·solution·vercel-solution·x-vercel·vercel逆向·ensun
释怀不想释怀2 小时前
Zabbix(安装模式)
运维·云原生·zabbix
linweidong2 小时前
AUTOSAR如何自动化生成BSW、RTE、AP模块并进行一致性校验?
运维·实时互动·自动化
dagouaofei2 小时前
AI PPT 工具怎么选?5个维度对比6款产品
人工智能·python·powerpoint
大佐不会说日语~2 小时前
Docker部署旧版本系统MySQL5.7+乱码问题解决方案
运维·docker·容器
YongCheng_Liang2 小时前
数据库核心概念深度解析:从基础原理到 SQL 分类
运维·数据库·sql
深蓝电商API2 小时前
Scrapy日志系统详解与生产环境配置
爬虫·python·scrapy
Irene.ll2 小时前
DAY25 异常处理
python
宇钶宇夕2 小时前
CoDeSys入门实战一起学习(六):CoDeSys软件模型核心架构——从分层结构到核心元素
运维·自动化