1、如何去定位屬性動态變化的元素?
屬性動态變化是指該element沒有固定的屬性值,是以隻能通過相對位置定位 。比如通過xpath的軸, parent/following-sibling/precent-sibling等 另外也可以嘗試findbyelements周遊
2、有幾種元素常用定位方式,分别是?你最偏愛哪一種,為什麼?
8種:id、name、class name、tag name、link text、partial link text、xpath、css selector
偏愛哪一種?
答:我最常用的是xpath(或CssSelector)因為很多情況下,html标簽的屬性不夠規範,無法通過單一的屬性定位,這個時候就隻能使用xpath可以去重實作定位唯一element事實上定位最快的是Id,
因為id是唯一的,然而大多數開發并沒有設定id。
3、怎麼提高selenium腳本的自動化執行效率?
1、優化測試用例,盡可不使用 sleep,減少使用ImplicitlyWai。
2、多使用selenium的WebDriverWait/FluentWait,這樣可以優化等待時間。
3、減少不必要的操作步驟,如經過三四步才能打開我們要測試的頁面的話,我們就可以直接通過網址來打開,減少不必要的操作。
4、中斷頁面加載,如果頁面加載的内容過多,我們可以檢視一下加載慢的原因,如果加載的内容不影響我們測試,就設定逾時時間,中斷頁面加載。
5、使用性能好的電腦
4、用例在運作過程中經常會出現不穩定的情況,也就是這次可以通過,下次無法通過了,如何提高用例的穩定性?
1、查找元素前先做判斷:ExpectedConditions裡面的各種方法;
2、顯式等待:多使用WebDriverWait,加上顯式等待時間,等要操作的元素出現之後再執行下面的操作;
3、多用try catch捕獲異常;
4、多線程的時候,減少測試用例耦合度,因為多線程的執行順序是不受控制的;
5、盡量使用測試專用環境,避免其他類型的測試同時進行,對資料造成幹擾。
5、什麼PO模式?
PO模式是page object model的縮寫,顧名思義, 是一種設計模式,把每個頁面當成一個頁面對象,頁面層寫定位元素方法和頁面操作方法,實作腳本的page和真實的網站頁面Map起來,一一對應起來。這樣能測試架構更容易維護。 比如一個登陸頁面,使用PO模式後,會建立一個class,該class會定義使用者名輸入框,密碼輸入框,登陸按鈕的webElenent;用例層從頁面層調用操作方法,寫成用例,這種模式可以做到定位元素與腳本分離。是以這樣的設計理念就是PO模式。
6、如何設計高品質自動化腳本
1、 使用四層結構實作業務邏輯、腳本、資料分離。
2、 使用PO設計模式,将一個頁面用到的元素和操作步驟封裝在一個頁面類中。如果一個元素定位發生了改變,我們隻用修改這個頁面的元素屬性。
3、對于頁面類的方法,我們盡量從客戶的正向邏輯去分析,方法中是一個獨立場景,例如:登入到退出,而且不要想着把所有的步驟都封裝在一個方法中。
4、 測試用例設計中,減少測試用例之間的耦合度。
7、什麼是斷言?
斷言的英文是assertion,斷言檢查的英文是assertion checking。
-斷言是指定一個程式必須已經存在的狀态的一個邏輯表達式,或者一組程式變量在程式執行期間的某個點上必須滿足的條件。
8、自動化測試用例從哪裡來?
手工用例中抽取,可以參考自動化用例的執行政策
9、怎樣選擇下拉菜單的元素
下拉菜單分兩種,一種是直接使用select标簽的,這種情況可以直接使用selenium API WebElement selector = driver.findElement(By.id("Selector"));
Select select = new Select(selector);
選擇select的option有以下三種方法selectByIndex(int index) 通過index<br>selectByVisibleText(String text) 通過比對到的可見字元<br>selectByValue(String value) 通過比對到标簽裡的value
10、報NoSuchElementException的原因可能是什麼?
(1)定位iframe中的元素,需switch_to_iframe
(2)頁面還沒有加載出來就對頁面的元素進行操作,可設定固定休眠時間、implicity_wait()是webDriver提供的逾時等待,隐的等待一個元素被發現或者一個指令完成、WebDriverWait()
(3)動态屬性無法定位,可根據相對路徑或者部分元素屬性定位。
(4)二次定位(5)有兩個屬性相同的元素,但是其中一個不可見,找到符合這個屬性且style屬性中display=none的元素
(6)xpath描述錯誤
11、Selenium WebDriver –建議使用Webdriver捕獲螢幕快照的方法是什麼?
import win32com.client
shell=win32com.client.Dispatch("WScrip.Shell")
12、如何處理alert彈窗?
我們常見的alert彈窗有兩種:基于windows彈窗和基于web頁面彈窗
我們知道,webdriver是能夠處理alert彈窗的,Selenium提供了Alert這個接口。相關操作代碼如下:
// 切換到Alert
Alert alert = driver.switchTo().alert();
// 點選彈窗上确定按鈕
alert.accept();
// 點選彈窗的取消按鈕
alert.dismiss()
// 擷取彈窗上線上的文本文字内容
alert.getText();
// 有些彈窗還支援文本輸入,這個可以把要輸入字元通過sendkeys方法輸入
alert.sendkeys();
13、XPath中使用單斜杠和雙斜杠有什麼差別?
如果XPath是從文檔節點開始,它将允許建立“絕對”路徑表達式。
例如 “/ html / body / p”比對所有的段落元素。如果XPath在文檔中的任意位置開始進行選擇比對,那麼它将允許建立“相對”路徑表達式。例如 “// p”比對所有的段落元素。
14、當有很多定位器時,如ID、名稱、XPath、CSS定位器,我應該使用哪一個?
如果有唯一的名稱或辨別符可用,那麼應該使用它們來代替XPath和CSS定位器。如果沒有,那麼CSS定位器應該被優先考慮,因為在大多數現代浏覽器中,它們的評估速度比XPath更快。
15、舉例一下你遇到過那些異常,在selenium自動化測試過程中
1. ElementNotSelectableException :元素不能選擇異常
2. ElementNotVisibleException :元素不可見異常
3. NoSuchAttributeException :沒有這樣屬性異常
4. NoSuchElementException:沒有該元素異常
5. NoSuchFrameException :沒有該frame異常
6. TimeoutException : 逾時異常
7. Element not visible at this point :在目前點元素不可見
16、findElement 和 FindElements有什麼差別?
首先,兩個都是查找元素,都支援八大元素定位方法。findElement()得到的隻有一個元素,如果根據提供的元素定位方式找不到,會報noSuchElement異常
findElements()傳回的是一組元素,是以我們需要根據能夠找到一組元素的表達式去定位,傳回一組元素我們可以放在集合裡,這樣我們就可以使用集合裡面的疊代方法去周遊元素,拿到元素去做其他操作。
17、如何擷取頁面标題,懸浮文本和錯誤文本,并驗證?
标題,我們可以通過driver.getTitle()方法來得到一個字元串,然後使用字元串的containts方法或者equals方法去進行斷言。
懸浮文本(tooltip),一般是利用Actions類,然後滑鼠懸停方法,然後通過getText()方法來得到這個tooltip字元串。
錯誤資訊,直接把這個錯誤字段先進行定位,然後通過getText()方法拿到錯誤文本,主要的斷言有包含,相等,不相等,不包含,以什麼開頭等。
18、在硒中處理多個彈出視窗的機制是什麼?
可以使用指令getWindowHandles()來處理多個彈出視窗。
然後将所有視窗名稱存儲到Set變量中并将其轉換為數組。
接下來,通過使用數組索引,導航到特定的視窗。driver.switchTo.window(ArrayIndex);
19、 隐式等待與顯式等待有什麼不同?
隐式等待是設定的全局等待,
分為1、頁面加載逾時等待 ;2、頁面元素加載逾時;3、異步腳本逾時。
如果是頁面元素逾時,設定等待時間,是對頁面中的所有元素設定加載時間。
隐式等待是其實可以了解成在規定的時間範圍内,浏覽器在不停的重新整理頁面,直到找到相關元素或者時間結束。
顯式等待隻是用于特定搜尋的一個計時器。它的可擴充性更強,你可以設定它來等待任何條件。
通常情況下,可以使用一些預先建構的條件來等待元素變得可點選,可見,不可見等,或者隻是編寫适合需求的條件。
20、關閉浏覽器中quit和close的差別
兩個都可以實作退出浏覽器session功能,close是關閉你目前聚焦的tab頁面,而quit是關閉全部浏覽器tab頁面,并退出浏覽器session。
21、 你寫的測試腳本能在不同浏覽器上運作嗎,支援跨浏覽器平台嗎?
主要實作這個跨浏覽器的思想就是,把浏覽器類型寫到配置檔案,代碼裡寫if語句去判斷配置檔案的浏覽器的類型,來決定用什麼浏覽器去執行測試用例
22、 一個元素明明定位到了,點選無效(也沒報錯),如果解決?
使用js點選,selenium有時候點選元素是會失效,js = 'document.getElementById("baidu").click()'<br>driver.execute_script(js)
23、 你覺得自動化測試最大的缺陷是什麼?
不穩定,可靠性,不易維護,成本與收益
24、點選登入按鈕的替代方法是什麼?
使用submit()方法,但隻有在屬性type = submit時才能使用它。
25、你如何獲得目前頁面的URL?
driver.driver.current_url
26、 如何從文本框中擷取打字文本?
通過将arg作為值傳遞來使用getAttribute(“value”)方法。
27、selenium中如何保證操作元素的成功率?
添加元素智能等待時間 driver.implicitly_wait(30)
- try 方式進行 id,name,clas,x path, css selector 不同方式進行定位,如果第一種失敗可以自動嘗試第二種Selenium保證元素成功率是通過元素的定位,
當然它的定位方法很多,一定能有合适的。但是在自動化工程的實施過程中,高品質的自動化測試不是隻有測試人員保證的。
需要開發人員規範開發習慣,如給頁面元素加上唯一的name,id等,這樣就能大大地提高元素定位的準确性。
當然如果開發人員開發不規範,我們在定位元素的時候盡量使用相對位址定位,這樣能減少元素定位受頁面變化的影響。
隻要我們元素定位準确,就能保證我的每一個操作符合我的預期
28、如何提高selenium腳本的執行速度?
如網速,操作步驟的繁瑣程度,頁面加載的速度,以及我們在腳本中設定的等待時間,運作腳本的線程數等。
是以不能單方面追求運作速度的,要確定穩定性,能穩定地實作回歸測試才是關鍵。
我們可以從以下幾個方面來提高速度:一,減少操作步驟,如經過三四步才能打開我們要測試的頁面的話,我們就可以直接通過網址來打開,減少不必要的操作。
二,中斷頁面加載,如果頁面加載的内容過多,我們可以檢視一下加載慢的原因,如果加載的内容不影響我們測試,就設定逾時時間,中斷頁面加載。
三,在設定等待時間的時候,可以sleep固定的時間,也可以檢測某個元素出現後中斷等待也可以提高速度。
四,配置testNG實作多線程。在編寫測試用例的時候,一定要實作松耦合,然後在伺服器允許的情況下,盡量設定多線程運作,提高執行速度。
29、什麼是持續內建?
持續內建源于極限程式設計(XP),是一種軟體實踐,軟體開發過程中內建步驟是一個漫長并且無法預測的過程。
內建過程中可能會爆發大量的問題,是以內建過程需要盡可能小而多,實際上持續內建講的是不斷的去做軟體的內建工作。
持續內建,最簡單的形式是包括一個監控版本控制(SVN等等)變化的工具。當變化被發覺時,這個工具可以自動的編譯并測試你的應用
30、 Selenium是否支援桌面應用軟體的自動化測試。
Selenium不支援桌面軟體的自動化測試,Selenium是根據網頁元素的屬性才定位元素,而其他桌面軟體自動化測試工具是根據桌面元素的位置來定位元素,當然現在也有根據桌面元素的屬性來定位的。
31、 BDD是什麼?你了解多少?TDD是什麼?
BDD:行為驅動開發(Behavior Driven Development)
TDD:測試驅動開發(Test-Driven Development)
32、selenium是否可以直接讀取Excel表中測試用例,來執行相關測試
可以的,需要借助第三方庫
33、Selenium有哪些元件?
最早的有Selenium IDE,IDE隻支援安裝在fiefox上一個插件,支援錄制自動化腳本。還有remote RC,和Grid 和webdriver。我們一般最重要的就是使用webdriver。