
1. 项目概述如果你正在寻找一个上手快、对新手友好又能兼顾图像识别和传统元素定位的Web自动化测试方案那么Airtest-Selenium绝对值得你花时间研究。这个项目标题“【Airtest】Web自动化实战指南从零搭建Chrome测试环境”已经点明了核心用Airtest的思维和工具链来搞定基于Chrome浏览器的Web自动化测试。这不仅仅是又一个Selenium教程它解决的是很多测试同学特别是从移动端或游戏测试转过来的同学在面对纯代码的Selenium时产生的“水土不服”问题。Airtest-Selenium在Selenium的基础上封装了一层更符合Airtest用户习惯的API特别是引入了图像识别能力让你在写Web自动化脚本时可以像操作手机App一样通过截图、点击图片来完成部分操作大大降低了脚本编写的门槛。我见过不少团队Web自动化项目启动时轰轰烈烈最后却因为元素定位不稳定、维护成本高而搁浅。Airtest-Selenium提供的“双保险”思路——能用XPath就用XPath实在定位不到或者元素属性动态变化的就用图像识别兜底——在实际项目中非常实用。这篇文章我将带你从零开始手把手搭建一个基于Airtest-Selenium的Chrome测试环境并深入讲解其中的关键步骤、避坑技巧和实战心得。无论你是刚接触自动化测试的新手还是想为现有Selenium框架寻找补充方案的资深测试都能从这里获得可以直接落地的干货。2. 环境搭建从安装到第一个可运行脚本搭建环境是万事开头难的第一步很多人在这一步就被劝退。Airtest-Selenium的环境搭建核心是处理好Python环境、AirtestIDE、Chrome浏览器、Chromedriver驱动这四者之间的关系。我会带你走一遍最稳妥的路径。2.1 核心工具选型与安装顺序一个清晰的安装顺序能避免很多依赖冲突问题。我推荐的顺序是安装Python建议使用Python 3.7-3.9版本这是目前与Airtest相关库兼容性最好的范围。务必在安装时勾选“Add Python to PATH”将Python添加到系统环境变量。安装AirtestIDE从AirtestProject官网下载最新版的AirtestIDE。它是一个集成开发环境内置了Python解释器和Airtest、Poco等核心库对于初学者来说可以避免环境配置的麻烦直接上手写脚本。安装Chrome浏览器强烈建议将Chrome安装到默认路径Windows通常是C:\Program Files\Google\Chrome\Application或C:\Program Files (x86)\Google\Chrome\Application。很多“找不到Chrome二进制文件”的错误都源于非默认安装路径。配置Chromedriver这是Selenium控制Chrome的桥梁。关键点在于版本匹配。你需要查看已安装Chrome的版本在浏览器地址栏输入chrome://version/查看然后去Chromedriver官网下载对应版本或主要版本号一致的驱动。下载后将chromedriver.exe文件放置到以下任一位置推荐放入Python安装目录下的Scripts文件夹如C:\Python39\Scripts\因为该路径通常已在系统PATH中。放入Chrome浏览器的安装目录如C:\Program Files\Google\Chrome\Application\。或者将其所在目录添加到系统的PATH环境变量中。注意很多教程会混淆chrome.exe和chromedriver.exe。chrome.exe是浏览器本体chromedriver.exe是驱动。在AirtestIDE中配置的是chrome.exe的路径而Selenium运行时寻找的是chromedriver.exe。确保两者都存在且路径可访问。2.2 在AirtestIDE中配置与验证安装好上述工具后打开AirtestIDE进行关键配置启动Selenium Window首次打开AirtestIDE时左侧设备面板可能没有“Selenium Window”。你需要点击顶部菜单栏的Window-Selenium Window将其勾选上它就会出现在左侧面板。配置Chrome路径点击AirtestIDE顶部的选项-设置在设置窗口中找到Selenium设置项。在Chrome binary path一栏填入你的chrome.exe的完整路径例如C:\Program Files\Google\Chrome\Application\chrome.exe。这一步是告诉AirtestIDE你的Chrome在哪里。验证环境在左侧的Selenium Window中点击那个像地球仪一样的“初始化代码”按钮。如果配置正确IDE会弹出一个Chrome浏览器窗口并在代码编辑器中自动生成初始化代码。如果报错请根据错误信息检查上述步骤。此时你的基础环境就准备好了。生成的初始化代码类似这样# -*- encodingutf8 -*- __author__ “AirtestProject” from selenium import webdriver from selenium.webdriver.common.keys import Keys from airtest_selenium.proxy import WebChrome # 创建实例代码运行到这里会打开一个chrome浏览器 driver WebChrome() driver.implicitly_wait(20)看到浏览器成功打开恭喜你最难的一关已经过了。3. Airtest-Selenium核心能力解析不止于SeleniumAirtest-Selenium不是要替代Selenium而是增强它。理解它封装了哪些能力以及这些能力适用的场景是你写出高效、稳定脚本的关键。3.1 图像识别不稳定元素的“救命稻草”这是Airtest-Selenium相较于纯Selenium最大的亮点。传统Web自动化严重依赖元素的ID、Class、XPath等属性一旦前端改版或属性动态生成脚本就可能失效。图像识别提供了另一条路。airtest_touch 通过图片点击元素。在Selenium Window中点击“图像识别点击”按钮然后在打开的浏览器页面上框选你想点击的区域比如一个图标、一个没有固定ID的按钮IDE会自动生成类似driver.airtest_touch(Template(r“tpl123.png”))的代码。脚本运行时会在当前页面寻找匹配这张图片的区域并进行点击。assert_template 断言某个图片存在于页面中。常用于验证页面是否成功跳转或者某个特定元素如图片验证码、状态图标是否出现。用法与airtest_touch类似生成的是断言语句。实操心得图像识别非常消耗性能且受屏幕分辨率、浏览器缩放比例影响。它最适合作为辅助和兜底方案。我的策略是优先使用稳定的XPath或CSS选择器进行定位和操作对于那些确实没有稳定属性、或者操作逻辑与视觉强相关的元素如验证码、canvas绘制的图形、复杂图表再使用图像识别。同时尽量截取特征明显、大小适中的图片作为模板。3.2 多标签页与页面截图提升脚本健壮性Web测试中点击链接常常会打开新标签页处理标签页切换是个常见痛点。switch_to_new_tab()和switch_to_previous_tab() 这两个封装好的方法极大地简化了操作。当你点击一个链接打开新标签页后直接调用driver.switch_to_new_tab()就能切换到最新打开的页面。操作完毕后调用driver.switch_to_previous_tab()即可切回原页面。你不再需要手动维护一个窗口句柄列表。snapshot() 对当前浏览器窗口进行截图并保存。这在调试和生成测试报告时非常有用。你可以指定保存路径也可以使用默认路径通常是脚本运行日志目录。3.3 报告生成集成Airtest的丰富报告Airtest的HTML测试报告非常直观包含了步骤截图、操作记录和断言结果。Airtest-Selenium的脚本也可以生成同样格式的报告。你需要使用Airtest的LogToHtml报告类并特别指定plugins参数为[“airtest_selenium.report”]来加载Selenium报告插件。一个简单的报告生成示例from airtest.report.report import LogToHtml # 脚本运行后生成报告 h1 LogToHtml( script_rootr‘D:\your_script.air’, # 你的脚本目录 log_rootr“D:\your_script.air\log”, # 脚本运行日志目录 export_dirr“D:\test_report”, # 报告输出目录 lang‘zh’, plugins[“airtest_selenium.report”] # 关键加载Selenium插件 ) h1.report()这样生成的报告里你的每一步Web操作包括图像识别点击都会有对应的截图和说明排查问题一目了然。4. 实战脚本编写与调试技巧理论说再多不如动手写一段。我们来完成一个完整的实战脚本打开百度搜索关键词并验证搜索结果。4.1 脚本编写步骤分解初始化与打开页面使用前面生成的初始化代码打开百度首页。定位搜索框并输入使用Selenium的find_element_by_id定位搜索框百度搜索框的id通常是“kw”然后用send_keys输入搜索词。模拟回车搜索同样定位搜索框使用send_keys(Keys.ENTER)模拟键盘回车。也可以定位“百度一下”按钮并点击。验证搜索结果这里我们可以展示两种验证方式。方式一元素断言使用Selenium的显式等待或assert验证包含搜索结果的容器元素例如id“content_left”存在。方式二图像断言使用Airtest-Selenium的assert_template对搜索结果页的某个特征区域如百度Logo进行截图并断言。处理新标签页可选如果点击搜索结果会打开新标签页记得使用switch_to_new_tab()进行切换并在操作后关闭或切回。一个整合的示例脚本如下# -*- encodingutf8 -*- __author__ “AirtestProject” from airtest.core.api import * # 引入Airtest核心API用于图像识别 from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from airtest_selenium.proxy import WebChrome # 1. 初始化浏览器 driver WebChrome() driver.implicitly_wait(10) # 设置隐式等待 driver.maximize_window() # 最大化窗口确保页面元素布局稳定 # 2. 打开百度 driver.get(“https://www.baidu.com“) sleep(2) # 等待页面加载可使用更智能的显式等待替代 # 3. 定位搜索框并输入关键词 search_box driver.find_element(By.ID, “kw”) search_box.send_keys(“Airtest自动化测试”) sleep(1) # 4. 执行搜索按回车 search_box.send_keys(Keys.ENTER) # 或者点击“百度一下”按钮driver.find_element(By.ID, ‘su’).click() # 5. 等待搜索结果加载并进行验证 try: # 方式一等待搜索结果区域出现元素断言 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, “content_left”)) ) print(“搜索结果页面加载成功通过元素定位验证。”) except TimeoutException: print(“错误未找到搜索结果区域。”) # 方式二备选使用图像识别验证百度Logo存在 # 假设你已事先截取了百度Logo在结果页的图片保存为 ‘baidu_logo_result.png’ # driver.assert_template(Template(r“baidu_logo_result.png”), “搜索结果页验证失败”) # print(“搜索结果页面加载成功通过图像识别验证。”) # 6. 可选点击第一个搜索结果示例 try: first_result driver.find_element(By.XPATH, ‘//div[id“content_left”]//h3/a‘) # 简化XPath实际可能需要更精确 first_result.click() sleep(2) # 切换至新标签页 driver.switch_to_new_tab() print(“已切换到新打开的标签页。”) # ... 在新页面进行操作 ... # 关闭新标签页并切回 driver.close() driver.switch_to_previous_tab() except Exception as e: print(f“点击第一个搜索结果时出错{e}”) # 7. 关闭浏览器 sleep(3) driver.quit()4.2 调试与脚本录制AirtestIDE的Selenium Window提供了强大的辅助功能能极大提升脚本编写效率元素检测点击“元素检测”按钮然后在浏览器页面上移动鼠标IDE会高亮显示当前指向的元素并显示其HTML属性如ID、Class、XPath。点击后可以直接生成该元素的定位代码如find_element_by_xpath(…)。脚本录制点击“开始录制”按钮随后你在浏览器中的操作点击、输入等会被自动转换成Selenium代码并插入到编辑器中。这对于快速生成基础操作脚本非常有用。但请注意录制的代码通常比较“死板”生成的XPath可能不够健壮需要你后期进行优化和封装。5. 避坑指南常见问题与解决方案实录在实际使用中我踩过不少坑。这里把最常见的问题和解决方案整理出来希望能帮你节省大量排查时间。5.1 “unknown error: cannot find Chrome binary” 错误这是最高频的错误没有之一。问题现象在AirtestIDE里点击按钮能打开浏览器但运行脚本时却报此错误。根本原因Selenium的WebDriver没有找到Chrome浏览器的可执行文件chrome.exe。解决方案检查AirtestIDE设置首先确认选项-设置-Selenium中的Chrome binary path配置正确指向了chrome.exe。检查Chromedriver确认chromedriver.exe的版本与已安装的Chrome浏览器版本匹配并且其所在目录已添加到系统PATH环境变量或放在了Python的Scripts目录下。使用代码指定路径终极方案如果以上都不行可以在代码中显式指定Chrome和Chromedriver的路径。这是最可靠的方式。from selenium.webdriver.chrome.options import Options from airtest_selenium.proxy import WebChrome chrome_options Options() # 指定chrome.exe的路径 chrome_options.binary_location r“C:\Program Files\Google\Chrome\Application\chrome.exe” # 初始化时传入options和chromedriver路径 driver WebChrome(optionschrome_options, executable_pathr“C:\webdrivers\chromedriver.exe”) # 指定chromedriver路径5.2 脱离AirtestIDE运行脚本报错 “No module named ‘airtest_selenium’”问题原因AirtestIDE内置了所有必要的Python包。但当你使用本地的Python环境如PyCharm、命令行运行脚本时缺少对应的库。解决方案在本地Python环境中使用pip安装所需包。pip install airtest-selenium注意如果安装airtest-selenium时失败提示缺少pynput则需要先安装它pip install pynput pip install airtest-selenium5.3 图像识别方法报错 “NameError: name ‘Template’ is not defined”问题原因使用了airtest_touch或assert_template但没有导入Airtest的核心API。解决方案在脚本文件开头添加导入语句。from airtest.core.api import * # 这行导入包含了Template类5.4 混淆 WebChrome() 与 webdriver.Chrome()核心区别from airtest_selenium.proxy import WebChrome然后driver WebChrome()这是Airtest-Selenium的用法创建的driver对象可以使用airtest_touch,snapshot等扩展方法。from selenium import webdriver然后driver webdriver.Chrome()这是原生Selenium的用法创建的driver对象不能使用Airtest-Selenium的扩展方法。错误示例如果你用webdriver.Chrome()初始化却调用driver.airtest_touch(…)就会得到AttributeError: ‘WebDriver’ object has no attribute ‘airtest_touch’。原则如果你想用Airtest-Selenium的图像识别等增强功能必须使用WebChrome()来初始化驱动。5.5 输入与键盘操作在Web自动化中向输入框填文本不是用Airtest里的text()而是用Selenium的send_keys()。模拟键盘事件如回车、Tab则需要从selenium.webdriver.common.keys导入Keys类。from selenium.webdriver.common.keys import Keys element driver.find_element(By.ID, “kw”) element.send_keys(“搜索内容”) # 输入文本 element.send_keys(Keys.ENTER) # 模拟按下回车键 element.send_keys(Keys.CONTROL, ‘a’) # 模拟按下CtrlA全选5.6 关于Mac系统的限制目前Airtest-Selenium的图像识别相关功能如airtest_touch,assert_template在Mac系统上暂不支持。如果你在Mac上使用调用这些方法会收到提示Current OS is not ‘Windows’!。在Mac上你仍然可以使用Airtest-Selenium来运行基于元素定位的Selenium脚本但无法使用其图像识别特性。这是选择技术方案时需要评估的一点。6. 工程化建议让脚本更健壮、更易维护写出一两个能跑的脚本只是开始要想在项目中长期应用必须考虑工程化。使用Page Object模式这是UI自动化测试的黄金法则。将每个页面封装成一个类页面上的元素定位和基本操作作为这个类的方法。这样当页面元素发生变化时你只需要修改这一个类文件而不是散落在无数个测试脚本里。Airtest-Selenium的脚本完全可以套用这种模式。合理混合定位策略确立一个优先级。我的习惯是唯一ID CSS Selector 相对稳定的XPath 图像识别。图像识别是最后的手段用于处理前三种方法都无法解决的“钉子户”元素。善用等待Web页面加载需要时间。不要一味使用sleep而是多用Selenium提供的显式等待WebDriverWait和隐式等待implicitly_wait。显式等待针对特定条件如元素可点击、元素存在更加智能和高效。数据与脚本分离将测试数据如用户名、密码、搜索关键词从脚本中抽离出来存放在CSV、JSON或YAML文件中。脚本读取这些数据来执行测试使得一套脚本可以覆盖多组测试数据。日志与报告务必利用好Airtest-Selenium的报告功能。清晰的报告是测试工作的输出物也是与开发、产品沟通问题的最有力证据。确保每一步关键操作和断言都有相应的日志或截图记录在报告中。搭建环境只是起点真正的价值在于如何利用Airtest-Selenium的特性构建出适应你项目需求的、稳定且低维护成本的自动化测试体系。从一个小脚本开始逐步封装、抽象你会发现Web自动化测试并没有想象中那么困难。