Web自动化测试12种特殊场景怎么处理?
bigegpt 2024-11-20 12:38 4 浏览
Web自动化测试中有哪些特殊场景,遇到了后我们改怎么处理?下面就给大家说说这十二种特殊场景及其解决方法。更多web自动化测试学习可百度搜素“腾讯课堂特斯汀软件测试”或搜索官方公众号“特斯汀软件测试”
Web自动化测试1十二大特殊场景
场景1:IE浏览器或者其他浏览器,有些点击无效
solution:js点击
ele = self.__find_ele(lo)
if self.br == 'ie':
self.driver.execute_script('arguments[0].click()', ele)
else:
ele.click()
拓展:
在console界面,可以使用$x('xpath'),根据xpath找到这个元素
$x('//*[@id="loginform"]/div/div[6]/a')[0].innerText
text,outerText,innerHTML,outerHTML
凡是可以在console界面操作的方法和属性都可以使用driver.execute_script执行
场景2:一个xpath可能对应多个元素
solution1:把所有元素获取为一个列表
eles = driver.find_elements(By.XPATH,'//a[text()="个人信息"]')
eles[1].click()
solution2:通过xpath直接获取第几个(这里下标从1开始)
driver.find_element(By.XPATH,'(//a[text()="个人信息"])[2]').click()
场景3:鼠标移动到元素上面(悬停:hover)
solution:使用selenium提供的鼠标操作类
# 在driver浏览器上面,创建selenium的鼠标操作类的对象
action = ActionChains(driver)
# 把鼠标移动到元素上,perform是使操作生效
action.move_to_element(ele).perform()
场景4:图片上传(批量上传)
solution:<input type="file" 可以直接使用send_keys('文件的绝对路径')
# 单文件上传
driver.find_element(By.XPATH, '//*[@id="filePicker"]/div[2]/input').send_keys(r'C:\Users\Amy\Desktop\will.png')
# 多文件上传
driver.find_element(By.XPATH, '//*[@id="filePicker"]/div[2]/input').send_keys('\n'.join([r'C:\Users\Amy\Desktop\will.png',r'C:\Users\Amy\Desktop\will.png']))
场景5:动态xpath
solution:<input type="file" 可以直接使用send_keys('文件的绝对路径')
场景6:针对select标签的下拉框
solution:关键字封装
def select(self, lo: str = '', visible_text: str = ""):
"""
在下拉框里面,根据可见文本选择
:param lo: 下拉框的定位
:param visible_text: 如果是数字则select_by_value,字符串则select_by_visible_text
"""
ele = self.__find_ele(lo)
select = Select(ele)
try:
int(visible_text)
select.select_by_value(visible_text)
except:
select.select_by_visible_text(visible_text)
场景7:关联型xpath
solution:使用轴定位编写xpath
$x('//span[text()="老Will"]/../../li//a[text()="删除"]')
场景8:数据提取
solution:正则提取
s = '订单号: 202203232203535547 | 付款金额(元): 960.00 元'
orderid = re.findall(r'\d{18}',s)
print(orderid)
场景9:断言
solution:判断程序当前执行是否正确
一般来说:
Web自动化没必要断言元素是否存在或者出现
与功能业务相关的时候,比如断言登录的各种情况的结果(需要断言)
每一组用例可能都有不同的断言
场景10:获取属性
solution:获取元素属性
ele = driver.find_element(By.XPATH,'//div[@class="JDJRV-smallimg"]/img')
src = ele.get_attribute('src')
ele = driver.find_element(By.XPATH,'//div[@class="JDJRV-smallimg"]/img')
src = driver.execute_script('return arguments[0].src', ele)
场景11:图文验证码
solution:使用图文识别,详见VIP课程
# 截取验证码图片
ele = driver.find_element(By.XPATH,'//*[@id="verify_code_img"]')
ele.screenshot('../common/verify/verify.png')
verify = Verify('wuqingfqng', '6e8ebd2e301f3d5331e1e230ff3f3ca5', '96001')
# 普通图片解析
v = verify.PostPic(1902, im='../common/verify/verify.png')
print(v)
driver.find_element(By.XPATH, '//*[@id="verify_code"]').send_keys(v)
场景12:滑块验证码破解
solution:使用图片对比和人工智能,详见VIP课程
block = driver.find_element(By.XPATH,'//*[@id="nc_1_n1z"]')
action = ActionChains(driver)
# 按住滑块
action.click_and_hold(block)
# 移动到最右边
action.move_by_offset(400,0)
# 松开鼠标
action.release().perform()
# 重试
while True:
bj_ele = driver.find_element(By.XPATH,'//div[@class="JDJRV-bigimg"]/img')
bj_src = bj_ele.get_attribute('src')
bj_src = bj_src[bj_src.find('base64,')+7:]
# base64字符串处理为图片
# base64字符串转为二进制
imgdata = base64.b64decode(bj_src)
# 打开一个文件(如果没有就会创建)w: 写入,b: 二进制
file = open('../common/verify/bj.jpg', 'wb')
# 写入二进制
file.write(imgdata)
# 保存关闭
file.close()
block_ele = driver.find_element(By.XPATH,'//div[@class="JDJRV-smallimg"]/img')
block_src = block_ele.get_attribute('src')
block_src = block_src[block_src.find('base64,')+7:]
# base64字符串处理为图片
# base64字符串转为二进制
imgdata = base64.b64decode(block_src)
# 打开一个文件(如果没有就会创建)w: 写入,b: 二进制
file = open('../common/verify/block.jpg', 'wb')
# 写入二进制
file.write(imgdata)
# 保存关闭
file.close()
# 获取缺口位置
target = '../common/verify/bj.jpg'
template = '../common/verify/block.jpg'
# 背景图处理为rgb格式
target_rgb = cv2.imread(target)
# 灰度处理
target_gray = cv2.cvtColor(target_rgb, cv2.COLOR_BGR2GRAY)
# 缺口图处理为rgb格式
template_rgb = cv2.imread(template, 0)
# 在背景图上匹配缺口的位置
res = cv2.matchTemplate(target_gray, template_rgb, cv2.TM_CCOEFF_NORMED)
# 返回一个最佳匹配和一个次要匹配
value = cv2.minMaxLoc(res)
block_x = int(value[2][0] * 278 / 360 * 1.25)
print(block_x)
# 获取滑块的位置
print(block_ele.location)
lo = block_ele.location
lo['x'] = int(lo['x'] * 1.25) + 19
lo['y'] = int(lo['y'] * 1.25) + 90 + 19
slide_by_pyautogui(lo.get('x'),lo.get('y'),block_x)
time.sleep(3)
# 尝试
try:
refresh = driver.find_element(By.XPATH,'//div[@class="JDJRV-img-refresh"]')
refresh.click()
time.sleep(1)
except:
# 如果代码执行失败
break
相关推荐
- 悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)
-
新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...
- 高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源
-
凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...
- 微服务架构实战:商家管理后台与sso设计,SSO客户端设计
-
SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...
- 还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑
-
在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...
- Seata源码—6.Seata AT模式的数据源代理二
-
大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...
- 30分钟了解K8S(30分钟了解微积分)
-
微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...
- SpringBoot条件化配置(@Conditional)全面解析与实战指南
-
一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...
- 一招解决所有依赖冲突(克服依赖)
-
背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...
- 你读过Mybatis的源码?说说它用到了几种设计模式
-
学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...
- golang对接阿里云私有Bucket上传图片、授权访问图片
-
1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...
- spring中的资源的加载(spring加载原理)
-
最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...
- Android资源使用(android资源文件)
-
Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...
- 如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)
-
深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...
- @Autowired与@Resource原理知识点详解
-
springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...
- java的redis连接工具篇(java redis client)
-
在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)