1. 程式人生 > >selenium 學習-js執行,事件模擬,頁面載入等待

selenium 學習-js執行,事件模擬,頁面載入等待

概念

在使用 Selenium WebDriver 做自動化測試的時候,會經常模擬滑鼠和鍵盤的一些行為。比如使用滑鼠單擊、雙擊、右擊、拖拽等動作;或者鍵盤輸入、快捷鍵使用、組合鍵使用等模擬鍵盤的操作。在 WebDeriver 中,有一個專門的類來負責實現這些測試場景,那就是 Actions 類,在使用該類的過程中會配合使用到 Keys 列舉以及 Mouse、 Keyboard、CompositeAction 等類。

其次,在實際測試過程中,可能會遇到某些按鍵沒辦法使用 Actions、Keys 等類來實現的情況。 比如通過使用 Alt+PrtSc 組合鍵來實現擷取螢幕當前活動視窗的影象,在 Keys 列舉中,因為沒有枚舉出 PrtSc 鍵,所以沒辦法通過 Action 的 KeyDown(Keys) 來模擬按下這個動作。

再次是在自動化測試中,可能會遇到一些附件、檔案上傳的場景,或者是多檔案上傳,這些在 Selenium2.0 之後,可以直接使用 WebElement 類的 sendKeys() 方法來實現。

下面就分別介紹這些情況的具體使用。

回頁首

滑鼠點選操作

滑鼠點選事件有以下幾種型別:

清單 1. 滑鼠左鍵點選
 Actions action = new Actions(driver);action.click();// 滑鼠左鍵在當前停留的位置做單擊操作 
action.click(driver.findElement(By.name(element)))// 滑鼠左鍵點選指定的元素
清單 2. 滑鼠右鍵點選
 Actions action = new Actions(driver); 
 action.contextClick();// 滑鼠右鍵在當前停留的位置做單擊操作 
action.contextClick(driver.findElement(By.name(element)))// 滑鼠右鍵點選指定的元素
清單 3. 滑鼠雙擊操作
 Actions action = new Actions(driver); 
 action.doubleClick();// 滑鼠在當前停留的位置做雙擊操作 
action.doubleClick(driver.findElement(By.name(element)))// 滑鼠雙擊指定的元素
清單 4. 滑鼠拖拽動作
 Actions action = new Actions(driver); 
// 滑鼠拖拽動作,將 source 元素拖放到 target 元素的位置。
 action.dragAndDrop(source,target);
// 滑鼠拖拽動作,將 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 為橫座標,yOffset 為縱座標。
action.dragAndDrop(source,xOffset,yOffset);

在這個拖拽的過程中,已經使用到了滑鼠的組合動作,首先是滑鼠點選並按住 (click-and-hold) source 元素,然後執行滑鼠移動動作 (mouse move),移動到 target 元素位置或者是 (xOffset, yOffset) 位置,再執行滑鼠的釋放動作 (mouse release)。所以上面的方法也可以拆分成以下的幾個執行動作來完成:

action.clickAndHold(source).moveToElement(target).perform(); 
 action.release();
清單 5. 滑鼠懸停操作
 Actions action = new Actions(driver); 
 action.clickAndHold();// 滑鼠懸停在當前位置,既點選並且不釋放
 action.clickAndHold(onElement);// 滑鼠懸停在 onElement 元素的位置

action.clickAndHold(onElement) 這個方法實際上是執行了兩個動作,首先是滑鼠移動到元素 onElement,然後再 clickAndHold, 所以這個方法也可以寫成 action.moveToElement(onElement).clickAndHold()。

清單 6. 滑鼠移動操作
 Actions action = new Actions(driver); 
 action.moveToElement(toElement);// 將滑鼠移到 toElement 元素中點
// 將滑鼠移到元素 toElement 的 (xOffset, yOffset) 位置,
//這裡的 (xOffset, yOffset) 是以元素 toElement 的左上角為 (0,0) 開始的 (x, y) 座標軸。
 action.moveToElement(toElement,xOffset,yOffset)
// 以滑鼠當前位置或者 (0,0) 為中心開始移動到 (xOffset, yOffset) 座標軸
 action.moveByOffset(xOffset,yOffset);

action.moveByOffset(xOffset,yOffset) 這裡需要注意,如果 xOffset 為負數,表示橫座標向左移動,yOffset 為負數表示縱座標向上移動。而且如果這兩個值大於當前螢幕的大小,滑鼠只能移到螢幕最邊界的位置同時丟擲 MoveTargetOutOfBoundsExecption 的異常。

滑鼠移動操作在測試環境中比較常用到的場景是需要獲取某元素的 flyover/tips,實際應用中很多 flyover 只有當滑鼠移動到這個元素之後才出現,所以這個時候通過執行 moveToElement(toElement) 操作,就能達到預期的效果。但是根據我個人的經驗,這個方法對於某些特定產品的圖示,影象之類的 flyover/tips 也不起作用,雖然在手動操作的時候移動滑鼠到這些圖示上面可以出現 flyover, 但是當使用 WebDriver 來模擬這一移動操作時,雖然方法成功執行了,但是 flyover 卻出不來。所以在實際應用中,還需要對具體的產品頁面做相應的處理。

清單 7. 滑鼠釋放操
 Actions action = new Actions(driver); 
 action.release();// 釋放滑鼠

回頁首

鍵盤模擬操作

對於鍵盤的模擬操作,Actions 類中有提供 keyUp(theKey)、keyDown(theKey)、sendKeys(keysToSend) 等方法來實現。鍵盤的操作有普通鍵盤和修飾鍵盤(Modifier Keys, 下面的章節將講到修飾鍵的概念)兩種 :

1. 對於普通鍵盤,使用 sendKeys(keysToSend) 就可以實現,比如按鍵 TAB、Backspace 等。

清單 8. 普通鍵盤模擬 sendKeys(keysToSend)
 Actions action = new Actions(driver); 
 action.sendKeys(Keys.TAB);// 模擬按下並釋放 TAB 鍵
 action.sendKeys(Keys.SPACE);// 模擬按下並釋放空格鍵
/***
針對某個元素髮出某個鍵盤的按鍵操作,或者是輸入操作,
比如在 input 框中輸入某個字元也可以使用這個方法。這個方法也可以拆分成:
action.click(element).sendKeys(keysToSend)。
*/
 action.sendKeys(element,keysToSend);

注意除了 Actions 類有 sendKeys(keysToSend)方法外,WebElement 類也有一個 sendKeys(keysToSend)方法,這兩個方法對於一般的輸入操作基本上相同,不同點在於以下幾點:

  • Actions 中的 sendKeys(keysToSend) 對於修飾鍵 (Modifier Keys) 的呼叫並不會釋放,也就是說當呼叫 actions.sendKeys(Keys.ALT); actions.sendKeys(Keys.CONTROL); action.sendKeys(Keys.SHIFT); 的時候,相當於呼叫 actions.keyDown(keysToSend),而如果在現實的應用中想要模擬按下並且釋放這些修飾鍵,應該再呼叫 action.sendKeys(keys.NULL) 來完成這個動作。
  • 其次就是當 Actions 的 sendKeys(keysToSend) 執行完之後,焦點就不在當前元素了。所以我們可以使用 sendKeys(Keys.TAB) 來切換元素的焦點,從而達到選擇元素的作用,這個最常用到的場景就是在使用者名稱和密碼的輸入過程中。
  • 第三點,在 WebDriver 中,我們可以使用 WebElement 類的 sendKeys(keysToSend) 來上傳附件,比如 element.sendKeys(“C:\\test\\uploadfile\\test.jpg”); 這個操作將 test.jpg 上傳到伺服器,但是使用:
Actions action = New Actions(driver); 
 action.sendKeys(element,“C:\\test\\upload\\test.jpg”); 
action.click(element).sendKeys(“C:\\test\\upload\\test.jpg”);

這種方式是上傳不成功的,雖然 WebDriver 在執行這條語句的時候不會出錯,但是實際上並沒有將檔案上傳。所以要上傳檔案,還是應該使用前面一種方式。

2.對於修飾鍵(Modifier keys),一般都是跟普通鍵組合使用的。比如 Ctrl+a、Alt+F4、 Shift+Ctrl+F 等等。

  • 這裡先解釋一下修飾鍵的概念,修飾鍵是鍵盤上的一個或者一組特別的鍵,當它與一般按鍵同時使用的時候,用來臨時改變一般鍵盤的普通行為。對於單獨按下修飾鍵本身一般不會觸發任何鍵盤事件。在個人計算機上的鍵盤上,有以下幾個修飾鍵:Shift、Ctrl、Alt(Option)、AltGr、Windows logo、Command、FN(Function)。但是在 WebDriver 中,一般的修飾鍵指前面三個。你可以點選下面的 Wiki 連結去了解更多有關修飾鍵的資訊,Modifier key
  • 回到上面的話題,在 WebDriver 中對於修飾鍵的使用需要用到 KeyDown(theKey)、keyUp(theKey) 方法來操作。
清單 9. 修飾鍵方法 KeyDown(theKey)、keyUp(theKey)
 Actions action = new Actions(driver); 
 action.keyDown(Keys.CONTROL);// 按下 Ctrl 鍵
 action.keyDown(Keys.SHIFT);// 按下 Shift 鍵
 action.keyDown(Key.ALT);// 按下 Alt 鍵
 action.keyUp(Keys.CONTROL);// 釋放 Ctrl 鍵
 action.keyUp(Keys.SHIFT);// 釋放 Shift 鍵
 action.keyUp(Keys.ALT);// 釋放 Alt 鍵

所以要通過 Alt+F4 來關閉當前的活動視窗,可以通過下面語句來實現:action.keyDown(Keys.ALT).keyDown(Keys.F4).keyUp(Keys.ALT).perform();

而如果是對於像鍵盤上面的字母鍵 a,b,c,d... 等的組合使用,可以通過以下語句實現 :action.keyDown(Keys.CONTROL).sednKeys(“a”).perform();

在 WebDriver API 中,KeyDown(Keys theKey)、KeyUp(Keys theKey) 方法的引數只能是修飾鍵:Keys.SHIFT、Keys.ALT、Keys.CONTROL, 否者將丟擲 IllegalArgumentException 異常。 其次對於 action.keyDown(theKey) 方法的呼叫,如果沒有顯示的呼叫 action.keyUp(theKey) 或者 action.sendKeys(Keys.NULL) 來釋放的話,這個按鍵將一直保持按住狀態。