自动化面试常问问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⾃动化⾃试常问问题
1.怎么判断元素是否存在?
判断元素是否存在和是否浮现不同,判断是否存在乎味着如果这个元素压根就不存在,就会抛出NoSuchElementException
这样就可以使⾃try catch,如果catch到NoSuchElementException 就返回false。
通常在项⾃中会把这个功能封装在isElementPresent⾃
法中。
2.如何判断元素是否浮现?
判断元素是否浮现,存在两种情况,⾃种是该元素压根就没有,⾃然不会浮现;此外⾃种是有这样的元素,但是是hidden状
态可以通过先判断是否存在,如果不存在返回false;如果存在再去判断是否displayed。
5. 如何去定位页⾃上动态加载的元素?
触发动态事件,然后findElemnt
如果是动态菜单,需要⾃级⾃级find (JS实现)
6.如何去定位属性动态变化的元素?
属性动态变化是指该element没有固定的属性值,所以只能通过相对位置定位
⾃如通过xpath的轴, parent/following-sibling /precent-sibling 等
此外也可以尝试findbyelements遍历
8.⾃动化测试的时候是否需要连接数据库做数据校验?
⾃般来说1、 UI⾃动化不需要(很少需要); 2、接⾃测试会需要:从数据库层⾃来进⾃数据校验可以更⾃便验证系统的数据处理⾃⾃是否正确;
9.有⾃种元素常⾃定位⾃式,分别是?你最偏爱哪⾃种,为什么?
8种: id、name、class name、tag name、link text、partial link text、xpath、css selector 偏爱哪⾃种?答:
我最常⾃的是xpath (或者CssSelector)因为不少情况下, html标签的属性不够规范,⾃法通过单⾃的属性定位,这个时候就只能使⾃xpath可以去重实现定位唯⾃element
事实上定位最快的是Id,因为id是唯⾃的,然⾃⾃多数开辟并没有设置id。
10.怎么提⾃selenium脚本的⾃动化执⾃效率?
1.优化测试⾃例,尽可不使⾃ sleep,减少使⾃ImplicitlyWait
2.多使⾃selenium的WebDriverWait/FluentWait,这样可以优化等待时间
3.减少不必要的操作步骤,如经过三四步才干打开我们要测试的页⾃的话,我们就可以直接通过⾃址来打开,减少不必要的操作。
4.中断页⾃加载,如果页⾃加载的内容过多,我们可以查看⾃下加载慢的原因,如果加载的内容不影响我们测试,就设置超时时间,中断页⾃加载。
5.使⾃性能好的电脑
11.⾃例在运⾃过程中时常会浮现不稳定的情况,也就是这次可以通过,下次⾃法通过了,如何提⾃⾃例的稳定性?
1 ,查找元素前先做判断: ExpectedConditions ⾃⾃的各种⾃法;
2,显式等待:多使⾃WebDriverWait,加之显式等待时间,等要操作的元素浮现之后再执⾃下⾃的操作;
3、多⾃try catch捕获异常;
4,多线程的时候,减少测试⾃例耦合度,因为多线程的执⾃顺序是不受控制的;
5 ,尽量使⾃测试专⾃环境,避免其他类型的测试同时进⾃,对数据造成⾃扰。
12.你的⾃动化⾃例的执⾃策略是什么?
1.⾃动化测试⾃例是⾃来监控的。
集成到jenkins,创建定时任务定时执⾃;
2.有些⾃例在产品上线前必须回归。
jenkins上将任务绑定到开辟的build任务上,触发执⾃;
3.有些⾃例不需要时常执⾃。
jenkins创建⾃个任务,需要执⾃的时候⾃⾃构建即可。
13.什么是持续集成?
频繁的将代码集成到主⾃,持续性的进⾃项⾃的构架,以便能能够快速发现错误,防⾃分⾃⾃幅度偏离主⾃
14.webdriver client的原理是什么?
在selenium启动以后, driver充当了服务器的⾃⾃,跟client和浏览器通信, client根据webdriver协议发送请求给driver。
driver解析请求,并在浏览器上执⾃相应的操作,并把执⾃结果返回给client.
15.webdriver的协议是什么?
The Wire Protocol
16.启动浏览器的时候⾃到的是哪个webdriver协议?
http
18.怎样去选择⾃个下拉框中的value =xx的option?
1.select类⾃⾃提供的⾃法:selectByValue (“xxx”)
2.xpath的语法也可以定位到
9 Appium 与 Selenium的关系
selenium是web端的⾃动化, appium是app端的⾃动化, appium继承了webdriver(也就是selenium 2)
10 appium原理(加载流程)
调⾃Andorid adb完成基本的系统操作
2)向Andriod上部署bootstrap.jar包并启动
3) Forward Android 的端⾃到PC的机器上
4) PC上监听端⾃接受请求,使⾃webdriver协议
5)分析命令并转通过forward的端⾃发给bootstrap.jar包
6) bootstrap接受请求并把命令发给UiAutomator或者插桩体系
⾃、 Appium adb命令和问题
1、⾃机和电脑连接,打开⾃机的开辟者模式打开USB调试
2、CMD中查看⾃机UDID:
adb devices
3、CMD启动appium服务:
appium -a 127.0.0.1 -p 4723 – U ⾃机的UDID --no-reset
3、CMD中查看安卓版本号:
adb shell getprop ro.build.version.release
4、获取apppackage和appactivite
Ⅰ 通过打印⾃志获取:通过CMD(管理员运⾃)adb logcat>C:\log.txt;点击真机或者摹拟器中的应⾃后,按ctrl+c终⾃会⾃成的log⾃志;在⾃志中查找 Displayed定位元素
Ⅱ 通过CMD获取:打开应⾃后输⾃: adb shell dumpsys activity | findstr "mFocusedActivity 或者 adb shell dumpsys window w |findstr / |findstr name=
5、解决代码完善运⾃后,程序⾃响应问题
Ⅰ直接CMD输⾃命令 adb shell 进⾃⾃机
Ⅱ进⾃⾃机之后,进⾃cd data/local/tmp
III 进⾃data/local/tmp 后输⾃ ls 查看全部⾃录,应该有⾃个AppiumBootstrap.jar,可能你的名字是AppiumBoots或者AppiumBootstrap.j Ⅳ输⾃ mv 加之查到的⾃件名 AppiumBootstrap.jar 命令解决,将你的⾃件名改为 AppiumBootstrap.jar
6、uiautomat程序元素定位报错:
打开CMD输⾃ adb kill-server 然后输⾃ adb start-server
⾃、 Appium基础API
1、连接⾃机前置代码,缺⾃不可
from appium import webdriver
desired_caps = {}
desired_caps[‘platformName’] =‘Android’# 系统
desired_caps[‘platformVersio n’] =‘5.1’# 系统版本号
desired_caps[‘deviceName’] =‘8681-M02-0x14074b65’ # ⾃机UDID
desired_caps[‘appPackage’] =‘com.android.settings’# 应⾃包名、启动名
desired_caps[‘appActivity’] =‘.Settings’
解决中⾃不能输⾃问题
desired_caps[‘unicodeKeyboard’] = True
desired_caps[‘resetKeyboard’] = True
声明driver对象
driver = webdriver.Remote(‘http://localhost:4723/wd/hub’, desired_caps)
2、获取包名启动名
current_XXXXX
3、启动其他程序
driver.start_activity(’ com.android.mms’,’.ui.ConversationList’)
4、置于后台
backround_app (秒)
5、定位元素
⾃分为id、class、xpath
其中, element获取到的是⾃个元素,如果有相同的特征获取到的是第⾃个
其中, element获取到的是⾃个列表,如果想⾃其中的元素,需要通过下标的形式
ele = driver.find_element_by_id(‘miui:id/arrow_right’) id 定位
black_buttion = driver.find_element_by_xpath("//*[contains(@text,‘canshuID’)]") xpath含糊定位
black_buttion = driver.find_element_by_class_name(‘android.widget.ImageView’)fing_elements cla ss 定位
6、显⾃等待
ele = WebDriverWait(driver,超时时间,频率) # 每10s查找1次
导⾃⾃具包: from selenium.webdriver.support.wait import WebDriverWait
如果找到元素返回,否则会报超时错误
7、元素的操作
以下操作都是使⾃某个元素调⾃某个函数/属性(不是driver)
点击: click ()
输⾃⾃字:send_keys (’’)
清空:clear
定时时间: time.sleep(秒) 导⾃⾃具包 import time
获取元素的⾃本内容:元素.text
获取元素的属性值:元素.attr
获取元素的坐标:元素.location (元素左上⾃到屏幕右上⾃的内容)
三、 Appium的滑动和拖拽
1、获取时间戳
含义:从1970到现在过了多少秒
print (time.time ())
导⾃⾃具包: import.time
2、swipe坐标滑动
从⾃个坐标位置滑动到另⾃个坐标位置,只能是两个点之间的滑动
swipe是通过driver使⾃的
传⾃起始的位置X和Y 和结束的位置X和Y;时间参数越长滑动的越精准
s wipe(self,start_x: int,start_y: int,end_x: int,end_y: in滑动时间)
driver.swipe(100,100,100.100,3000)
3、scroll元素滑动
从⾃个元素滑动到另⾃个元素,直到页⾃静⾃
⾃法: scroll(origin_el,destination_el)
参数: origin_el:滑动开始的元素 destination_el:滑动结束的元素
代码:
el1 = driver.find_element_by_xpath("//[contains(@text,‘存储’)]")
el2 = driver.find_element_by_xpath("//[contains(@text,‘蓝⾃’)]")
driver.scroll(el1,el2)
4、drag拖拽
从⾃个元素滑动到另⾃个元素,第⾃个元素代替第⾃个元素原本屏幕上的位置
⾃法:drag_and_drop(origin_el,destination_el)
代码:
el1 = driver.find_element_by_xpath("//[contains(@text,‘存储’)]")
el2 = driver.find_element_by_xpath("//[contains(@text,‘蓝⾃’)]")
driver.drag_and_drop(el1,el2)
driver.drag_and_drop(el1,el2) #会记录原来的位置,划三次屏
driver.drag_and_drop(el1,el2)
scroll和drag的区别 drag没有惯性
相同点:都是使⾃元素进⾃传参;当swipe的时间⾃够长的时候,和drag的效果相同
四、⾃级⾃势TouchAction (导⾃模块import…)
主要针对⾃势的操作,⾃如滑动、长按、拖动等
所有⾃势都要通过perform()函数才会运⾃
1、⾃指轻敲操作
摹拟⾃指轻敲⾃下屏幕操作
⾃法: tap(element=None,x=None,y=None)
perform() # 发送命令到服务器执⾃操作
参数: 1、element:被定位到的元素
2、x:相当于元素左上⾃的坐标,通常会使⾃元素的x轴坐标
3、y:通常会使⾃元素的Y轴坐标
代码:
1、通过元素定位⾃式敲击屏幕
el = driver.find_element_by_xpath("//*[contains(@text,‘存储’)]")
TouchAction(driver).tap(el).perform()
2、通过坐标⾃式敲击屏幕
TouchAction(driver).tap(x=155, y=250).perform()
2、⾃指按下和抬起
摹拟⾃指按下屏幕和离开
⾃法:press(el=None,x=None,y=None)
release() # 结束动作,⾃指离开屏幕
参数:1、element:被定为到的元素
2、x:相当于元素左上⾃的坐标,通常会使⾃元素的x轴坐标
3、y:通常会使⾃元素的Y轴坐标
代码:
1、通过元素定位⾃式敲击屏幕
el = driver.find_element_by_xpath("//*[contains(@text,‘存储’)]")
TouchAction(driver).press(el).release().perform()
2、通过坐标⾃式按下屏幕
TouchAction(driver).press(x=155, y=250).release().perform()
3、等待时间
TouchAction(driver).press(x=155, y=250).wait().release().perform()
4、⾃指长按操作
摹拟⾃机按下屏幕⾃段时间和离开
⾃法:long_press(el=None,x=None,y=None,duration=1000)
参数:1、element:被定为到的元素
2、x:相当于元素左上⾃的坐标,通常会使⾃元素的x轴坐标
3、y:通常会使⾃元素的Y轴坐标
4、duration:持续时间,默认为1000ms
代码:
button = driver.find_element_by_xpath("//*[contains(@text,‘WLAN’)]")
button.click()
el = driver.find_element_by_id(‘android:id/title’)
TouchAction(driver).long_press(el,duration=1000).release().perform()
5、⾃指挪移操作
摹拟⾃指滑动操作
⾃法:move_to(el=None,x=155, y=250)
参数:1、element:被定为到的元素
2、x:相对于前⾃个元素的X轴偏移量
3、y:相对于前⾃个元素的Y轴偏移量
代码:
el = driver.find_element_by_xpath("//[contains(@text,‘存储’)]")
el1 = driver.find_element_by_xpath("//[contains(@text,‘更多’)]")
TouchAction(driver).press(x=240,y=600).wait(100).move_to(x=100,y=100).release().perform()
五、⾃机操作API
1、获取时间
⾃法:device_time
代码:print(driver.device_time)
2、获取⾃机的宽⾃
获取⾃机的⾃度,可以根据宽⾃做⾃些坐标操作
⾃法:get_window_size()
代码:print(driver.get_window_size())
3、发送键到设备 (可参照百度Android keycode)
摹拟系统键值的操作,⾃如操作home键,⾃量键,返回键等
⾃法:keyevent(keycode,metastatate=None):
press_keycode(keycode,metastatate=None):
参数:1、keycode:发送给设备的关键代码
2、metastatate:关于被发送的关键代码的源信息,⾃般为默认值
代码:
for i in range(3)
driver.keyevent(24) 24为+ 25为-
4、操作⾃机通知栏
打开⾃机的通知兰,可以获取通知栏的相关信息和元素操作
⾃法:open_notifications()
代码:driver.open_notifications()
5、获取⾃机当前⾃络
获取⾃机当前连接⾃络
⾃法:network_connection
代码:print(work_connection)
6、设置⾃机⾃络
更改⾃机⾃络模式,摹拟特殊⾃络情况下的测试⾃例
⾃法:set_network_connection(connectionType)
参数:1、connectionType:需要被设备成为的⾃络类型代码:
driver.set_network_connection(1)
7、⾃机截图
截取⾃机当前屏幕,保存指定格式图⾃到指定位置⾃法:get_screenshot_at_file(filename)
参数:filename:制定路径下,制定格式的图⾃
代码:
import os
driver.get_screenshot_as_file(’./XXXX.pn g’)。