百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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命令支持,且...