vscode+robotframework的实践-selenium(更新中)

news/2024/9/25 18:30:47

一 说明

  • 上一次使用robotframework还是2019年毕业刚进入工作的时候,使用的是robotframework的官方配套编辑器RIDE进行自动化脚本编写,在使用的过程中偶尔会遭遇卡顿、闪退等问题,当时排查问题大多数是因为RIDE自身与python版本以及操作系统之间的兼容性问题导致的,那时候没有编程意识,代码功底也相对薄弱,RIDE是一个对新手很好的编辑工具。但有前端编码经验后,使用vscode编辑器编写脚本的效率会更高,有相对应的插件支持,也是官方推荐的IDE之一。
  • 写这篇文章的目的主要是为了方便自己重新回忆robotframework的使用,结合vscode达到实战的目的,不足之处随时欢迎私信沟通鸭
  • 该文章比较适合有python+RF基础,想从RIDE改成用VScode编写用例的同学,听到测试套件(test_suite)、关键字(uesr_keyword)、资源(resorce)能立刻理解的,没有基础的同学可以先看相关书籍学习,此处推荐《自动化测试实战宝典》、《RobotFramework自动化测试修炼宝典》
  • 最好的RF教程其实都在RF官网,英语能力强的小伙伴建议直接看官网文档(或者借助翻译工具也行)

二 工具安装版本

  • vscode-V1.90.2
  • python-V3.11.9
  • 谷歌浏览器-V126.0.6478.115
  • 根据自己的谷歌浏览器安装对应的浏览器驱动,具体可查看SeleniumLibrary的git说明,其中也有讲解了怎么下载浏览器驱动

三 安装

3.1 安装RF(V7.0.1):pip install robotframework

3.2 安装Selenium Library(V6.5.0):pip install --upgrade robotframework-seleniumlibrary

3.3 在vscode上安装RF相关插件

写一个熟悉的helloworld。*** Test Cases ***此类的语法可以参考官网语法

*** Test Cases ***
test_case01Log    helloworld!

四 实践(持续更新中)

4.1 实践1:打开谷歌浏览器,进入百度界面,搜索并进入robotframe官网。

4.1.1 对应代码
点击查看代码
*** Comments ***
#此处用来填写说明
打开谷歌浏览器,进入百度界面,搜索并进入robotframe官网。
*** Settings ***
#此处用来设置用例,常见的有引入库、设置setup teardown
Library    SeleniumLibrary    
Test Teardown    Close Browser
*** Variables ***
#此处用来设置用例,常见的有引入库、设置setup teardown*** Test Cases ***
#此处用来设置测试用例
Open Page    #用例名称[Teardown]    Run Keyword If Test Failed    Close Browser    #用例如果失败了就关闭浏览器Open Browser    url=https://www.baidu.com   browser=chrome    #打开百度搜索页面Maximize Browser Window    #窗口最大化Wait Until Page Contains Element    locator=id=kw    #等待元素出现,默认等待时间是5SInput Text    locator=id=kw    text=Robot Framework    #在id为kw的输入框里输入Robot Framework Click Button    locator=id=su    #点击id为su的搜索按钮Wait Until Page Contains Element    locator=//div[contains(@mu, 'robotframework.org')]    #等待想要的搜索网址出现,这里是xpath选择器Click Element    locator=//div[contains(@mu, 'robotframework.org')]/div/div/h3/a    #点击对应标题Switch Window    locator=NEW    # 切换到新标签页,进入到rf网址
*** Keywords ***
#此处用来设置变量
4.1.2 使用vscode调试代码。这时候使用IDE的好处就出来了,断点调试在编写用例时非常使用,可以迅速帮我们找到BUG,以及随时停在我们需要检查的代码上,RIDE编辑器则无法做到这一步。

调试功能如下:

  • 继续:直接跳到下一个断点处,点击后就会顺序执行代码到断点2处时停下
  • 逐过程:如果代码中有循环或者子函数的话,进入带循环里和子函数,但是当前没有循环,所以点击后的效果也相当于单步调试
  • 单步调试:从当前断点处,点击一次逐步执行一行代码(不打断点也可以)
  • 单步跳出:进入代码中有循环或者子函数的时候,可以点击这个跳出循环和子函数进入到下一行代码
  • 重启:顾名思义,重新执行代码
  • 停止:顾名思义,停止当前代码

4.1.3 其他说明
  • vscode可以在使用关键字时快速匹配相关关键字列表

  • 鼠标移动到关键字上,也可以快速给出关键字说明

  • 遗漏哪些必填项,也能给出对应错误信息

4.2 实践2:登陆界面功能测试

4.2.1 环境配置

4.2.1.1 先简单写一个登陆界面,用于测试。把这两个html代码放置在一个文件目录下,对login.html右键使用open with live sever可以在浏览器中打开对应网址。open with live sever功能可以创建一个服务,方便我们调试html代码

点击查看login.html代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Login Page</title><style>body {font-family: Arial, sans-serif;text-align: center;}.container {margin-top: 100px;width: 300px;margin-left: auto;margin-right: auto;}input[type='text'],input[type='password'],input[type='submit'] {width: 100%;padding: 12px 20px;margin: 8px 0;display: inline-block;border: 1px solid #ccc;box-sizing: border-box;font-size: 16px;}input[type='submit'] {background-color: #4caf50;color: white;border: none;cursor: pointer;}input[type='submit']:hover {background-color: #45a049;}</style></head><body><div class="container"><h2>Login</h2><form id="loginForm" onsubmit="return checkLogin()"><label for="username">Username:</label><br /><input type="text" id="username" name="username" /><br /><label for="password">Password:</label><br /><input type="password" id="password" name="password" /><br /><br /><input type="submit" value="Login" /></form><p id="loginMessage" style="display: none; color: green">Login successful!</p></div><script>function checkLogin() {var username = document.getElementById('username').valuevar password = document.getElementById('password').valueif (!username || !password) {alert('请输入账号密码后再点击登录!')return false} else if (username === 'root' && password === 'root1234') {document.getElementById('loginMessage').style.display = 'block'window.location.href = './mainPage.html'return false // Prevent form submission} else if (username === 'root' && password != 'root1234') {alert('密码错误,请输入正确的密码!')return false} else {alert('账号密码错误,请检查账号密码!')return false}}</script></body>
</html>
点击查看mainPage.html代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>数据搜索页面</title><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid #dddddd;text-align: left;padding: 8px;}th {background-color: #f2f2f2;}</style>
</head>
<body><h1>数据搜索页面</h1><form id="searchForm"><label for="name">姓名:</label><input type="text" id="name" name="name"><label for="gender">性别:</label><select id="gender" name="gender"><option value="">全部</option><option value="male">男</option><option value="female">女</option></select><button type="button" onclick="searchData()">搜索</button></form><br><table id="dataTable"><thead><tr><th>序号</th><th>姓名</th><th>性别</th><th>年龄</th></tr></thead><tbody><tr><td>1</td><td>张三</td><td>男</td><td>25</td></tr><tr><td>2</td><td>李四</td><td>男</td><td>30</td></tr><tr><td>3</td><td>王芳</td><td>女</td><td>28</td></tr></tbody></table><script>function searchData() {var inputName = document.getElementById('name').value.toLowerCase();var inputGender = document.getElementById('gender').value.toLowerCase();var table = document.getElementById('dataTable');var rows = table.getElementsByTagName('tr');for (var i = 1; i < rows.length; i++) {var name = rows[i].getElementsByTagName('td')[1].innerText.toLowerCase();var gender = rows[i].getElementsByTagName('td')[2].innerText.toLowerCase();var nameMatch = name.includes(inputName);var genderMatch = (inputGender === '' || (inputGender === 'male' && gender === '男') || (inputGender === 'female' && gender === '女'));if (nameMatch && genderMatch) {rows[i].style.display = '';} else {rows[i].style.display = 'none';}}}</script>
</body>
</html>

登陆页面功能设计如下:

  • 功能1:输入正确的账号密码(root/root1234),登录成功,跳转到主页
  • 功能2:输入正确的账号,错误的密码,登录失败并给出提示信息:密码错误,请输入正确的密码
  • 功能3:输入错误的账号密码,登录失败并给出提示信息:账号密码错误,请检查账号密码
  • 功能4:不输入账号密码点击登录,登录失败并给出提示信息:请输入账号密码后再点击登录!

4.2.1.2 根据页面功能设计用例

  • 用例1:输入正确的账号密码(root/root1234)。 预期:登录成功,跳转到搜索界面
  • 用例2:输入正确的账号,错误的密码。 预期:登录失败并给出提示信息:密码错误,请输入正确的密码
  • 用例3:不输入账号输入密码点击登录。 预期:登录失败并给出提示信息:请输入账号密码后再点击登录!
  • 用例4:输入账号不输入密码点击登录。 预期:登录失败并给出提示信息:请输入账号密码后再点击登录!
  • 用例5:不输入账号密码点击登录。 预期:登录失败并给出提示信息:请输入账号密码后再点击登录!
  • 用例6:输入错误的账号密码。 预期:登录失败并给出提示信息:账号密码错误,请检查账号密码
4.2.1 编写RF代码

4.2.1.1 目录结构

4.2.1.2 相关代码

点击查看login_keywords.robot代码
*** Comments ***
登录相关的全局关键字
*** Settings ***
Library    SeleniumLibrary   
*** Variables ***
${IMPLICIT_WAIT_TIME}    5
${LOGIN_URL}    http://127.0.0.1:5500/view/login.html
*** Keywords ***
OPEN LOGIN PAGEOpen Browser    ${LOGIN_URL}    chromeSet Selenium Implicit Wait    ${IMPLICIT_WAIT_TIME}
点击查看keywords.robot代码
*** Comments ***
登陆页面用到的关键字
*** Settings ***
Library    SeleniumLibrary   
*** Keywords ***
INPUT USER AND PASSWORD[Arguments]    ${username}   ${password}[Documentation]    输入用户名(username)和密码(password)Input Text    locator=//input[@id="username"]    text=${username}Input Text    locator=//input[@id="password"]    text=${password}Click Element    locator=//input[@type="submit"]
点击查看login.robot代码
*** Comments ***
测试登陆页面
*** Settings ***
Library    SeleniumLibrary    
Resource    ../keywords/login_keywords.robot
Resource    ./keywords.robot
Suite Setup    OPEN LOGIN PAGE    #自定义关键字
Suite Teardown    Close Browser
*** Test Cases ***
登录成功[Tags]    smoke    login    P    #标签INPUT USER AND PASSWORD    username=root    password=root1234    #使用自定义关键字Element Should Be Visible    locator=//h1[text()='数据搜索页面']
登录失败-账号正确密码错误[Tags]    smoke    login    NGo To    url=${LOGIN_URL}INPUT USER AND PASSWORD    username=root    password=root12345${alert_message} =    Handle Alert Should Be Equal As Strings    ${alert_message}    密码错误,请输入正确的密码!
登录失败-不输入账号[Tags]    smoke    login    NGo To    url=${LOGIN_URL}INPUT USER AND PASSWORD    username=    password=root1234   ${alert_message} =    Handle Alert Should Be Equal As Strings    ${alert_message}    请输入账号密码后再点击登录!
登录失败-不输入密码[Tags]    smoke    login    NGo To    url=${LOGIN_URL}INPUT USER AND PASSWORD    username=root    password=  ${alert_message} =    Handle Alert Should Be Equal As Strings    ${alert_message}    请输入账号密码后再点击登录!  
登录失败-不输入账号和密码[Tags]    smoke    login    NGo To    url=${LOGIN_URL}INPUT USER AND PASSWORD    username=    password=    ${alert_message} =    Handle Alert Should Be Equal As Strings    ${alert_message}    请输入账号密码后再点击登录! 
登录失败-账号密码错误[Tags]    smoke    login    NGo To    url=${LOGIN_URL}INPUT USER AND PASSWORD    username=root1   password=root1234${alert_message} =    Handle Alert Should Be Equal As Strings    ${alert_message}    账号密码错误,请检查账号密码!
*** Keywords ***
#此处用来设置变量

4.2.1.3 其他说明

  • 有一些步骤是重复的,此时可以采用自定义关键字的写法,提高效率。robot文件之间是可以相互引用的,例如A.robot要引用B.robot里的关键字,只需要在A.robot的Settings处通过使用Resource关键字引用B.robot文件,即可使用B.robot文件里头的Keywords。至于文件命名以及目录命名这个就需要自己结合项目的实际情况去创建,一个好的清晰的目录结构有利于项目分工合作和后期拓展,所以还是需要想一下的。
  • 在vscode也支持单个执行用例、按套件执行用例、按目录执行用例,调试同理。

五 可能遇到的问题

5.1 怎么判断自己写的xpath、css选择器是否正确?

可以利用谷歌开发者工具,在元素这里按f出现搜索框,再将我们的xpath贴上去,如果能搜索到就代表我们写的路径没错。需注意检查一下有几个搜索结果,使用相对路径的情况下,匹配条件不充分可能会匹配到多个结果。

5.2 怎么了解Library里面的关键字,或者说怎么快速判断应该使用哪一个关键字

对关键字的使用基本上是熟能生巧,不熟悉的情况可以借助chatGPT也可以去Library对应的官网,会有关键字文档说明

  • 去官网查阅关键字文档说明

  • 借助chatGPT,但chatGPT是有可能输出错误答案的,要适当的举一反三

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Windows Server 2019 OVF, updated Jun 2024 (sysin) - VMware 虚拟机模板

Windows Server 2019 OVF, updated Jun 2024 (sysin) - VMware 虚拟机模板Windows Server 2019 OVF, updated Jun 2024 (sysin) - VMware 虚拟机模板 2024 年 6 月版本更新,现在自动运行 sysprep,支持 ESXi Host Client 部署 请访问原文链接:https://sysin.org/blog/windows…

Asp.Net Core 中的“虚拟目录”

原文链接:https://blog.csdn.net/sD7O95O/article/details/107587430 现在部署Asp.Net Core应用已经不再限制于Windows的IIS上,更多的是Docker容器、各种反向代理来部署。也有少部分用IIS部署的,IIS部署确实是又快又简单,图形化操作三下五除二就可以发布好一个系统了。在过…

通义灵码上线 Visual Studio 插件市场啦!

通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。通义灵码,是阿里云出品的一款基于通义大…

电脑IPv6正常但是外部无法ping或者ping不通解决办法

常见问题咨询解决运营商屏蔽 设备没有正确获取IPv6,只是局域网IPv6 路由器没有开启相关功能推荐一个测试网站,IPv4和IPv6多点查询 - 设备IP地址多点查询测试平台:https://v6.qjcq.net打开网站后其他设备扫码进入后可以在页面上全部显示ip地址所有问题排查之后还有无法ping通打…

Windows Server 2016 OVF, updated Jun 2024 (sysin) - VMware 虚拟机模板

Windows Server 2016 OVF, updated Jun 2024 (sysin) - VMware 虚拟机模板Windows Server 2016 OVF, updated Jun 2024 (sysin) - VMware 虚拟机模板 2024 年 6 月版本更新,现在自动运行 sysprep,支持 ESXi Host Client 部署 请访问原文链接:https://sysin.org/blog/windows…

KubeSphere 社区双周报|2024.06.07-06.20

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.06.07-06.20。 贡献者名单新晋 KubeSphere co…

vue3实现模拟地图上,站点名称按需显示的功能

很久很久没有更新博客了,因为实在是太忙了,每天都有公司的事情忙不完....... 最近在做车辆模拟地图,在实现控制站点名称按需显示时,折腾了好一段时间,特此记录一下。最终界面如下图所示:站点显示需求:首末站必须显示,从第一个站开始,如果站点名称能显示下,则显示,如…

redisson WRONGPASS invalid username-password pair or user is disable

1、技术架构:若依微服务框架<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.1</version></dependency> <dependency><groupId>…