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测试的区别

 

posted @ 2021-12-30 10:40  筱筱创  阅读(3950)  评论(0编辑  收藏  举报