网站首页 > 技术文章 正文
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
猜你喜欢
- 2024-09-27 Linux 理解K8S Deployment配置的详细解释输出
- 2024-09-27 XSLT 元素 x元素是啥
- 2024-09-27 「airTest」 airTest入门与原理 airtest assert
- 2024-09-27 用人脸识别抓取王思聪吃热狗——真香
- 2024-09-27 必学组合函数INDEX和MATCH,真的比VLOOKUP函数好用?分情况,未必
- 2024-09-27 python模拟哔哩哔哩滑块登入验证的实现
- 2024-09-27 opencv多目标匹配 opencv多目标识别
- 2024-09-27 Python OpenCV 的知识体系梳理 opencv-python-tutorial
- 2024-09-27 「技术分享」截图录屏-截长图的实现原理
- 2024-09-27 视觉信息辅助激光导航AGV的应用 智能agv的激光导航包含
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)