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:
# 单文件上传
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:
场景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