一:元素定位不到的場景有幾種,解決方式是怎么樣的?
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測試的區別