20+個Selenium 網站自動化測試程式技巧彙整 –以Java 為範例
這篇文章主要說明Selenium在處理網站自動化測試的一些小技巧。主要以 Java 為程式範例說明。
啟動瀏覽器
啟動瀏覽器通常是Selenium網站測試的第一步。可以參考如下,啟動不同的瀏覽器型態。
- WebDriver driver = new FirefoxDriver();
- WebDriver driver = new ChromeDriver();
- WebDriver driver = new SafariDriver();
- WebDriver driver = new InternetExplorerDriver();
- WebDriver driver = new AndroidDriver();
- WebDriver driver = new IPhoneDriver();
- WebDriver driver = new HtmlUnitDriver();
網頁元件是否存在
如果要檢查網頁元件是否存在,可以用下列方法。
- driver.findElements(By.id(“element-id”)).size()!=0
更新網頁 F5
更新網頁,模擬使用者按下瀏覽器的 F5。
- driver.navigate().refresh();
瀏覽歷史網頁
瀏覽器上有往前與往後的按鈕可以幫助瀏覽歷史網頁資訊。
- driver.navigate().back();
- driver.navigate().forward();
等待特定網頁元件狀態
- WebDriverWait wait = new WebDriverWait(driver, 30);
- WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id(“id123”)));
其他幾個比較常用的元件狀態還列舉如下
- wait.until(ExpectedConditions.visibilityOfElementLocated(locator));
- wait.until(ExpectedConditions.presenceOfElementLocated(locator));
- wait.until(ExpectedConditions.elementToBeClickable(locator));
文字輸入
文字輸入的部分,可以先用 clear將目前的文字清除,再送出要輸入的文字 sendKeys
- WebElement element = driver.findElement(By.id(“element-id”));
- element.clear();
- element.sendKeys(“Input the Text Value here”);
Mouse MoveOver
有些選單的出現會在滑鼠移動到該選單上方之後才會出現,
特別是在 menu的部分或是 tooltip的說明,針對這樣的選單要進行操作,就必須要模擬滑鼠的 MoveOver的動作
- Actions actions = new Actions(driver);
- WebElement menuElement = driver.findElement(By.id(“menu-element-id”));
- actions.moveToElement(menuElement).moveToElement(driver.findElement(By.xpath(“xpath-of-menu-item-element”))).click();
取得網頁元件 CSS屬性
有些情況我們需要取得網頁元件特定屬性,這個例子取得 CSS的背景顏色
- String bgcolor = driver.findElement(By.id(“Locator_id”)).getCssValue(“background-color”);
- String textColor = driver.findElement(By.id(“Locator_id”)).getCssValue(“color”);
找到網頁所有的連結
當我們希望可以找到所有網頁的連結時,可以用這個小技巧。
因為網頁連結都會在 HTML中以 <a …開頭,所以只要用 tagName(“a”)就可以取得網頁所有的連結。
- List link = driver.findElements(By.tagName(“a”));
擷取螢幕畫面
擷取螢幕畫面有助於幫助我們了解自動化測試的當時發生什麼事情。
File scrFile = ((TakesScreenshot)myTestDriver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile,
new
File(
"c:\\screenShot_Taken.jpg"
));
執行特定 JavaScript
當無法透過 Selenium WebDriver 對網頁元件進行操作的情況下,我們就可以使用 JavascriptExecutor 。
這種情況特別是在處理 HTML5的元件時,上傳檔案或是網頁 scroll down等情況。
- JavascriptExecutor jsx = (JavascriptExecutor) driver;
- jsx.executeScript(“alert(‘hi’)”);
或是例如上傳檔案也可以利用這樣處理
- String filePath = “path\\to\\file\for\\upload”;
- JavascriptExecutor jsx = (JavascriptExecutor) driver;
- jsx.executeScript(“document.getElementById(‘fileName’).value='” + filePath + “‘;”);
網頁 Scroll up/down
- JavascriptExecutor jsx = (JavascriptExecutor) driver;
- //Vertical scroll – down by 50 pixels
- jsx.executeScript(“window.scrollBy(0,50 )”, “”);
- //Vertical scroll – up by 10 pixels (note the number is minus 55)
- jsx.executeScript(“window.scrollBy(0,-10)”, “”);
- //Horizontal scroll – right by 30 pixels
- jsx.executeScript(“window.scrollBy(30,0)”, “”);
- //Horizontal scroll – left by 45 pixels (note the number is minus 95)
- jsx.executeScript(“window.scrollBy(-45,0)”, “”);
Get HTML Source Of A Element On Page
取得 HTML 的原始碼。也可以利用 JavascriptExecutor來達成
- JavascriptExecutor jsx = (JavascriptExecutor) driver;
- String elementId = “element-id”;
- String html =(String) jsx.executeScript(“return document.getElementById(‘” + elementId + “‘).innerHTML;”);
Frames間的切換
如果網頁中有許多的 iframe,就必須要切換到正確的 iframe才可以對網頁進行操作。
- WebElement frameElement = driver.findElement(By.id(“id-of-frame”));
- driver.switchTo().frame(frameElement);
網頁元件的定位
找到網頁元件有幾個方式,ID, name, tag, Xpath, CSS or Text等
- Using ID
WebElement welement = driver.findElement(By.id("Id from webpage"));
- Using Name
WebElement welement = driver.findElement(By.name("Name of WebElement"));
- Using Tag Name
WebElement welement = driver.findElement(By.tagName("tag name"));
- Using Xpath
WebElement welement = driver.findElement(By.xpath("xpath of webElement"));
- Using CSS
WebElement welement = driver.findElement(By.CSS("CSS locator path"));
- Using LinkText
WebElement welement = driver.findElement(By.LinkText("LinkText"));
Pop-up/alert 訊息的處理
[pastacode lang=”java” message=”” highlight=”” provider=”manual”]
public static String getPopupMessage(final WebDriver driver) {
String message = null;
try {
Alert alert = driver.switchTo().alert();
message = alert.getText();
alert.accept();
} catch (Exception e) {
message = null;
}
System.out.println("message"+message);
return message;
}
[/pastacode]
alert 視窗有 Ok 與 cancel。那麼要怎樣點選 cancel呢?
- Alert alert = driver.switchTo().alert();
- message = alert.getText();
- alert.dismiss();
如何讀取 ToolTip 的文字?
public static String tooltipText(WebDriver driver, By locator){
String tooltip = driver.findElement(locator).getAttribute("title");
return tooltip;
}
DropDown menu的選擇
public static void selectDropdown(WebDriver driver, By locator, String value){
new Select (driver.findElement(locator)).selectByVisibleText(value); }
從輸入過的文字選項選擇
public static void selectSearchDropdown(WebDriver driver, By locator, String value){
driver.findElement(locator).click();
driver.findElement(locator).sendKeys(value);
driver.findElement(locator).sendKeys(Keys.TAB);
}
檔案下載
檔案下載可以透過網案下載的網址,直接下載該檔案
[pastacode lang=”java” message=”” highlight=”” provider=”manual”]
public static void downloadFile(String href, String fileName) throws Exception{
URL url = null;
URLConnection con = null;
int i;
url = new URL(href);
con = url.openConnection();
// Here we are specifying the location where we really want to save the file.
File file = new File(".//OutputData//" + fileName);
BufferedInputStream bis = new BufferedInputStream(con.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file));
while ((i = bis.read()) != -1) {
bos.write(i);
}
bos.flush();
bis.close();
}
[/pastacode]
等待
針對網頁載入的時間不一致的狀況下,Selenium可以有三種等待的方式
Implicit wait
driver.manage.timeouts().implicitlyWait(10,TimeUnit.SECONDS);
Explicit Wait
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(ExpectedConditons.elementToBeClickable(By.id/xpath/name("locator"));
Sleep
Thread.sleep(time in milisecond)
清除 Cookie
為了重設測試環境,例如將之前登入的歷史紀錄與瀏覽過網頁所有相關的資訊,就可以進行Cookie清除。
driver.manage().deleteAllCookies();
模擬鍵盤複合建的動作
Actions builder = new Actions(driver);
builder.keyDown(Keys.CONTROL).click(someElement).click(someOtherElement).keyUp(Keys.CONTROL).build().perform();
Drag and Drop
如果要將網頁元件從 source 移動到 target,範例如下:
WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));
(new Actions(driver)).dragAndDrop(element, target).perform();