UI自动化-其二
-
设计思路
- 使用selenium IDE进行脚本录制与生成
- 再进行断言
-
断言方式:
可多种方式同时验证
-
assert "退出系统" in self.login.driver.page_source -
验证跳转后的地址的方式:
WebDriverWait(self.driver, timeout).until(EC.url_matches(url)) -
等待元素出现
WebDriverWait(self.driver, timeout).until(EC.presence_of_all_elements_located(locator))
-
-
接口自动化完全可以取代UI自动化啊,UI自动化的作用很小啊,为什么要做
虽然接口自动化在很多方面具有优势,但 UI 自动化仍然有其不可替代的作用,原因如下:
- 更接近用户真实体验:UI 自动化直接模拟用户在界面上的操作,能够更全面地验证整个应用程序的端到端流程,包括页面元素的显示、交互效果、视觉布局等,确保最终用户的使用体验。
- 发现前端问题:接口测试无法检测到前端的诸如页面加载错误、样式问题、JavaScript 错误等与用户界面相关的问题,而 UI 自动化可以覆盖这些方面。
- 验证复杂的用户交互场景:对于一些涉及多个页面、多个操作步骤以及复杂的用户交互逻辑的场景,UI 自动化能够更直观地进行模拟和验证。
- 补充测试覆盖度:即使接口测试已经很完善,UI 自动化仍可以作为一种补充手段,增加测试的覆盖范围,发现一些接口测试难以覆盖的边缘情况和特殊场景。
- 可视化结果展示:UI 自动化的测试结果通常更直观、更易于理解和展示,对于非技术人员(如产品经理、客户等)来说,能够更清晰地了解应用程序的功能是否正常。
- 与手动测试结合:在一些情况下,UI 自动化可以与手动测试相结合,例如在冒烟测试阶段,先运行 UI 自动化脚本快速检查主要功能,然后再进行深入的手动探索性测试。
综上所述,虽然接口自动化是重要的测试手段,但 UI 自动化在保证软件质量和用户体验方面仍然发挥着重要作用,不能被完全取代。在实际项目中,通常会根据项目需求和特点,合理地结合使用接口自动化和 UI 自动化,以达到最佳的测试效果。
-
框架设计
- 一般都会有一个config.yaml文件
- basePage,包含页面的基本操作,截图,定义driver,等待元素出现等。整洁是整洁,但是如果使用IDE的话,是不是有点麻烦,本来是写好的脚本,又要修改。而且这些基本操作只是加了个捕获异常,没这个必要了吧
- 用例包,一个模块一个py文件(更像是一个page一个py文件)。此py文件中只包含逻辑,调用方法,方法存放在Page包下,包含所需的流程脚本,然后这个Page继承了BasePage,很优雅啊。每个py中存在不同的用例,比如部门模块,包含增加,删除等。基本上架构就是这样
-
UI自动化框架设计技巧
- 页面对象模式(Page Object Model),这样元素定位和操作逻辑分开,便于维护。
- 分层架构,把测试用例、页面对象、工具类分开,结构清晰。
- 统一管理定位器,比如用YAML或JSON文件,这样修改起来方便。
-
统一管理定位器的必要性
- 提升可维护性
- 集中修改:当UI元素属性(如ID、XPath、CSS选择器)变更时,只需在统一的位置更新定位器,无需全局搜索并修改所有测试脚本。
- 降低维护成本:避免因定位器分散导致的“牵一发而动全身”问题,尤其适用于中大型项目。
- 增强代码复用性
- 消除冗余:同一元素可能在多个测试用例中被多次引用,统一管理后可直接复用定位器,减少重复代码。
- 提高可读性和协作效率
- 语义化命名:通过有意义的命名(如
loginPage.usernameInput),开发者可以直观理解元素用途,降低代码理解门槛。 - 团队协作友好:定位器集中后,团队成员无需在脚本中反复查找元素定义,减少冲突和沟通成本。
- 语义化命名:通过有意义的命名(如
- 支持动态化与灵活性
- 环境适配:可针对不同环境(Web/移动端、不同语言版本)动态切换定位器。
- 条件处理:通过封装定位器逻辑(如等待元素加载、动态生成XPath),增强框架健壮性。
- 与设计模式深度结合
- Page Object Model(POM)的基石:统一管理定位器是POM模式的核心实践,将页面元素与操作逻辑分离,提升代码结构化水平。
- 提升可维护性
-
AJAX
Asynchronous javaScript and XML
无需重新加载整个页面的情况下,部分更新网页
在浏览器与服务器之间实现异步数据传输,避免传统同步请求是整个页面刷新的体验问题。
交互流程如下:
- 用户通过操作滚动页面、提交表单等操作,使JS执行。
- JS会创建一个异步请求,该请求会发送到服务端,而不会阻塞用户在页面上的其他操作。
- 服务端处理请求生成响应数据。
- JS解析这些响应数据,更新网页部分内容,而不刷新整个页面。
常用场景:
- 金融类网站实时刷新股票价格。
- 设置密码时,根据用户实时输入的密码判断密码强度。
- 无限滚动加载购物页面商品信息。
- 按需加载组件,查看评论,使用AJAX加载商品评论数和评论组件。
-
presence_of_element_located主要用于判断某个元素是否已经被加载到页面的 DOM(文档对象模型)中,而不关心该元素是否可见。 -
后代节点和子节点
<div> <p>这是一个段落。 <span>这是段落里的一个 span。</span> </p> </div> <p> 元素是 <div> 元素的子节点,同时也是后代节点;而 <span> 元素是 <div> 元素的后代节点,但不是直接子节点,因为它嵌套在 <p> 元素内部,与 <div> 元素隔了一层。 -
建议定位方式(存在顺序)
- ID定位。性能高效,因为浏览器会为id建立索引,通过id可以直接定位到元素,无需遍历DOM树。唯一性和准确性,元素的ID是页面唯一的。
- CSS选择器定位。灵活多样,支持多种选择器组合。性能较好,浏览器对 CSS 选择器有较好的支持和优化,能够在较短时间内定位到目标元素。
- Xpath定位。强大的定位能力,当其他定位方式无法满足需求时,XPath 往往可以发挥作用。
- 相对定位。当页面元素的位置、属性等动态变化,或者元素之间的相对关系比较稳定时,相对定位是一种有效的解决方案。但相对定位的逻辑相对复杂,性能开销也较大,所以通常作为其他定位方式无法使用时的备选方案。

浙公网安备 33010602011771号