阿里测开面试大全(一)附答案完整版
万字长文,建议收藏
1 什么是POM,为什么要使用它?
POM是Page Object Model的简称,它是一种设计思想,而不是框架。大概的意思是,把一个一个页面,当做一个对象,页面的元素和元素之间操作方法就是页面对象的属性和行为,所以自然而然就用了类的思想来组织我们的页面。一般一个页面写一个类文件,这个类文件包含该页面的元素定位和业务操作方法
为了我们测试用例写的简单,清晰,我们很多时候在页面对象会封装很多业务操作方法,测试脚本只需要调用相关方法就可以。
2如果页面元素经常发生需求变化,你是如何做?
采用POM思想。好处就是只要改一个页面,我就去修改这个页面对象的元素定位和相关方法,脚本不需要修改。
3 在你做自动化过程中,遇到了什么问题吗?举例下
频繁地变更UI,经常要修改页面对象里面代码
运行用例报错和处理,例如元素不可见,元素找不到这样异常
测试脚本复用,尽可能多代码复用
一些新框架产生的页面元素定位问题,例如ck编辑器,动态表格等
4 举例一下你遇到过那些异常,在selenium自动化测试过程中
ElementNotSelectableException :元素不能选择异常
ElementNotVisibleException :元素不可见异常
NoSuchAttributeException :没有这样属性异常
NoSuchElementException:没有该元素异常
NoSuchFrameException :没有该frame异常
TimeoutException : 超时异常
Element not visible at this point :在当前点元素不可见
5 如何处理alert弹窗
我们常见的alert弹窗有两种:基于windows弹窗和基于web页面弹窗
webdriver是能够处理alert弹窗的,Selenium提供了Alert这个接口。
相关操作代码如下:
Alert alert = driver.switchTo().alert() // 切换到Alert
alert.accept() // 点击弹窗上确定按钮
alert.dismiss() // 点击弹窗的取消按钮
alert.getText() // 获取弹窗上线上的文本文字内容
alert.sendkeys() // 有些弹窗还支持文本输入,这个可以把要输入字符通过sendkeys方法输入
6 在selenium中如何处理多窗口?
这个多窗口之间跳转处理,在实际selenium自动化测试经常遇到。就是,你点击一个链接,这个链接会在一个新的tab打开,然后你接下来要查找元素在新tab打开的页面,所以这里需要用到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 如何处理下拉菜单?
通常我们也可以通过Click方法来点击下拉菜单里面的元素,还有一种方法,在Selenium中有一个类叫Select,支持这种下拉菜单交互的操作。
基本使用语法是这样的:
Se=new Select(element)
Se.selectByIndex(index)
Se.selectByvalue(value)
Se.selectByVisibleText(text)
9 关闭浏览器中quit和close的区别?
close是关闭你当前聚焦的tab页面;
而quit是关闭全部浏览器tab页面,并退出浏览器session;
quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作
10 什么是imlicitlyWait(隐式等待)
webdriver 会在指定的超时时间范围内不断的查找元素,直到找到元素或超时
11 什么是expliciteWait(显式等待)
通常是我们自定义的一段代码,这段代码用来等待某种条件发生后,再继续执行后续的代码
12 如何实现文件上传?
我们在web页面实现文件上传过程中,可以直接把文件在磁盘完整路径,通过sendKeys方法实现上传
13 如何实现鼠标悬停,键盘事件和拖拽动作?
在Webdriver中,处理键盘事件和鼠标事件,一般使用Actions类提供的方法,包括鼠标悬停,拖拽和组合键输入。
这里介绍几个方法
方法: clickAndHold()
使用场景:找到一个元素,点击鼠标左键,不放手。自己可以点击鼠标不松开试试这个场景。
方法:contentClick()
使用场景:模拟鼠标右键点击,一般右键会带出菜单来。
方法:doubelClick()
使用场景:模拟鼠标双击
方法:dragAndDrop(source,target)
使用场景:模拟从source这个位置,拖拽一个元素到target位置
键盘事件方法:keyDown(keys.ALT), keyUp(keys.SHIFT)
使用场景:点击键盘事件,分为两个动作,一个点击键盘,第二个动作是释放点击(松开)
14 在selenium自动化测试中,你一般完成什么类型的测试?
主要是冒烟测试和回归测试。回归测试主要写一些功能稳定,容易实现的场景,通过自动化手段去实现,节约测试时间。
15 你是如何管理你的测试用例并执行?
通过单元测试框架实现,常见的有unittest、pytest
16 自动化测试报告生成
Allure
17 你会封装自动化测试框架吗?
自动化框架主要的核心框架就是分层+PO模式:
分别为:基础封装层BasePage,PO页面对象层,TestCase测试用例层。然后再加上日志处理模块,ini配置文件读取模块,unittest+ddt数据驱动模块,jenkins持续集成模式组成。
18 自动化测试有误报过bug吗?产生误报怎么办?
有误报过,有时候自动化测试报告中显示发现了bug,实际去通过手工测试去确认又不存在该bug。
误报原因一般是:
1.元素定位不稳定,需要尽量提高脚本的稳定性;
2.开发更新了页面但是测试没有及时更新维护!
19 自动化测试过程中,你遇到了哪些问题,是如何解决的?
1.频繁地变更页面,经常要修改页面对象类里面的代码
2.自动化测试偶尔出现过误报
3.自动化测试结果出现覆盖的情况:Jenkins根据时间建立文件夹
4.自动化测试代码维护比较麻烦
5.自动化测试进行数据库对比数据
20 在上一家公司做自动化测试用的什么框架?
可以说出以下自己擅长的一种:
1.python+selenium+unittest+htmltestrunner
2.python+selenium+pytest+allure
3.robotframework+Selenium2Library
21 遇到frame框架页面怎么处理?
先用driver.switch_to.frame()跳转进去frame,
然后再操作页面元素,
操作完后使用driver.swith_to.default_content()跳转出来
22 遇到alert弹出窗如何处理?
使用driver.switch_to.alert()方法先跳转到alert弹出窗口
然后再通过accept点击确定按钮;
通过dismiss点击取消难;
通过text获得弹出窗口的文本;
23 什么是断言
断言assert 用于代码中验证实际结果符合预期结果,如果测试用例失败,则抛出异常并且提供断言日志
24 如何提高selenium脚本的执行速度
1、优化等待时间,使用WebDriverWait智能等待代替强制等待sleep和隐式等待imlicitlyWait
2、减少不必要的操作
3、在服务器允许的情况下,使用多线程实现并发执行测试用例
25 怎么对含有验证码的功能进行自动化测试
图像识,难度大,效果不好不推荐
屏蔽验证码,邀请开发处理,在测试环境,预发和正式环境恢复
通过数据库抓取验证码
26 自动化测试分为哪几类
UI自动化:又分为web和和app自动化
接口自动化
27 自动化测试的使用场景?
需求稳定,不会频繁变更。
研发和测试周期长,需要频繁执行回归测试。
需要在多种平台上重复运行相同测试的场景。
某些测试项目,通过手工测试无法实现,或者手工成本太高。
被测软件的开发较为规范,能够保证系统的可测试行
28 请描述一下自动化测试流程?
1.编写自动化测试计划
2.设计自动化测试用例
3.编写自动化测试框架和脚本
4.调试并维护脚本
5.无人值守测试
6.后期脚本维护(添加用例、开发更新版本)
29 一个接口的响应在下一个接口中怎么用?(一个请求依赖另一个请求的返回结果)
cookie 全局变量 反射
存储到excel表,需要时再取
框架里边的期望结果: 查库 依赖用户成功之后
30 web和app自动化有什么不同?
1 启动差别
app端:在执行用例的时候,一部安卓手机同一时刻只能打开一个apk包进行操作
web端:在web端,通过Python多线程(或多进程)同时开启几个浏览器,让selenium对多个浏览器进行操作;
2 安装检查
app端:需要先检查软件是否安装才能进行测试
web端:不需要安装,在浏览器中输入url就可以测试。
3 页面元素操作
app端:需要保证不可见的元素显示在手机页面才能对它进行操作。
web端:如果遇到需要下拉才能加载的页面,可以用js操作滚动条。
4 元素定位
app端:部分定位方式不支持,比如css_selector和link_text
web端:name,id,class_name,css,xpath、link_text、partrail_link_text、tag_name、坐标、图像识别
5 启动方式
app端:需要制定desired_caps内容,因为里面包含了设备信息等。
web端:通过启动webdriver不同的浏览器类,获取driver,如webdriver.Chrome(),也可以模拟手机端加载wap页面做wap页面的测试。
31 unitest和pytest框架讲解以及使用的是哪个一个为什么不用另一个?
较unittest,pytest有以下优点
自动发现测试模块、测试方法
断言使用asert+表达式
可以设置会话级、模块级、类级、函数级的fixtures、数据准备+清理工作
有丰富的插件库,目前在300个以上。
32 分别说出web和app元素定位方法
Web:id、xpath、name、class_name、tag_name、link_text、partial_link_text、css_selector
app: id、classname、xpath
33 get和post不同点
GET - 从指定的资源请求数据。请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接
POST - 向指定的资源提交要被处理的数据。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原理
当使用 Selenium 2.0 启动浏览器时,后台会同时启动基于 WebDriver Wire 协议的 Web Service 作为 Selenium 的 Remote Server,并与浏览器绑定。之后Remote Server 就开始监听 Client 端的操作请求;
执行测试时,测试用例会作为 Client 端,将需要执行的页面操作请求以 Http Request 的方式发送给 Remote Server 。该 Http Request 的 body,是以 WebDriver Wire 协议规定的 JSON 格式来描述需要浏览器执行的具体操作;
Remote Server 接收到请求后,会对请求进行解析,并将解析结果发给 WebDriver,由WebDriver 实际执行浏览器的操作;
WebDriver 可以看做是直接操作浏览器的原生组件(Native Component),所以搭建测试环境时,通常都需要先下载浏览器对应的 WebDriver。
源代码:通过 subprocess.Popen 启动 chromedriver.exe 程序,从而提供服务
driver.get, driver.find_element 等方法底层都调用 self.execute方法, 而最终都是去访问 chromedriver 提供的接口地址
36 appium原理
开源、跨平台的UI自动化测试工具,支持多种语言编写的测试脚本
原理:
test scripts(测试脚本发送一个请求到appium server)
appium server接收到请求后进行解析并把请求转发给 bootstrap.jar。
jar接收到appium的命令,调用UIAutomator命令实现操作
最终结果由bootstrap.jar返回给Appium server。
37 android和iOS自动化实现原理的区别(安装环境区别)
都需要安装 jdk、nodejs、appium、appi-client
appium自动化原理:
Appium提供各个语言的第三方库,将测试脚本转化成 WebDriver 协议下的 URL,通过 Node 服务发送到各个平台上的代理工具,代理工具在运行过程中不断接收 URL,根据 WebDriver 协议解析出要执行的操作,然后调用各个平台上的原生测试框架完成测试,再将测试结果返回给 Node 服务器。
appium android自动化原理是:
google官方sdk自带了一个操作APP的UI的框架叫做uiautomator,然后appium初始化的时候,就会推送一个bootstrip.jar推送到手机,然后appium client发送请求到appium server,然后server发送到bootstrip.jar,bootstrip.jar调用uiautomator接口,由uiautomator驱动APP的UI界面操作,然后bootstrip.jar返回操作的结果给appium server
appium ios原理:
appium在iOS上的实际上就是使用了WebDriverAgent,作为实现webdriver协议的驱动层,通过驱动苹果的UIAutomationUI框架完成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各自区别
cookie:在客户端存储在客户端用于存储会话信息的
session:在服务器端,记录用户的请求状态,一般默认时间30min
session_id会存在cookie中,每次请求cookie中所有信息都会传递给服务器,服务器通过 session_id来识别是否是同一个用户请求,不是同一个用户的话,就会要求重新登录
token:访问权限
鉴权:访问的接口是否正常,是否非法访问绕过前端。防止跳过页面直接访问接口。token
授权:是否具有访问接口的权限。 唯一全局动态的 。key
41 常用状态码
100系列:请求已收到继续处理;
200系列:表示成功
200:正常,服务器正确响应了请求
300系列:资源重定向;
301:永久重定向;请求的网页已永久移动到新位置
302:2临时重定向;被请求文档已经临时移至别处,此文档新的url在location响应头中给出
303:浏览器对于POST的响应进行重定向至新的url
307:浏览器对于GET的响应重定向至新的url
400系列:客户端错误:
400:错误请求;服务器不理解请求的语法。
401:未授权;如请求参数、方法、格式等
403:拒绝访问;服务器理解客户的请求,但拒绝处理它(没有权限)
404:请求资源不存在
500系列:服务器端出错
500:服务器内部错误
501:尚未实施;服务器不具备完成请求的功能
502:服务器网关错误
503:服务器由于维护或者负载过重未能应答
504请求超时
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)
Mac/Linux: adb shell dumpsys window windows | grep mFocusedApp
在 Windows 终端运⾏: 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请求头和响应头
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 解决手动造数据问题
参数化
手机号:
excel里边存放初始手机号 每次执行完,回写新的手机号(原来号码+1)
每次从数据库里查询最大手机号,在这个基础上加1
变量替换: 数据库依赖关系 ${mobile} ${regtime} ${memberid} ${loanid}
最关键:用例设计、用例参数之间依赖关系
47 你写框架多长时间?
初步模型:1-2周,一个月时间
48 TestCase使用
导入unittest模块、被测文件或其中的类
创建一个测试类,并继承unitest.TestCase
定义测试函数,函数名已test_开头,测试用例
调用unittest.main()方法运行测试用例
49 Selenium 中如何保证操作元素的成功率?也就是说如何保证我点击的元素一 定是可以点击的?
1.添加元素智能(隐性)等待时间 driver.implicitly_wait(30)
2.添加强制等待时间 time.sleep()
3.try 方式进行id,name,clas,xpath, css selector不同方式进行定位,如果第一种失败可以自动尝试第二种
50 你的自动化用例的执行策略是什么?
利用自动化测试工具,经过测试需求分析;
设计出自动化测试用例;
从而搭建自动化测试的框架,设计与编写自动化脚 本;
验证测试脚本的正确性,最终完成自动化测试测试脚本(即主要功能为测试的应用软件)
输出测试结果
51 常见的 POST 提交数据方式
主要有四种方式:
application/x-www-form-urlencoded;
multipart/form-data;
application/json;
text/xml
52 目前主流的APP自动化测试框架,各个自动化适合的语言
appium macaca、robotium、UiAutomator
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
UI自动化的目的不是为了发现多少Bug,主要是为了减轻重复的基础操作和线上监控的作用
55 monkey属于自动化吗?
monkey不属于严格意义上的自动化,monkey是生成用户或系统的伪随机事件,在屏幕上触发随机点击事件
56 你们一般对什么case会进行自动化,自动化一般在哪个阶段进行
主要是主流程中比较容易实现的进行自动化,一般在集成阶段进行该版本的自动化监控,平常的话会一直跑线上监控的
57 app自动化你们一般用什么工具定位元素?
Uiautomatorview和appium的客户端
58 您需要一台服务器机器来运行Appium上的测试吗?
不需要服务器机器在Appium上运行测试。 Appium促进了一个2层架构,其中测试机连接到运行Appium的测试服务器并自动化整个事情。您可以在运行测试的同一台机器上运行Appium。
59 使用Appium可能遇到的错误是什么?
错误1:需要以下所需的功能,但不提供:设备名称,platformName
错误2:找不到adb。请使用Android SDK根目录路径设置ANDROID_HOME环境变量
错误3:openqa.selenium.SessionNotCreatedException:无法创建新的会话
错误4:如何在移动应用程序中查找DOM元素或XPath?
60 简述Appium的原理?
Appium是使用Node.js平台编写的“HTTP Server”,并使用Webdriver JSON线协议驱动iOS和Android会话。
在初始化Appium Server之前,必须在系统上预先安装Node.js 当Appium被下载并安装时,在我们的机器上设置一个暴露REST API的服务器
它从客户端接收连接和命令请求,并在移动设备(Android / iOS)上执行该命令,
它响应HTTP响应。
再次,为了执行此请求,它使用移动测试自动化框架来驱动应用程序的用户界面。 框架像Apple Instruments for iOS(仅适用于Xcode 3.0或更高版本的OS X v10.5及更高版本)适用于Android API的Google UIAutomator 16级或更高版本Selendroid for Android API等级在15以下。
61 如何提高selenium脚本的执行速度?
如网速、操作步骤的繁琐程度、页面加载的速度、在脚本中设置的等待时间、运行脚本的线程数等。所以不能单方面追求运行速度的,要确保稳定性,能稳定地实现回归测试才是关键。
减少操作步骤,如经过三四步才能打开我们要测试的页面的话,我们就可以直接通过网址来打开,减少不必要的操作。
中断页面加载,如果页面加载的内容过多,我们可以查看一下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页面加载。
在设置等待时间的时候,可以sleep固定的时间,也可以检测某个元素出现后中断等待也可以提高速度。
四,配置testNG实现多线程。在编写测试用例的时候,一定要实现松耦合,然后在服务器允许的情况下,尽量设置多线程运行,提高执行速度。
62 什么是持续集成?
持续集成源于极限编程(XP),是一种软件实践,软件开发过程中集成步骤是一个漫长并且无法预测的过程。集成过程中可能会爆发大量的问题,因此集成过程需要尽可能小而多,实际上持续集成讲的是不断的去做软件的集成工作。持续集成,最简单的形式是包括一个监控版本控制(SVN等等)变化的工具。当变化被发觉时,这个工具可以自动的编译并测试你的应用
63 什么是page object设计模式?
通过分离测试对象和测试脚本的抽象来实现的
64 你觉得自动化测试最大的缺陷是什么?
不稳定
可靠性
不易维护
成本与收益
65 Selenium是否支持桌面应用软件的自动化测试。
Selenium不支持桌面软件的自动化测试,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属性为空的情况,又是如何处理的?
第一个问题:遇到iFrame内嵌框架里的任何元素,和以往一样写出定位器就可以了,只是在执行脚本的时候,定位器是正确的,但是仍然脚本执行失败,报错“无法找到元素”。原因就是因为这个元素被嵌在了iFrame内嵌框架中(我们也叫子框架),所以需要在定位元素前,先写以下代码,作用是从当前的主框架切换到内嵌框架中,有多种方式:
# 切入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))
第二个问题:没有id或者name属性,只需要用xpath写出表达式,表达式中利用元素的其他单个或多个属性的组合,只要能够保证元素的唯一性即可,如下例子:
//input[@value="百度一下"]
70 明明自己定位的元素是对的,执行自动化测试脚本时却报错,这时你有几种方法解决此问题?请写出你的解决方法。
(1)元素在iFrame里:先切入iFrame
(2)元素在打开的新窗口里:先切入新窗口
(3)元素在新跳转的页面里,但是因为各种原因,新页面跳转很慢,已经超过了Selenium中对于元素定位的最大等待时间:增加隐式等待时间或对这个元素进行智能等待
隐式等待的代码如下:
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.深拷贝和浅拷贝的区别?
浅拷贝:浅拷贝是对于一个对象的顶层拷贝。简单理解:拷贝了引用,并没有拷贝内容(对象)
深拷贝:对于一个对象所有层次的拷贝(递归)
全都是不可变类型的数据:copy.copy、copy.deepcopy都是引用指向
包含不可变类型的数据:deepcopy是深拷贝,copy.copy是指向引用
不可变对象中包含可变对象:copy.copy是引用指向,deepcopy是开辟新的内存地址,即深层拷贝
75 web/app动态元素如何定位
对于属性值动态:
用xpath+模糊匹配定位方式:
driver.find_element_by_xpath(“//标签名[contains(@属性,‘部分片段值’)]”)
driver.find_element_by_xpath(“//标签名[starts-with(@属性,‘头部片段值’)]”)
driver.find_element_by_xpath(“//标签名[ends-with(@属性,‘尾部片段值’)]”)
属性可以为 id、name、tag_name、link_text、partial_link_text等
用模糊组合定位:
driver.find_element_by_xpath(“//标签名[contains(@属性1,‘片段值’) and @属性2=‘属性值’ and …]")
位置动态:
采用兄弟节点/父子节点方式定位
//*[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 没有找到元素的原因可能是什么?
元素定位表达式写错
定位的元素属性值会动态发生变化
解决方案:
1)通过数据库查询属性值再动态传入
2)组合定位:兄弟节点、父子节点、子孙节点方式
3) 模糊定位方式:starts-with、ends-with、contains(参考75)
元素没加载
解决方法:全局加隐式等待
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)) # 元素是否存在
页面加载慢,添加强制等待
元素不在该页面
切换到iframe(id、name、index方式)再处理元素
window(句柄切换:self.driver.switch_to.window(current_window_handles[-1]))
alert(先切换到alert(self.driver.switch_to.alert)
77 验证码如何处理
元素滑动方式:
定位滑块–>模拟单击滑块,让拼图和缺口显现出来–>获得缺口位置–>计算需要滑动的距离–>通过ActionChains函数滑动滑动
通过opencv库计算阀值匹配背景和缺口(推荐)
参考:https://segmentfault.com/a/1190000019218588
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怎么用(常用命令)
镜像:
启动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 微信小程序怎么实现自动化?
连接真机:开启usb调式模式
打开x5内核调试模式:http://debugmm.qq.com/?forcex5=true
Android Screen Monitor 显示真机屏幕
核心配置参数
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))
相关文章:

阿里测开面试大全(一)附答案完整版
万字长文,建议收藏 1 什么是POM,为什么要使用它? POM是Page Object Model的简称,它是一种设计思想,而不是框架。大概的意思是,把一个一个页面,当做一个对象,页面的元素和元素之间操…...

STL-常用容器
string容器 string构造函数 string本质:类 string和char*区别: char* 是一个指针 string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器。 特点: string类内部封装了很多成员方法 …...
【owt】关闭microk8s 等无关服务
打算部署下owt,发现之前跑了microk8s ,一直运行:操作指令 // 1. 启动 microk8s.start// 2. 关闭 microk8s.stop// 3. kubectl 操作 // --- 查看 cluster microk8s.kubectl cluster-info// --- 查看 nodes microk8s.kubectl get nodes// --- 查看 pods microk8s.kubectl get …...

【面试题】——Spring
1.Spring是什么? Spring是一个开源的Java应用框架,它提供了广泛的基础设施支持,用于构建Java应用程序。极大提高了开发效率。它提供了一种轻量级的编程模型,通过依赖注入(Dependency Injection)和面向切面…...

【算法思想-排序】根据另一个数组次序排序 - 力扣 1122 题
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计
基于stm32单片机的app视频遥控抽水灭火水泵小车设计 1、项目简介1.1 系统构成1.2 系统功能 2、部分电路设计2.1 L298N电机驱动电路设计2.2 继电器控制电路设计 3、部分代码展示3.1 小车控制代码3.1 水泵控制代码 4 演示视频及代码资料获取 1、项目简介 视频简介中包含资料http…...
编译原生安卓aosp源码,实现硬改以及定位
系列文章目录 第一章 安卓aosp源码编译环境搭建 第二章 手机硬件参数介绍和校验算法 第三章 修改安卓aosp代码更改硬件参数 第四章 编译定制rom并刷机实现硬改(一) 第五章 编译定制rom并刷机实现硬改(二) 第六章 不root不magisk不xposed lsposed frida原生修改定位 第七章 安卓…...
找单身狗。一个数组中只有两个数字出现一次,其他数字出现了两次,编写一个函数找出这两个只出现一次的数字
例:在{1 2 3 4 5 6 1 2 3 4}找出5和6 方法二: 设计思想: 1.分组原理 (1)将所有数字进行异或,相同数字异或为零,所以只会剩5^6,即为异或的结果xor_result (…...
Java数据结构技巧
Java数据结构技巧 1、循环 for-each循环如果不是"[]"的数组类型,则需要提前判断数据结构是否为空,否则有可能会有空指针异常。 2、对于List对象的i到j位进行排序 for(List<String> now_result:result){List<String> sublist …...
easyui disabled 属性设置
1.设置disabled $("#id").attr("disabled",true); 或 $("#id").attr("disabled","随意字符"); easyui写法 $("#id").numberbox("textbox").attr("disabled", true); $("#id")…...

使用容器运行Nginx应用及Docker命令
目录 一、使用容器运行Nginx应用 1.1 使用docker run命令运行Nginx应用 1.1.1 观察下载容器镜像过程 1.1.2 观察容器运行情况 编辑 1.2 访问容器中运行的Nginx服务 1.2.1 确认容器IP地址 1.2.2 容器网络说明 1.2.3 在主机中使用curl命令容器IP地址访问 二、Docker命…...
fastapi 基本介绍+使用
FastAPI是一个基于Python 3.6的现代、快速(高性能)的web框架,它使用Starlette作为其底层Web框架。FastAPI有很好的文档和丰富的功能,包括自动为路由生成API文档、查询参数验证、依赖注入、WebSocket等等。 以下是一个FastAPI的基…...
C语言的结构体的认识
注:类似于①、②……是代码的编写顺序,也是对下方代码的注解 【①】、【②】……是用到了之前的代码 #include <stdio.h> //②定义生日结构体,必须声明在前面不然会报错,c语言是从上到下执行的(这点要注意&#…...
只通过在vimrc文件写东西来实现或安装vim的插件
2023年9月23日,周日上午 有时候觉得用插件管理器来安装插件太麻烦了, 所以我就在想能不能只通过在vimrc文件写东西来实现或安装vim的插件, 不过这样做肯定有很大的局限性,但我会尽量做到最好的效果 不定期更新 把下面这些代码…...

云原生Kubernetes:K8S存储卷
目录 一、理论 1.存储卷 2.emptyDir 存储卷 3.hostPath卷 4.NFS共享存储 5.PVC 和 PV 6.静态创建PV 7.动态创建PV 二、实验 1.emptyDir 存储卷 2.hostPath卷 3.NFS共享存储 4.静态创建PV 5.动态创建PV 三、问题 1.生成pod一直pending 2.shoumount -e未显示共享…...
“五育”并举育人体系构建的实践研究课题实施方案
目录 一、研究背景与意义 二、课题理论依据 三、国内外研究情况与现状 四、研究目标...

小样本目标检测:ECEA: Extensible Co-Existing Attention for Few-Shot Object Detection
论文作者:Zhimeng Xin,Tianxu Wu,Shiming Chen,Yixiong Zou,Ling Shao,Xinge You 作者单位:Huazhong University of Science and Technology; UCAS-Terminus AI Lab 论文链接:http://arxiv.org/abs/2309.08196v1 内容简介: 1&…...

Android 10.0 系统开启和关闭黑白模式主题功能实现
1. 概述 在10.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…...
Linux-VI和VIM
目录 VI的使用 VI的三种模式 进入VI 切换至插入模式(Insert mode)编辑文件 Insert 的切换 退出VI及保存文件 搜索 快捷删除 光标定位到最后一行 VIM查找字符串 全匹配 模糊匹配(正则表达式) 快速查找…...

【送书】实现可观测性平台的技术要点是什么?
文章目录 实现可观测性平台的技术要点是什么?兼容全域信号量所谓全域信号量有哪些?统一采集和上传工具统一的存储后台自由探索和综合使用数据总结 实现可观测性平台的技术要点是什么? 随着可观测性理念的深入人心,可观测性平台已经开始进入了落地阶段…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...