UI自动化常见面试题
一:元素定位不到的场景有几种,解决方式是怎么样的?
1、有可能是元素没有加载出来,可以添加显示等待、强制等待、隐式等待
2、元素可能嵌在Iframe中,此时需要切换到元素所在的Iframe
3、元素可能在新的Windows窗口,此时需要切换Windows
4、可能存在Alert弹窗,此时需要先关闭Alert窗口
5、可能元素信息在迭代中发生了变化,此时需要更改元素定位信息
6、可能元素无法通过selenium的api完成操作,此时可以尝试下使用JavaScript去操作元素
7、元素可能在WebView控件中(该项针对的APP项目),此时需要切换context
8、特殊元素,点击元素由于父元素和子元素联动,导致子元素的点击事件被父元素消费掉,导致子元素无法被点击,此时可以尝试使用JavaScript去操作
9、特殊元素->开发自定义控件,此元素没有属性信息,无法通过常规的元素定位方法定位,此时可以尝试使用图像识别方式定位:
http://testingpai.com/article/1597824416789
10、伪元素:显示的是::before、::after这类的元素,被伪元素包裹起来的元素经常会定位不到,此时就需要对伪元素进行处理了,解决方式如:
http://testingpai.com/article/1638176966906
二:为了提高UI自动化用例执行的稳定性,你做了哪些工作:
1、查找元素优先使用显示等待
2、定位元素尽量使用相对路径的xpath表达式
3、用例进行最大限度解耦,使得每条用例可以独立执行
4、每条用例执行结束后对测试场景进行还原,避免对其他用例造成影响
5、引入失败用例截图、失败用例重试机制
三:UI自动化用例应该如何设计?
1、选取项目核心功能的用例
2、需要多次重复执行、繁琐的用例
3、需要大量手工测试执行时间的用例
四:说下quit()和close()的区别
close 是关闭driver当前聚焦的页面,而 quit 是关闭全部浏览器 tab 页面。close用于用例执行过程中关闭某一个页面的操作,而quit用于测试执行结束后关闭整个浏览器的操作
五:三种等待的区别:
1、硬等待:Thread.sleep(long millis)
特点:强制线程等待
优点:使用简单
缺点:容易造成时间浪费,建议少用
2、隐式等待:driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
特点:在设置的超时时间范围内不断查找元素,直到找到元素或者超时为止
优点:只需要设置一次,在 WebDriver 实例的整个生命周期都是生效的
缺点:只能找到元素,不能适用条件更复杂的情况,如:元素可点击、元素可见、元素的属性发生变化等。
3、显示等待:
特点:可以灵活指定等待到元素满足某个条件为止,最常用
优点:基本可以满足所有元素等待条件,使得自动化脚本更加稳定
缺点:暂无缺点
等待元素可见:
/**
* 显式等待元素可见二次封装
* @param driver 驱动对象
* @param by 元素定位信息
*/
public WebElement waitElementVisible(RemoteWebDriver driver, By by ){
WebElement webElement = null;
try {
//1、实例化WebDriverWait 超时时间10s
WebDriverWait webDriverWait = new WebDriverWait(driver,10);
//2、通过until方法等到某个条件满足时为止
webElement = webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(by));
}catch (Exception e){
logger.error("定位元素【"+by+"】异常");
}
return webElement;
}
等待元素可被点击:
/**
* 显式等待元素可被点击二次封装
* @param driver 驱动对象
* @param by 元素定位信息
*/
public WebElement waitElementClickable(RemoteWebDriver driver, By by ){
WebElement webElement =null;
try {
//1、实例化WebDriverWait 超时时间10s
WebDriverWait webDriverWait = new WebDriverWait(driver, 10);
//2、通过until方法等到某个条件满足时为止
webElement = webDriverWait.until(ExpectedConditions.elementToBeClickable(by));
}catch (Exception e){
logger.error("定位元素【"+by+"】异常");
}
return webElement;
}
六:Web自动化中存在哪三种切换
1、windows切换
/**
* 封装的通用切换窗口的方法-根据对应窗口的标题来切换
* @param title 窗口标题
*/
public void switchWindowWithTitle(String title){
Set<String> allWindowHandles = driver.getWindowHandles();
for (String windowHandle: allWindowHandles){
//根据窗口的标题来进行判断
if(title.equals(driver.getTitle())){
break;
}else {
logger.info("切换到标题为:【"+title+"】的窗口");
driver.switchTo().window(windowHandle);
}
}
}
/**
* 封装的通用切换窗口的方法-根据对应窗口的url来切换
* @param url 窗口url
*/
public void switchWindowWithURL(String url){
Set<String> allWindowHandles = driver.getWindowHandles();
for (String windowHandle: allWindowHandles){
//根据窗口的URL来进行判断
if (url.equals(driver.getCurrentUrl())){
break;
}else {
logger.info("切换到url为:【"+url+"】的窗口");
driver.switchTo().window(windowHandle);
}
}
}
2、IFrame切换
/**
* 切换到指定IFrame封装
* @param driver 驱动对象
* @param by 元素定位信息
* @param frameInfo 自定义frame信息
*/
public void switchFrame(RemoteWebDriver driver,By by,String frameInfo){
WebElement element = waitElementVisible(driver, by);
logger.info("切换IFrame:"+frameInfo);
driver.switchTo().frame(element);
}
/**
* 从IFrame中切换到默认页面封装
* @param driver 驱动对象
*/
public void switchDefaultFrame(RemoteWebDriver driver){
logger.info("切换回默认的页面");
driver.switchTo().defaultContent();
}
3、Alert窗口切换
/**
* Alert弹窗切换
* @param driver 驱动对象
*/
public void switchAlert(RemoteWebDriver driver){
logger.info("切换到alert窗口");
Alert alert = driver.switchTo().alert();
// alert.accept(); //点击确定
//alert.dismiss(); //点击取消
alert.getText(); //获取弹窗文本
}
七:你是如何设计UI自动化测试框架的。
设计理念:使用Maven构建工具管理项目,引入PO设计模式对框架进行分层(页面层、逻辑操作层、用例层、基础层),将用例层的共性部分抽取到基础层的BaseTest用例基类,将页面层的共性部分抽取到基础差的BasePage页面基类,使用dataProvider实现数据驱动,集成log4j日志框架、集成Allure报表、添加一个listener层用于引入用例失败截图重试机制,提高用例稳定性、采用并行测试的方式提高用例执行效率,最后通过GIT将代码集成到Jenkins,每天定时执行构建,执行结果通过邮件发送到项目组相关人员。
八:简述下Java进行UI自动化过程中常见的异常
1、NoSuchElementException:元素没找到异常
2、NullPointerException:空指针异常
3、ElementNotVisibleException:元素不可见异常
4、TimeoutException:超时异常
九:Selenium的工作原理是什么?
在Selenium客户端使用Java、Python等语言编写操作指令,通过WebDriver启动各个浏览器对象,并使用相应API对浏览器对象进行操作,WebDriver充当了个代理服务器的角色,然后浏览器对象将响应信息回传到WebDriver,由WebDriver再回传到我们的客户端程序。
十:Selenium使用了什么协议??
底层使用的是HTTP协议
十一:Selenium为什么不推荐使用XPATH定位元素?
因为xpath查找元素相比其他定位方式的效率要偏低一些,但是这在自动化运行效率上基本可以忽略不记,由于Xpath具备的功能非常强大,所以如果能用id唯一定位就用id唯一定位,不能的话还是使用cssSelector、xpath定位即可。
十二:如何定位属性值动态变化的元素?
1、如果属性值动态变化有特征,如:有一串字符串是固定不变的,而一些字符串随机变化,例子:id属性值为:index_XXXX,其中index_恒定不变,而XXXX随机变化,那么我们就可以拿这串固定不变的值进行定位,
定位如://*[contains(@id,'index_')]
2、如果属性值动态变化没有任何特征,那么就可以根据关系定位元素附近比较容易定位到的父节点、子节点、兄弟节点等元素帮助定位。
十三:怎么定位下拉框?
下拉框可以分为两种:select标签的下拉框与非select标签的下拉框,对于非select标签的下拉框,我们可以直接使用文本值定位,如果是select标签的下拉框,则需要借助selenium的SelectAPI定位。
SelectAPI的使用:
1、创建select对象
WebElement selector = driver.findElement(By.id("Selector")); //Selector 表示定位的元素
Select select = new Select(selector);
2、选择select的option选项,有三种方法:
select.selectByIndex(int index) //通过index
select.selectByVisibleText(String text) //通过匹配到的可见字符
select.selectByValue(String value) //通过匹配到标签里的value
十四:APP测试与WEB测试的区别
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了