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測試的區別

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM