17個網站自動化實務常問到的問題
這篇文章主要整理筆者實務上、學員上課、專案輔導應用上常被問到的問題。這裡做一些會整與摘要說明。
1.什麼是 WebDriver
簡單來說,Selenium WebDriver 就是程式語言與瀏覽器溝通的翻譯師
程式語言可以使用 (Java, Python, C# or Ruby) 就可以與瀏覽器 (IE, Chrome, FireFox, Opera, Safari)等溝通。達到操作與自動化測試網站的目的。
2.什麼是 Locators?
Locators主要是 Selenium用來定位網頁元件的位置。selenium不是靠座標來知道網頁元件的位子。
所以 Selenium主要靠的就是 locators。例如Id,name,xpath,dom,css,class,tagname。Java範例程式如下:
driver.findElement(By.id(“HTMLid”));
driver.findElement(By.name(“HTMLname”));
driver.findElement(By.cssSelector(“cssLocator”));
driver.findElement(By.xpath(“XPathLocator));
3. Ajax動態網頁
筆者經常被問到的是,如何處理動態網頁元件,例如用 Ajax開發。
什麼是 Ajax的網頁呢? 簡單來說網頁不需要 reload就可以變化網頁上的一些狀態。
例如:Facebook 上就有很多網頁是 Ajax。網頁不需要 reload,根據網頁輸入的資料,網頁就相對應的顯示。
對於這樣動態頁面的呈現,Selenium處理上主要透過兩種”等待”
Implicit wait : (這種方式又稱為預設等待時間)
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
Explicit wait: WebDriverWait, FluentWait (這種方式是特定等待某個元件出現,原則上比較建議這種方法。)
WebElement strr = (new WebDriverWait(driver,10)).until(ExpectedConditions.presenceOfElementLocated(By.xpath(“//*[@id=’name’]”)));
4.多個視窗如何處理?
開啟的視窗無論是 New Window 或是新 New Tab,都可以利用 Selenium處理
String window1 = driver.getWindowHandle();
driver.switchTo().window(Window1);
5.如何處理 Alert?
// 切換到該 alert
Alert alert = driver.switchTo().alert();
// 取得 alert上的文字
alert.getText();
// 按下 Alert 的ok
alert.accept();
6.如何擷取畫面並存檔?
這個很常用的原因是因為,我們希望自動化測試過程中,將當下自動化測試操作步驟的畫面存檔
之後,如果測試結果有問題,我們可以用這些存檔的畫面了解測試過程中所發生的問題。
File srcImg = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcImg,new File(“d:\\screenShot.jpeg”));
7.Selenium Web Driver 有沒有什麼限制?
- 不支援 windows Application。例如:小算盤、小作家等。
- 沒有內建的測試報告。通常透過其他的unitTest測試架構,例如Java的 TestNG
- 新版的瀏覽器,通常也需要相對應的 WebDriver的更新。因此,會有一些時間上的落差。
8.HTMLUnitDriver 是什麼瀏覽器?
這個 其實不是瀏覽器,這是 Selenium內建的一種模擬瀏覽器的”思考”引擎。
怎麼說呢? HTMLUnitDriver不會真的執行或是啟動瀏覽器,而是 Selenium模擬的執行方式。
優點是:因為是Selenium”思考”的執行方式,不需要啟動瀏覽器執行,所以執行速度非常快。
缺點是:因為這個瀏覽器執行引擎跟真實瀏覽器還是有差異,這樣的執行方式不代表真實瀏覽器執行結果。僅供參考。
9.如何模擬鍵盤輸入?
使用 sendKeys
例如:
element.sendKeys(” This is ENTER “, Keys.ENTER);
element.sendKeys(“This is Testing Data”);
10.如何選起下拉式選單中的一個值?
Select selectElement = new Select(driver.findElement(By.xpath(“Selector”)));
selectElement.selectByVisibleText(“selection value1”);
11.如何處理 frames的網頁?
為什麼要特別注意 frames的網頁呢? 對於人來說,我們都常會直接點選網頁,而不用特別注意該網頁是否為 iframe所組成。
但是對於 Selenium來說,必須先將網頁上所有的iFrame做適當的定位,才能夠進一步選取到 iframe中的網頁元件。
driver.switchTo().frame(“frameName”);
如何對瀏覽器的瀏覽歷史操作前一頁或後一頁
driver.navigate().forward();
driver.navigate().back();
driver.navigate().refresh();
12.瀏覽器的執行速度為何?
HTMLUnitDriver因為是 Selenium模擬的所以最快。
FireFox 與 Chrome執行速度在伯仲之間。通常網頁元件的定位介於 1-2秒間。
IE 是最最慢的。網頁元件定位有可能高達 5-10秒。
因此,執行上建議以 FireFox與 Chrome優先考量。
之後再針對 IE 特別的地方做驗證測試。
13.如果我的網站剛好只支援IE 怎麼辦?
筆者會建議還是用 fireFox 修改 userAgent的方式做自動化測試。
另一方面,可以跟網頁開發團隊討論哪些特別的功能導至只有 IE支援,其他FireFox瀏覽器不支援。
接著,再針對這些功能用IE測試。
FireFox 修改 userAgent的方式,Java 範例乘式如下:
FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference(“general.useragent.override”, “User Agent String“);
WebDriver driver = new FirefoxDriver(profile);
14.如何處理 SSL certificates 的問題?
筆者建議,環境設定相關問題,如果可以的話在自動化測試程式開始前就先處理好。
如果透過 selenium 的話,可以透過設定瀏覽器的 profile來解決。
15.Drag and Drop 的動作要如何處理?
這種複合性的動作,可以透過Selenium Actions 來處理。
[pastacode lang=”java” message=”” highlight=”” provider=”manual”]
Actions builder = new Actions(driver);
Action dragAndDrop = builder.clickAndHold(element)
.moveToElement(otherElement)
.release(otherElement)
.build();
dragAndDrop.perform();
[/pastacode]
16.Selenium可以提供哪些滑鼠的操作動作?
- click(WebElement element) – Clicks an element
- doubleClick(WebElement element) – Double-clicks an element.
- void mouseDown(WebElement element) – Holds down the left mouse button on an element.
- mouseUp(WebElement element) – Releases the mouse button on an element.
- mouseMove(WebElement element) – Moves element form current location to another element.
- contextClick(WebElement element) – Performs a context-click (right click) on an element.
17.什麼是 GRID?
GRID 是Selenium 分散式測試架構。這個架構讓你的測試程式可以佈署到多台機器執行。
- Hub: 主要負責分配佈署測試程式到哪一台測試機器執行 (Node)
- Node:負責執行selenium測試程式
如何啟動Selenium hub?
java -jar selenium-server-standalone-.jar -role hub –port 4444
如何啟動Node
java -jar selenium-server-standalone-2.42.2.jar -role node -hub http://<Hub IP>:4444/grid/register -browser browserName=firefox -port 5555
- 4444 (遠端Hub的 port = 4444,預設為 4444)
- browserName = firefox 設定 這台 Node 機器為執行 FireFox
- Port = 5555 (Node這台機器用 port 5555 與遠端 hub port 4444溝通)