20+個Selenium 網站自動化測試程式技巧彙整 –以Java 為範例

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();


				

Leave a Reply

Your email address will not be published. Required fields are marked *