赞
踩
https://blog.csdn.net/weixin_45912307/article/details/109438188
1 什么是POM,为什么要使用它?
把一个一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为
,所以自然而然就用了类的思想来组织我们的页面。一般一个页面写一个类文件,这个类文件包含该页面的元素定位和业务操作方法2如果页面元素经常发生需求变化,你是如何做?
3 在你做自动化过程中,遇到了什么问题吗?举例下
4 举例一下你遇到过那些异常,在selenium自动化测试过程中
ElementNotSelectableException
:元素不能选择异常ElementNotVisibleException
:元素不可见异常NoSuchAttributeException
:没有这样属性异常NoSuchElementException
:没有该元素异常NoSuchFrameException
:没有该frame异常TimeoutException
: 超时异常Element not visible at this point
:在当前点元素不可见5 如何处理alert弹窗
Alert alert = driver.switchTo().alert()
// 切换到Alertalert.accept()
// 点击弹窗上确定按钮alert.dismiss()
// 点击弹窗的取消按钮alert.getText()
// 获取弹窗上线上的文本文字内容alert.sendkeys()
// 有些弹窗还支持文本输入,这个可以把要输入字符通过sendkeys方法输入6 在selenium中如何处理多窗口?
swithTo
方法。# 最新句柄
current_window_handles = self.driver.window_handles
self.driver.switch_to.window(current_window_handles[-1])
elif window_reference == "default":
self.driver.switch_to.default_content() # 默认当前句柄
else:
self.driver.switch_to.window(window_reference) # 指定句柄
7 你查找元素遇到过在Frame里面吗?你是如何处理Frame里面元素定位的?
有时候我们知道元素定位表达式没有问题,但是还是提示no such element
,那么我们就需要考虑这个元素是否在frame中。如果在,我们就需要从topwindow,通过swithcTo.Frame()
方法来切换到目标frame中,可以通过frame的name、id和index三种方法来定位frame。
8 如何处理下拉菜单?
Se=new Select(element)
Se.selectByIndex(index)
Se.selectByvalue(value)
Se.selectByVisibleText(text)
9 关闭浏览器中quit和close的区别?
10 什么是imlicitlyWait(隐式等待)
11 什么是expliciteWait(显式等待)
等待某种条件发生后,再继续执行后续的代码
12 如何实现文件上传?
我们在web页面实现文件上传过程中,可以直接把文件在磁盘完整路径,通过sendKeys
方法实现上传
13 如何实现鼠标悬停,键盘事件和拖拽动作?
clickAndHold()
contentClick()
doubelClick()
dragAndDrop(source,target)
keyDown(keys.ALT), keyUp(keys.SHIFT)
14 在selenium自动化测试中,你一般完成什么类型的测试?
主要是冒烟测试和回归测试
。回归测试主要写一些功能稳定,容易实现的场景,通过自动化手段去实现,节约测试时间。
15 你是如何管理你的测试用例并执行?
通过单元测试框架实现,常见的有unittest、pytest
16 自动化测试报告生成
Allure
17 你会封装自动化测试框架吗?
分层+PO模式
:
18 自动化测试有误报过bug吗?产生误报怎么办?
19 自动化测试过程中,你遇到了哪些问题,是如何解决的?
20 在上一家公司做自动化测试用的什么框架?
可以说出以下自己擅长的一种:
21 遇到frame框架页面怎么处理?
22 遇到alert弹出窗如何处理?
driver.switch_to.alert()
方法先跳转到alert弹出窗口
accept
点击确定按钮;dismiss
点击取消难;text
获得弹出窗口的文本;23 什么是断言
验证实际结果符合预期结果
,如果测试用例失败,则抛出异常并且提供断言日志24 如何提高selenium脚本的执行速度
25 怎么对含有验证码的功能进行自动化测试
26 自动化测试分为哪几类
27 自动化测试的使用场景?
28 请描述一下自动化测试流程?
29 一个接口的响应在下一个接口中怎么用?(一个请求依赖另一个请求的返回结果)
30 web和app自动化有什么不同?
1 启动差别
2 安装检查
3 页面元素操作
4 元素定位
app端:部分定位方式不支持,比如css_selector
和link_text
web端:name,id,class_name,css,xpath、link_text、partrail_link_text、tag_name、坐标、图像识别
5 启动方式
webdriver.Chrome()
,也可以模拟手机端加载wap页面做wap页面的测试。31 unitest和pytest框架讲解以及使用的是哪个一个为什么不用另一个?
32 分别说出web和app元素定位方法
Web:
id、xpath、name、class_name、tag_name、link_text、partial_link_text、css_selectorapp:
id、classname、xpath33 get和post不同点
从指定的资源请求数据
。请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接向指定的资源提交要被处理的数据
。POST请求会把请求的数据放置在HTTP请求包的包体中34 http和https不同点
1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)
2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
35 selenium原理
36 appium原理
开源、跨平台的UI自动化测试工具,
支持多种语言编写的测试脚本37 android和iOS自动化实现原理的区别(安装环境区别)
38自动化测试用到的模块
requests+unittest+ddt+httptestrunner+pymysql+openpyxl+logging
接口自动化selenium+pytest+allure
web自动化appium+selenium+pytest+allure+yaml
app自动化39 OSI七层模型
40 cookie、session、token各自区别
记录用户的请求状态,
一般默认时间30min
41 常用状态码
42 手写adb命令
adb 帮助:adb --help
启动adb 服务:adb start-server
关闭adb 服务:adb kill-server
获取设备号:adb devices
获取系统版本:adb shell getprop ro.build.version.release
发送文件到手机:adb push 电脑端⽂件路径/需要发送的文件 手机端存储的路径
adb push C:\Users\win\Desktop\xx.png /sdcard
从手机拉取文件: adb pull 手机端的路径/拉取文件名 电脑端存储文件路径
adb pull /sdcard/xx.png C:\Users\win\Desktop
查看手机运行日志: adb logcat
进入到手机终端: adb shell
安装app到手机: adb install 路径/xxx.apk
卸载手机app : adb uninstall app
获取app启动包名和启动名(⚠手机需要先打开对应app)
adb shell dumpsys window windows | grep mFocusedApp
adb shell dumpsys window windows | findstr mCurrent
获取app启动时间: adb shell am start -W 包名/.启动名
查看设备ip地址:
adb shell ifconfig wlan0
adb shell netcfg
查看设备cpu信息: adb shell cat /proc/cpuinfo
查看设备内存信息: adb shell cat /proc/meminfo
43 http请求头和响应头
请求行(request) 请求头部header 、空行和请求数据组成
状态行、响应头报头、空行和响应正文
44 鼠标操作常用函数
context_click()
右击 --> 此方法模拟鼠标右键点击效果double_click()
双击 --> 此方法模拟双标双击效果drag_and_drop()
拖动 --> 此方法模拟双标拖动效果move_to_element()
悬停 --> 此方法模拟鼠标悬停效果perform()
执行 --> 此方法用来执行以上所有鼠标方法45 键盘操作常用函数
send_keys(Keys.BACK_SPACE)
删除键(BackSpace)send_keys(Keys.SPACE)
空格键(Space)send_keys(Keys.TAB)
制表键(Tab)send_keys(Keys.ESCAPE)
回退键(Esc)send_keys(Keys.ENTER)
回车键(Enter)send_keys(Keys.CONTROL,'a')
全选(Ctrl+A)send_keys(Keys.CONTROL,'c')
复制(Ctrl+C)send_keys(Keys.CONTROL,'v')
全选(Ctrl+V)send_keys(Keys.CONTROL,'x')
复制(Ctrl+X)46 解决手动造数据问题
47 你写框架多长时间?
初步模型:1-2周,一个月时间
48 TestCase使用
49 Selenium 中如何保证操作元素的成功率?也就是说如何保证我点击的元素一 定是可以点击的?
driver.implicitly_wait(30)
time.sleep()
id,name,clas,xpath, css selector
不同方式进行定位,如果第一种失败可以自动尝试第二种50 你的自动化用例的执行策略是什么?
51 常见的 POST 提交数据方式
主要有四种方式:
52 目前主流的APP自动化测试框架,各个自动化适合的语言
53 Selenium有哪几种定位方式?用的最多的是哪种?
8种单元素定位方法,8种对应的多元素定位方法;所有方法都是基于driver.find_element()和driver.find_elements()
方法,如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('www.baidu.com')
driver.find_element_by_id('id') # 通过元素id属性定位元素
driver.find_element_by_name('name') # 通过元素名字属性定位元素
driver.find_element_by_tag_name('tag_name') # 通过元素的标签名称定位元素
driver.find_element_by_class_name('class_name') # 通过元素的类名称定位元素
driver.find_element_by_link_text('link_text') # 通过链接元素的完整显示文字定位元素
driver.find_element_by_partial_link_text('partial_link_text') # 通过链接元素的部分显示文字定位元素
driver.find_element_by_xpath('xpath') # 通过xpath表达式定位元素
driver.find_element_by_css_selector('css_selector') # 通过css表达式定位元素
driver.find_elements_by_id('id') # find_elements_by_xxx系列也有8种,可以定位多个满足条件的元素
driver.find_element(By.ID, 'id') # 每一个find_element_by_xxx方法都是基于find_element方法的
driver.find_elements(By.ID, 'id') # find_element()方法的复数形式,可以定位多个满足条件的元素
为了保证代码的统一性,使用的最多的是driver.find_element_by_xpath()
这个方法,传入定位器,即使我们使用id作为定位器,仍然写成基于id的xpath定位器表达式,如下:
baidu_yi_xia_locator = ‘//input[@id="su"]’ # 百度一下按钮的定位器,写成了xpath,但基于的是id这个属性
baidu_yi_xia = driver.find_element_by_xpath(baidu_yi_xia_locator) #定位元素,并返回给变量
baidu_yi_xia.click() # 点击百度一下
54 UI自动化能发现多少Bug
减轻重复的基础操作和线上监控的作用
55 monkey属于自动化吗?
monkey不属于严格意义上的自动化,monkey是生成用户或系统的伪随机事件,在屏幕上触发随机点击事件
56 你们一般对什么case会进行自动化,自动化一般在哪个阶段进行
集成阶段进行该版本的自动化监控,平常的话会一直跑线上监控的
57 app自动化你们一般用什么工具定位元素?
58 您需要一台服务器机器来运行Appium上的测试吗?
59 使用Appium可能遇到的错误是什么?
错误1
:需要以下所需的功能,但不提供:设备名称,platformName 错误2
:找不到adb。请使用Android SDK根目录路径设置ANDROID_HOME环境变量错误3
:openqa.selenium.SessionNotCreatedException
:无法创建新的会话错误4
:如何在移动应用程序中查找DOM元素或XPath?60 简述Appium的原理?
61 如何提高selenium脚本的执行速度?
如网速、操作步骤的繁琐程度、页面加载的速度、在脚本中设置的等待时间、运行脚本的线程数等。所以不能单方面追求运行速度的,要确保稳定性,能稳定地实现回归测试才是关键。
62 什么是持续集成?
63 什么是page object设计模式?
通过分离测试对象和测试脚本的抽象来实现的
64 你觉得自动化测试最大的缺陷是什么?
65 Selenium是否支持桌面应用软件的自动化测试。
66 BDD是什么?你了解多少?TDD是什么?
BDD:行为驱动开发
(Behavior Driven Development)
TDD:测试驱动开发
(Test-Driven Development)
67 selenium是否可以直接读取Excel表中测试用例,来执行相关测试
可以的,需要借助第三方库
68 Selenium有哪些组件?
最早的有Selenium IDE
,IDE只支持安装在fiefox上一个插件,支持录制自动化脚本。还有
remote RC
、Grid
、webdriver
。我们一般最重要的就是使用webdriver。
69 如果元素定位中遇到iFrame内嵌框架,你是如何定位的?如果没有遇到id属性和name属性为空的情况,又是如何处理的?
# 切入frame有3种方式
# (1) 通过frame的id属性或name属性
driver.switch_to.frame('layui-layer-iframe1')
# (2) 通过frame的index,从0开始(第1个iframe)
driver.switch_to.frame(0)
# (3) 通过定位器,配合find_element()方法,定位到框架元素后,再把这个定位到的框架元素入参iframe_loc = '//iframe[@id="layui-layer-iframe1"]'
driver.switch_to.frame(driver.find_element_by_xpath(iframe_loc))
//input[@value="百度一下"]
70 明明自己定位的元素是对的,执行自动化测试脚本时却报错,这时你有几种方法解决此问题?请写出你的解决方法。
from selenium import webdriver
driver = webdriver.Chrome()
# 设置全局等待(即:隐式等待),注意只需要设置一次
driver.implicitly_wait(60) # 延长到60秒
显示等待(智能等待)的代码如下:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
mobile_phone_loc = (By.XPATH, '//input[@name="mobilephone"]')
elem = WebDriverWait(driver, 60).until(EC.element_to_be_clickable(mobile_phone_loc))
elem.send_keys('13812345678')
71 简单说出如何用自动化测试脚本实现遍历复选框点击功能(要求全部勾上)。
xPathRadio = '//input[@type="radio"]'
# radiobox复选框对象我们必须使用find_elements方法去定位多个元素(复选框就是多元素)
radioboxes = driver.find_elements_by_xpath(xPathRadio)
# 使用循环遍历的方式,逐个点击这些定位到的元素
for radiobox in radioboxes:
radiobox.click()
72 写一个自动化脚本,语言不限,要求每执行一次脚本随机生成一个手机号码。
import random # 导入随机数模块 # 一开始,手机号是空的 mobile_phone = '' # 在中国,手机号码的第一位都是1 phone_num_1 = '1' # 把第一位生成的数字拼接到手机号 mobile_phone = mobile_phone + phone_num_1 # 根据不同的运营商,手机号码的第2位和第3位都是有固定值的,这里随便列举了几个,放入列表 phone_num_2_to_3 = ['38', '82', '88', '36', '30'] # choices方法可以随机抽取列表里的元素,从而生成第二三位手机号码,并拼接到手机号 phone_num_2_to_3 = random.choices(phone_num_2_to_3)[0] mobile_phone = mobile_phone + phone_num_2_to_3 # 最后8个数字,循环生成 for i in range(8): # randint方法可以随机产生0~9的值,但是为了拼接字符串,我们用str()方法转换 phone_num = str(random.randint(0, 9)) # 每一次循环都会生成一个数字,并且继续拼接到现有的电话号码里 mobile_phone = mobile_phone + phone_num # 打印最终生成的手机号码 print(mobile_phone)
73 你对单元测试框架了解多少
unittest、testng、nose、pytest、
74.深拷贝和浅拷贝的区别?
浅拷贝
:浅拷贝是对于一个对象的顶层拷贝。简单理解:拷贝了引用,并没有拷贝内容(对象)75 web/app动态元素如何定位
//*[contains(@resource-id,"fixedWrap")]//*[@content-desc="自选"]
//android.widget.LinearLayout[contains(@resource-id,"home_item_layout_bg") and @index="1"]
//*[contains(@resource-id,"myfund_name_text_view") and @text="${fund_name}"]/../..//android.widget.LinearLayout[1]
76 没有找到元素的原因可能是什么?
self.driver.implicitly_wait(time_to_wait=5)
WebDriverWait(self.driver, timeout).until(EC.element_to_be_clickable(locator)) #元素是否可点击
WebDriverWait(self.driver, timeout).until(EC.visibility_of_element_located(locator)) #元素是否可见
WebDriverWait(self.driver, timeout).until(EC.presence_of_element_located(locator)) # 元素是否存在
77 验证码如何处理
78 ui自动化中登录如何处理
在conftest.py中定义fixture夹具,在对应测试用例调用
@pytest.fixture() def driver(): global d d = webdriver.Chrome() d.implicitly_wait(5) d.maximize_window() yield d d.quit() @pytest.fixture() def login(driver): # 调用fixture时一定要在定义函数中传入driver,否则报错 lg = LoginPage(driver) lg.login('1a2b','abcd') time.sleep(5) return driver def test_xxxx(self, login): # 调用login driver = login page = LoginPage(driver)
79 字典里嵌套字典或列表,如何获取值?
通过re.search()方法
import re
import json
res = {'code': 0, 'success': True, 'data': {
'result': {'isSucceed': True, 'message': '44704', 'mdmId': 0, 'setMessage': True, 'setIsSucceed': True,
'setMdmId': False}}, 'msg': None}
res= json.dumps(res)
info = re.compile(r'"message": ".*?"')
print(info.search(res).group().split(":")[1].strip(' ,"'))
# code = re.search(r'"message": ".*?"',res)[0].split(":")[1].strip(' "')
# print(code)
80 docker怎么用(常用命令)
sudo systemctl start docker
docker images
docer image rmi image ID
docker image rm 镜像版本号:标签名
docker run imagename
docker run -dit 镜像版本名:标签名 /bin/bash
docker run -dit --name 容器名称 -v 宿主机目录:容器目录 -P 宿主机端口:映射端口 镜像名称
docker exec -it 容器名 /bin/bash
docker ps -a
docker stop containerID
docker restart 容器名(容器id)
docker rm -f containerID
docker rm containerID
docker container logs container_id
81 微信小程序怎么实现自动化?
desired_caps["recreateChromeDriverSessions"] = True # 支持X5内核应用自动化配置
desired_caps["chromedriverExecutableDir"] = r'D:\xxxx\chromedriver' # 指定driver版本
desired_caps["chromeOptions"] = {"androidProcess": "com.tencent.mm:appbrand0"}
82.字符串怎么转字典
s = '{"name":"zhangsan","age":13,"sex":"男"}'
# 法1 json.loads()
import json
# print(json.loads(s))
# 法2:eval()
# print(eval(s))
# 法3 : ast.literal_eval()
import ast
print(ast.literal_eval(s))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。