admin 管理员组

文章数量: 887021

最近由于开发生病等原因总算有点时间做点有进步意义的事情了,准备把之前一直想实现的自动化测试执行起来(前端开发老是改到旧功能),我的目的很明确,但脑子很空洞,开始步步回忆之前的操作吧

文章目录

    • 识别小技巧:
    • 常用快捷键:
    • 1.浏览器又打不开了
    • 2.input text 对富文本框无效:使用send解决(后附send关键字)
    • 3.上传网络图片无法完整输入
      • 3.1所有符号均采用转义字符 send https\:\/\/img\.chinamallsales\\/bg\.png
      • 3.2 图片地址太长被截断分多次上传
      • 3.3 图片名称英文变成了中文
      • 3.4 [图片名称包含中文](https://editor.csdn/md/?articleId=132324461)和数字
    • 4.本地图片名称显示不完整(同上)
    • 5.本地选择弹窗还未打开就执行为pass了(AutoItLibrary 的Win Active失效),没找到好的办法,先sleep过了
    • 6.字段要翻页:focus、execute javascript document.documentElement.scrollTop=600
    • 7.字段识别:相同字段太多且所有相同字段属性全部相同,只好通过文字来识别了,如:
    • 8.单选框都直接点击后使用上下键选择 send {down 3} send {enter}
    • 9.截屏,Capture Page Screenshot 截不到windows自带的弹窗,Take Screenshot 截屏可以截到;
    • 10.断言
    • 11.通过获取属性值判断下拉框状态:
    • 12.修改文本框内容前清空文本框:
    • 13.for 循环
      • 13.1 For循环基本用法
      • 13.2 For循环嵌套For循环
    • 14 变量在关键字中修改失败
    • 15 变量截取部分取值:
    • 16 [数据驱动](https://blog.csdn/zyp_97/article/details/131889071)
    • 17 获取设置时间并与当前时间进行比对
    • 18.获取check状态(上级获取失败,通过上上级匹配成功)
    • 19.excel的数据输入显示浮点数,报错TypeError: object of type 'float' has no len()
      • 方法一:excel中对应的单元格前面加“'”即可:
      • 方法二:转换浮点数为整数
    • 20.RobotFramework判断2大于10
    • 21.[run keyword if 多条件判断](https://blog.csdn/ZYP_97/article/details/133273122)
    • 22.同时导入AppiumLibrary和Selenium2Library后,系统报错:Multiple keywords with name 'Capture Page Screenshot' found. Give the full name of the keyword you want to use...
    • 23 RF操作数据库报错:SyntaxError: invalid syntax (connections.py, line 166)
    • 24 列表数量统计
    • 导入的库:
    • robotframe ride的快捷键:
    • 第三方测试库安装(下载地址:https://pypi/)
    • 模拟键盘操作:send [Arguments] ${keys} ${flag}=0


识别小技巧:

Select Frame    //iframe[@id="5d6b82c04f2743e9bcf72f2ba2f4cd6a"] #属性值定位
Wait Until Element Is Visible    //span[text()='登录'] #文本定位
Select Frame    //iframe[contains(@src,'/demo.htm')] #属性模糊定位
click element	//span[contains(text(),'此刻')] #文本模糊定位
click element   //*[@colspan='1'][@class='el'] #多属性定位
click element	//*[@class='search_content']/div[3]/div/ul/li/*[contains(text(),'350')]#精确定位后模糊定位
click element	//*[@class='search_content']/div[3]/div/ul/li/*[contains(text(),'${title}')]#参数化定位
click element   //*[@class='search_content']/div[3]//*[contains(text(),'${title}')]
${count}	get matching xpath count	//*[@style='margin-top']/div #获取div的总量
<span class="van-button__text" data-v-3e38b93e="">登录</span>


直接通过//*[contains(text(),‘350’)] 匹配到//*[@class=‘search_content’]/div[1]精确定位后模糊定位到具体值

常用快捷键:

搜索关键字——》F5
显示关键字信息——》 ctrl+鼠标悬浮(鼠标悬浮于关键字上)
自动补全关键字——》ctrl+shift+空格

1.浏览器又打不开了

http://chromedriver.storage.googleapis/index.html,重新下载chromedriver 到python安装根目录,环境变量中设置的目录:E:\Python27
打开环境变量目录:win+r 输入:control system

输入:环境变量

2.input text 对富文本框无效:使用send解决(后附send关键字)

通过iframe属性值进行定位

使用send关键字实例如下:

^{home} 光标返回首位,{end}光标进入尾部,{enter}换行

执行结果:

#修改富文本框				
Wait Until Element Is enabled	//*[@id="ueditor_0"]	10	#活动规则富文本框是否可用
click element	//*[@id="ueditor_0"]	#光标进入富文本框	
sleep	0.5		
send	^{home}${newID}{end}{enter}活动规则		

input text 与 send 的区别,input text直接替换当前内容(最好添加sleep),send 不影响当前内容;

3.上传网络图片无法完整输入

3.1所有符号均采用转义字符 send https://img.chinamallsales/bg.png


转义字符有长度限制,可以多发几次,本地图片尽量不要太复杂的路径。

#上传题库		
click element	//span[text()="上传题库"]	
Wait Until Element Is enabled	//span[text()="上传Excel"]	10
click element	//span[text()="上传Excel"]	
sleep	1	
Win Active	title=打开	#检查窗口是否存在且当前被激活。此处不生效Win Active
sleep	0.5	
send	https\:\/\/prv-api\.chinamallsales\.com\/uploads\/tiku\/20230612\/	
send	{enter}	
send	021e8ad5ff8e1d578f0d2705d580f62f\.xlsx	
send	{enter 2}	

3.2 图片地址太长被截断分多次上传

Click Element	//*[@class='el-upload el-upload--picture-card']	#点击上传图片
sleep	1	
Win Active	title=打开	#检查窗口是否存在且当前被激活。此处不生效
send	${image1}	
send	{enter}	
send	{rshift}	#转换为英文输入
send	${image1+}	
send	{enter 2}	


send关键字有长度限制,网络路径太长导致只能输入一部分内容如下图:

3.3 图片名称英文变成了中文

由于页面需要上传的图片很多,上传图片慢,导致展开上传图片页面后文件名变成了乱七八糟与原本值不一样的存在。
解决方法:增加加sleep时间

3.4 图片名称包含中文和数字

解决方法:采用拆分、转换、延长等待时间基本可以解决所有上传文件,文件名称输入不规范的问题

4.本地图片名称显示不完整(同上)

注:本公司项目Choose file 关键字不起作用

5.本地选择弹窗还未打开就执行为pass了(AutoItLibrary 的Win Active失效),没找到好的办法,先sleep过了

6.字段要翻页:focus、execute javascript document.documentElement.scrollTop=600

表格太长需要左右滚动:execute javascript document.documentElement.scrollleft=600
但是有时关键字就是不生效的:(只好用最傻逼的方法来滚动页面了,未解决问题滚动条只能通过鼠标拖动而拖拽关键字又不生效

7.字段识别:相同字段太多且所有相同字段属性全部相同,只好通过文字来识别了,如:

xpath=.//label[text()='助力落地页图:']/../div/div/div/div[2]/div/div[2]/i 
/..当前节点上一层   
/preceding-sibling::div[1]当前节点兄弟前节点 
/following-sibling::div[4] 当前节点兄弟后节点

8.单选框都直接点击后使用上下键选择 send {down 3} send {enter}

(xpath识别经常出错,属性一样只能通过名称识别,都会点错 //span[text()=‘我爱玩飞刀’])

属性识别://div[@class=‘image-preview’]

9.截屏,Capture Page Screenshot 截不到windows自带的弹窗,Take Screenshot 截屏可以截到;

10.断言

1.通过弹窗提示断言:

log    --- 开始断言 ----
${result}    run keyword and return status    Run Keyword And Continue On Failure    Wait Until Page Contains    添加广告成功
run keyword if    ${result}==True    log    添加广告成功!
...    ELSE    Fail    添加广告失败!

2.通过下拉框值title断言:get text 获取到title的值

#修改广告位适用位置					
${type}	Get Text	//*[@_nk="SqDM7h"]/div[2]/div/div/div/div/span[2]	#获取广告位		
${P}	run keyword and return status	should be equal as strings	吉祥物区域悬浮广告	${type}	#判断当前选项

3.通过返回值断言:
注意此处返回值和变量都需要加引号("),否则会提示true没有定义。

${status}	Selenium2Library.Get Element Attribute	//input[@readonly="readonly"]@disabled	#活动类型下拉框不可用			
RUN KEYWORD IF	'${status}'=='true'	log	活动类型无法修改哦	ELSE	FAIL	活动类型居然可以修改啊

11.通过获取属性值判断下拉框状态:

这个真的太傻了,硬要找关键字 ,最后发现这个属性有值可以区分:disabled

Element Should Not Exist 报错路径问题、Element Should Be Disabled、Variable Should Not Exist 使用后发现不是报错就是没用

Get Element Attribute 获取属性:(当属性与属性值相同时返回true)

${status}	Selenium2Library.Get Element Attribute	//input[@readonly="readonly"]@disabled
RUN KEYWORD IF	'${status}'=='true'	log	活动类型无法修改哦	
...	ELSE	FAIL	活动类型居然可以修改啊

12.修改文本框内容前清空文本框:


通过 get value 获取到属性 value的值

#修改活动开始时间				
${current_text}	get value	//*[@placeholder="开始日期"]	#获取开始时间	
${length}	get length	${current_text}		
Repeat Keyword	${length}	send	{BS}	#清空开始时间

13.for 循环

13.1 For循环基本用法

1、:FOR … IN …
2、:FOR … IN RANGE …
【IN RANGE】后面跟一个整数型的数字的范围,循环的次数受数字的范围控制。如1-5,则从1开始到4,循环4次,如下所示。
若【IN RANGE】后只跟一个数字n,则默认从0开始,到n-1,共n次。
3、多循环变量
【FOR】后面可跟多个循环变量,循环序列值必须为循环变量的数量整数倍,否则循环会报错 “Number of FOR loop values should be multiple of its variables.”

4、For循环内条件判断
1.Continue For Loop If #若满足条件,则跳出当前循环,执行下一循环
2.Exit For Loop If #若满足条件则结束循环

13.2 For循环嵌套For循环

RF中不支持For循环嵌套For报错:No keyword with name ‘:FOR’ found.
只有将底层循环写成关键字实现相关功能

14 变量在关键字中修改失败


在关键字中实现了自增的结果,回到Test Cases又变回默认值了

解决方法:在关键字中把变量${couponNum}设置为全局变量

Set Global Variable	${couponNum}	${couponNum}+1

15 变量截取部分取值:

1.密码取用户名的后6位${user[5:]},用户名是手机号,长度固定,所以取第六位开始到结束的所有内容作为密码

2.使用Get Substring截取

${acttime}	get text	//tbody/tr/td[5]/div/span		
${set_time}	Get Substring	${acttime}	0	19

执行结果:

16 数据驱动

17 获取设置时间并与当前时间进行比对

1.获取活动开始时间:(使用String库的关键字Get Substring 进行截取)

${acttime}	get text	//tbody/tr/td[5]/div/span		
${set_time}	Get Substring	${acttime}	0	19

执行结果:

2.获取当前时间:

${current_time}	Get Time

3.进行时间对比确定是否执行接下来的操作:(采用Should Be True)

:FOR	${INDEX}	IN RANGE	1	
	${current_time}	Get Time		
	${status}	Run Keyword And Return Status	Should Be True	'${current_time}'>= '${set_time}'
	Exit For Loop If	${status}==True	#当前时间大于设置时间,进行中退出循环	

18.获取check状态(上级获取失败,通过上上级匹配成功)


由上图可以看到选中checkbox后对应选中span class=‘el-checkbox__inner’,取消选中后,该元素的属性没有变化,变化是其上级span和label

通过上级span属性class定位:

${element_checked}	Run Keyword And Return Status	Page Should Contain Element //*[@class='el-checkbox__input is-checked']

执行失败:

通过上级label属性class定位:

${element_checked}	Run Keyword And Return Status	Page Should Contain Element	//*[@class='el-checkbox is-checked']

19.excel的数据输入显示浮点数,报错TypeError: object of type ‘float’ has no len()


解决方法

方法一:excel中对应的单元格前面加“'”即可:

方法二:转换浮点数为整数

${rID}	Evaluate	int(${rID})

20.RobotFramework判断2大于10



解决方法:去掉引号 ‘${Lnum}’>‘10’

21.run keyword if 多条件判断

22.同时导入AppiumLibrary和Selenium2Library后,系统报错:Multiple keywords with name ‘Capture Page Screenshot’ found. Give the full name of the keyword you want to use…

解决方法:设置访问顺序,优先访问AppiumLibrary,在Suite或者testcase的setup中添加“Set Library Search Order | AppiumLibrary | Selenium2Library”

suite添加后Text Edit显示如下:

Suite Setup       Set Library Search Order    AppiumLibrary    Selenium2Library

testcase的setup中添加“Set Library Search Order | AppiumLibrary | Selenium2Library”

testcase添加后Text Edit显示如下:

   [Setup]    Set Library Search Order    AppiumLibrary    Selenium2Library

23 RF操作数据库报错:SyntaxError: invalid syntax (connections.py, line 166)


估计是python2、3不兼容导致的,检查DatabaseLibrary,没有发现报错的文件:

在python中导入pymysql,指出了报错文件路径:

直接访问egg下的这个路径并不存在,pymysql文件重新生成egg,发现更多报错,干脆重新下载库,找了合适的whl版本:pip install ****.whl ,再次import成功

RF中执行成功

24 列表数量统计

${count}	get matching xpath count	//*[@style='margin-top: -40px; margin-left: 120px;']/div


导入的库:

*** Settings ***
Suite Setup setup
Library Selenium2Library
Library BuiltIn
Library Collections
Library DateTime
Library Dialogs
Library OperatingSystem
Library Process
Library Screenshot
Library String
Library Telnet
Library XML
Library AutoItLibrary
Library OperatingSystem
Library ExcelLibrary
Library XML
Library HttpLibrary.HTTP


robotframe ride的快捷键:

重命名——》F2
搜索关键字——》F5
执行用例——》F8
创建新工程——》ctrl+n
创建新测试套——》ctrl+shift+f
创建新用例——》ctrl+shift+t
创建新关键字——》ctrl+shift+k
向上移动用例——》ctrl+↑
向下移动用例——》ctrl+↓
显示关键字信息——》 ctrl+鼠标悬浮(鼠标悬浮于关键字上)
自动补全关键字——》ctrl+shift+空格
删除行——》ctrl+d
删除单元格——》ctrl+shift+d
插入单元格——》ctrl+shift+i
插入行——》ctrl+i
屏蔽代码——》ctrl+#
取消屏蔽——》ctrl+$
保存整个工程——》ctrl+shit+s
局部保存,保存鼠标点击的部分——》ctrl+s
查看log——》ctrl+L
查看report——》ctrl+r
${} ——》ctrl+1
@{} ——》ctrl+2
comment(注释一行)——》ctrl+3
取消comment——》ctrl+4


第三方测试库安装(下载地址:https://pypi/)

1)下载本地后,解压至python安装路径的\Lib\site-packages目录下。
2)管理员身份运行Cmd 进入文件路径

执行:
python setup.py install (有setup文件的执行)
pip install ****.whl (whl文件执行)


模拟键盘操作:send [Arguments] ${keys} ${flag}=0

[Documentation]  模拟键盘输入,需要两个参数:
...  第一个参数: 需要输入的键盘按键
...  第二个参数: 标记变量,可选值,默认为0,
...               0:  代表第一个参数${keys}中的!+^#代表特殊按键
...               1:  代表第一个参数${keys}中的所有字符都是普通字符串
...  举例:
...  ^a^c^v!{F4}      代表:Ctrl+a Ctrl+c Ctrl+v Alt+F4
...  关于特殊按键的说明:
...      如果${flag}为0,则:
...     !  代表ALT按键
...     +  代表SHIFT按键
...     ^  代表CTRL按键
...     #  代表WIN按键
...  比如:!+a  代表:ALT+SHIFT+a
...  其他特殊按键:
...  ${flags}为0的时候,还支持下述特殊按键:
...     输入  最终的键盘按键
...     {!}                     !
...     {#}                     #
...     {+}                     +
...     {^}                     ^
...     {{}                     {
...     {}}                     }
...     {SPACE}                 SPACE
...     {ENTER}                 ENTER key on the main keyboard
...     {ALT}                   ALT
...     {BACKSPACE} or {BS}     BACKSPACE
...     {DELETE} or {DEL}       DELETE
...     {UP}                    Cursor up
...     {DOWN}                  Cursor down
...     {LEFT}                  Cursor left
...     {RIGHT}                 Cursor right
...     {HOME}                  HOME
...     {END}                   END
...     {ESCAPE} or {ESC}       ESCAPE
...     {INSERT} or {INS}       INS
...     {PGUP}                  PageUp
...     {PGDN}                  PageDown
...     {F1} - {F12}            Function keys
...     {TAB}                   TAB
...     {PRINTSCREEN}           Print Screen key
...     {LWIN}                  Left Windows key
...     {RWIN}                  Right Windows key
...     {NUMLOCK on}            NUMLOCK (on/off/toggle)
...     {CAPSLOCK off}          CAPSLOCK (on/off/toggle)
...     {SCROLLLOCK toggle}     SCROLLLOCK (on/off/toggle)
...     {BREAK}                 for Ctrl+Break processing
...     {PAUSE}                  PAUSE
...     {NUMPAD0} - {NUMPAD9}    Numpad digits
...     {NUMPADMULT}             Numpad Multiply
...     {NUMPADADD}              Numpad Add
...     {NUMPADSUB}              Numpad Subtract
...     {NUMPADDIV}              Numpad Divide
...     {NUMPADDOT}              Numpad period
...     {NUMPADENTER}            Enter key on the numpad
...     {APPSKEY}                Windows App key
...     {LALT}                   Left ALT key
...     {RALT}                   Right ALT key
...     {LCTRL}                  Left CTRL key
...     {RCTRL}                  Right CTRL key
...     {LSHIFT}                 Left Shift key
...     {RSHIFT}                 Right Shift key
...     {ALTDOWN}                Holds the ALT key down until {ALTUP} is sent
...     {SHIFTDOWN}              Holds the SHIFT key down until {SHIFTUP} is sent
...     {CTRLDOWN}               Holds the CTRL key down until {CTRLUP} is sent
...     {LWINDOWN}               Holds the left Windows key down until {LWINUP} is sent
...     {RWINDOWN}               Holds the right Windows key down until {RWINUP} is sent
...     {ASC nnnn}               Send the ALT+nnnn key combination
AutoItLibrary.Send  ${keys}  ${flag}

键盘输入Alt+F4
AutoItLibrary.Send !{F4}

键盘输入Ctrl+Space
AutoItLibrary.Send ^{SPACE}

键盘输入Ctrl+a
AutoItLibrary.Send ^a

键盘输入Ctrl+c
AutoItLibrary.Send ^c

键盘输入Ctrl+v
AutoItLibrary.Send ^v

键盘输入Ctrl+s
AutoItLibrary.Send ^s

键盘输入Ctrl+p
AutoItLibrary.Send ^p

键盘输入Ctrl+Home
AutoItLibrary.Send ^{HOME}

键盘输入Ctrl+End
AutoItLibrary.Send ^{END}

键盘输入Win+d
键盘输入 {LWINDOWN}d{LWINUP}

键盘输入Win+r
键盘输入 {LWINDOWN}r{LWINUP}

本文标签: 解决方法 测试 robotframework WEB