当前位置: 首页 > news >正文

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 超时时间10sWebDriverWait 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 超时时间10sWebDriverWait 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

http://www.dtcms.com/a/269047.html

相关文章:

  • qt-C++笔记之QSplitter
  • PyTorch笔记3----------统计学相关函数
  • AI PPT探秘
  • ARMv7单核CPU上SWI(软件中断)验证
  • 策略与工厂的演进:打造工业级Spring路由框架
  • window显示驱动开发—X 通道解释
  • 如何远程管理Linux服务器
  • Rust 内存结构:深入解析
  • DPDK 网络驱动 之 UIO
  • 如何使用 Renode(快速入门)
  • 二进制安全-汇编语言-03-寄存器(内存访问)
  • cuda编程笔记(6)--流
  • PowerQuery逆透视之二维表转一维表
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ContentPlaceholder(背景占位)
  • 电动汽车的传导发射仿真
  • navicate如何设置数据库引擎
  • RabbitMQ在SpringBoot中的使用详解
  • 2025光学成像与机器视觉国际会议 (OIMV 2025)
  • 用Python制作华夫图:从零开始
  • ShortGPT: Layers in Large Language Models are More Redundant Than You Expect
  • delphi,c++程序 阻止Win11 用户更改系统时间
  • 电子防抖(EIS)技术概述
  • Springboot 如何加密数据库连接相关配置信息
  • 特伦斯T1节拍器,突出综合优势与用户体验
  • AI建站工具对决:Wegic、腾讯云、Hocoos、Typedream深度测评,谁是国内用户的首选?
  • MySQL Galera Cluster企业级部署
  • 【Python】VSCode:解决模块导入与调试
  • 【音视频】HLS简介与服务器搭建
  • 【LLIE专题】通过预训练模型先验提升暗光增强模型复原效果
  • 安卓10.0系统修改定制化____如何修改固件 去除开机向导 实现开机直接进入桌面