在 Python Web UI 自动化测试 领域,掌握常用的函数是构建稳定、高效测试脚本的基础。本文将从零开始,深入剖析自动化测试中常用到的函数,结合实际案例,帮助你更好地理解和运用。类似于我们在服务器端进行性能测试时,需要理解并发连接数、QPS (Queries Per Second) 等指标,UI 自动化测试也需要掌握一些关键的函数,才能写出高质量的测试脚本。而很多初学者往往忽视这些基础,直接上手 Selenium 或 Playwright 等框架,导致在遇到问题时难以排查。
定位元素:find_element 和 find_elements
在 Web UI 自动化测试中,首要任务就是定位到需要操作的元素。Selenium 提供了 find_element 和 find_elements 两个核心函数用于元素定位。
find_element 用于定位单个元素,如果找到多个符合条件的元素,则返回第一个。如果未找到任何元素,则抛出 NoSuchElementException 异常。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome() # 或者其他浏览器驱动
driver.get("https://www.example.com")
# 通过 ID 定位元素
element = driver.find_element(By.ID, "element_id")
# 通过 CSS Selector 定位元素
element = driver.find_element(By.CSS_SELECTOR, "div.container > p:first-child")
# 通过 XPath 定位元素 (不推荐,效率较低)
element = driver.find_element(By.XPATH, "//div[@class='container']/p[1]")
#获取元素的文本内容
element_text = element.text
print(element_text)
driver.quit()
find_elements 用于定位所有符合条件的元素,返回一个列表。即使未找到任何元素,也不会抛出异常,而是返回一个空列表。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# 定位所有链接
links = driver.find_elements(By.TAG_NAME, "a")
for link in links:
print(link.get_attribute("href")) # 打印所有链接的 href 属性
driver.quit()
实战避坑:
- 选择合适的定位方式: 尽量避免使用 XPath,尤其是在页面结构复杂的情况下,XPath 的效率会大幅降低。优先考虑 ID、CSS Selector 等定位方式。
- 处理
NoSuchElementException异常: 在使用find_element时,一定要进行异常处理,避免程序崩溃。可以使用 try...except 语句捕获该异常,并进行相应的处理,例如打印日志、截图等。 - 动态加载元素: 很多 Web 应用使用 Ajax 或 JavaScript 进行动态加载,在页面加载完成后,元素才会出现。这时需要使用显式等待或隐式等待,等待元素加载完成后再进行定位。类似 Nginx 需要配置合适的 keepalive_timeout 参数,避免连接过早关闭,UI 测试也需要等待元素加载完成。
元素操作:click、send_keys、clear
定位到元素后,接下来就是对元素进行操作。常用的元素操作函数包括 click、send_keys 和 clear。
click:模拟鼠标点击元素。send_keys:向元素输入文本。clear:清空元素的内容。
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# 定位输入框
input_element = driver.find_element(By.ID, "search_input")
# 输入文本
input_element.send_keys("Python Web UI 自动化测试")
# 点击搜索按钮
search_button = driver.find_element(By.ID, "search_button")
search_button.click()
# 清空输入框
input_element.clear()
# 再次输入文本
input_element.send_keys("Selenium")
search_button.click()
driver.quit()
实战避坑:
- 确保元素可见: 有些元素可能被其他元素遮挡,或者不在当前视口内,这时无法进行点击或输入操作。可以使用
execute_script方法滚动到元素可见的位置。 - 处理不可交互元素: 有些元素可能被禁用(disabled),或者只读(readonly),这时无法进行输入操作。需要先检查元素的属性,确定是否可以进行操作。
- 使用显式等待: 在输入文本或点击按钮后,页面可能会发生跳转或刷新,这时需要使用显式等待,等待页面加载完成后再进行后续操作。
浏览器操作:get、back、forward、refresh
除了元素操作,还需要掌握一些常用的浏览器操作函数,例如 get、back、forward 和 refresh。
get:打开指定的 URL。back:后退到上一个页面。forward:前进到下一个页面。refresh:刷新当前页面。
from selenium import webdriver
driver = webdriver.Chrome()
# 打开页面
driver.get("https://www.example.com")
# 后退
driver.back()
# 前进
driver.forward()
# 刷新
driver.refresh()
driver.quit()
实战避坑:
- 处理页面加载超时: 如果页面加载时间过长,可能会导致测试失败。可以设置页面加载超时时间,避免程序一直等待。类似 Nginx 的 proxy_read_timeout 参数,防止 upstream 服务响应过慢。
- 处理弹窗: 有些页面可能会弹出警告框、确认框或 prompt 框,需要使用
switch_to.alert方法切换到弹窗,并进行相应的操作。 - 处理多窗口: 有些操作可能会打开新的窗口或标签页,需要使用
window_handles属性获取所有窗口的句柄,并使用switch_to.window方法切换到指定的窗口。
高级技巧:execute_script 和 screenshots
除了上述常用函数,还可以使用 execute_script 方法执行 JavaScript 代码,实现一些高级功能。例如,滚动到页面底部、修改元素的样式、获取元素的属性等。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 获取元素的属性
element = driver.find_element(By.ID, "element_id")
attribute_value = driver.execute_script("return arguments[0].getAttribute('value');", element)
print(attribute_value)
driver.quit()
另外,截图功能也是 UI 自动化测试中非常重要的一个环节。可以使用 save_screenshot 方法保存当前页面的截图,方便问题排查。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# 截图
driver.save_screenshot("screenshot.png")
driver.quit()
实战避坑:
- 谨慎使用
execute_script: 尽量避免在自动化测试中使用 JavaScript 代码,因为这会增加测试的复杂性和维护成本。只有在 Selenium 无法实现的功能时,才考虑使用execute_script。 - 合理命名截图文件: 为了方便问题排查,建议在截图文件名中包含测试用例名称、时间戳等信息。
掌握这些常用的函数,并结合实际项目进行练习,你就能逐步掌握 Python Web UI 自动化测试 的核心技能,构建稳定、高效的自动化测试体系。后续我们可以结合 Nginx + uWSGI 部署 Python Web 应用的经验,将 UI 自动化测试集成到 CI/CD 流程中,实现自动化测试的持续集成。
冠军资讯
DevOps小王子