您的位置:軟件測試 > 開源軟件測試 > 開源功能測試工具 > Selenium
Selenium WebDriver中一些鼠標(biāo)和鍵盤事件的使用
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時間:[ 2015/6/26 14:38:43 ] 推薦標(biāo)簽:功能測試工具

  在使用 Selenium WebDriver 做自動化測試的時候,會經(jīng)常模擬鼠標(biāo)和鍵盤的一些行為。比如使用鼠標(biāo)單擊、雙擊、右擊、拖拽等動作;或者鍵盤輸入、快捷鍵使用、組合鍵使用等模擬鍵盤的操作。在 WebDeriver 中,有一個專門的類來負(fù)責(zé)實(shí)現(xiàn)這些測試場景,那是 Actions 類,在使用該類的過程中會配合使用到 Keys 枚舉以及 Mouse、 Keyboard、CompositeAction 等類。
  其次,在實(shí)際測試過程中,可能會遇到某些按鍵沒辦法使用 Actions、Keys 等類來實(shí)現(xiàn)的情況。 比如通過使用 Alt+PrtSc 組合鍵來實(shí)現(xiàn)截取屏幕當(dāng)前活動窗口的圖像,在 Keys 枚舉中,因?yàn)闆]有枚舉出 PrtSc 鍵,所以沒辦法通過 Action 的 KeyDown(Keys) 來模擬按下這個動作。
  再次是在自動化測試中,可能會遇到一些附件、文件上傳的場景,或者是多文件上傳,這些在 Selenium2.0 之后,可以直接使用 WebElement 類的 sendKeys() 方法來實(shí)現(xiàn)。
  下面分別介紹這些情況的具體使用。
  鼠標(biāo)點(diǎn)擊操作
  鼠標(biāo)點(diǎn)擊事件有以下幾種類型:
  清單 1. 鼠標(biāo)左鍵點(diǎn)擊
  Actions action = new Actions(driver);action.click();// 鼠標(biāo)左鍵在當(dāng)前停留的位置做單擊操作
  action.click(driver.findElement(By.name(element)))// 鼠標(biāo)左鍵點(diǎn)擊指定的元素
  清單 2. 鼠標(biāo)右鍵點(diǎn)擊
  Actions action = new Actions(driver);
  action.contextClick();// 鼠標(biāo)右鍵在當(dāng)前停留的位置做單擊操作
  action.contextClick(driver.findElement(By.name(element)))// 鼠標(biāo)右鍵點(diǎn)擊指定的元素
  清單 3. 鼠標(biāo)雙擊操作
  Actions action = new Actions(driver);
  action.doubleClick();// 鼠標(biāo)在當(dāng)前停留的位置做雙擊操作
  action.doubleClick(driver.findElement(By.name(element)))// 鼠標(biāo)雙擊指定的元素
  清單 4. 鼠標(biāo)拖拽動作
  Actions action = new Actions(driver);
  // 鼠標(biāo)拖拽動作,將 source 元素拖放到 target 元素的位置。
  action.dragAndDrop(source,target);
  // 鼠標(biāo)拖拽動作,將 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 為橫坐標(biāo),yOffset 為縱坐標(biāo)。
  action.dragAndDrop(source,xOffset,yOffset);
  在這個拖拽的過程中,已經(jīng)使用到了鼠標(biāo)的組合動作,首先是鼠標(biāo)點(diǎn)擊并按住 (click-and-hold) source 元素,然后執(zhí)行鼠標(biāo)移動動作 (mouse move),移動到 target 元素位置或者是 (xOffset, yOffset) 位置,再執(zhí)行鼠標(biāo)的釋放動作 (mouse release)。所以上面的方法也可以拆分成以下的幾個執(zhí)行動作來完成:
  action.clickAndHold(source).moveToElement(target).perform();
  action.release();
  清單 5. 鼠標(biāo)懸停操作
  Actions action = new Actions(driver);
  action.clickAndHold();// 鼠標(biāo)懸停在當(dāng)前位置,既點(diǎn)擊并且不釋放
  action.clickAndHold(onElement);// 鼠標(biāo)懸停在 onElement 元素的位置
  action.clickAndHold(onElement) 這個方法實(shí)際上是執(zhí)行了兩個動作,首先是鼠標(biāo)移動到元素 onElement,然后再 clickAndHold, 所以這個方法也可以寫成 action.moveToElement(onElement).clickAndHold()。
  清單 6. 鼠標(biāo)移動操作
  Actions action = new Actions(driver);
  action.moveToElement(toElement);// 將鼠標(biāo)移到 toElement 元素中點(diǎn)
  // 將鼠標(biāo)移到元素 toElement 的 (xOffset, yOffset) 位置,
  //這里的 (xOffset, yOffset) 是以元素 toElement 的左上角為 (0,0) 開始的 (x, y) 坐標(biāo)軸。
  action.moveToElement(toElement,xOffset,yOffset)
  // 以鼠標(biāo)當(dāng)前位置或者 (0,0) 為中心開始移動到 (xOffset, yOffset) 坐標(biāo)軸
  action.moveByOffset(xOffset,yOffset);
  action.moveByOffset(xOffset,yOffset) 這里需要注意,如果 xOffset 為負(fù)數(shù),表示橫坐標(biāo)向左移動,yOffset 為負(fù)數(shù)表示縱坐標(biāo)向上移動。而且如果這兩個值大于當(dāng)前屏幕的大小,鼠標(biāo)只能移到屏幕邊界的位置同時拋出 MoveTargetOutOfBoundsExecption 的異常。
  鼠標(biāo)移動操作在測試環(huán)境中比較常用到的場景是需要獲取某元素的 flyover/tips,實(shí)際應(yīng)用中很多 flyover 只有當(dāng)鼠標(biāo)移動到這個元素之后才出現(xiàn),所以這個時候通過執(zhí)行 moveToElement(toElement) 操作,能達(dá)到預(yù)期的效果。但是根據(jù)我個人的經(jīng)驗(yàn),這個方法對于某些特定產(chǎn)品的圖標(biāo),圖像之類的 flyover/tips 也不起作用,雖然在手動操作的時候移動鼠標(biāo)到這些圖標(biāo)上面可以出現(xiàn) flyover, 但是當(dāng)使用 WebDriver 來模擬這一移動操作時,雖然方法成功執(zhí)行了,但是 flyover 卻出不來。所以在實(shí)際應(yīng)用中,還需要對具體的產(chǎn)品頁面做相應(yīng)的處理。
  清單 7. 鼠標(biāo)釋放操
  Actions action = new Actions(driver);
  action.release();// 釋放鼠標(biāo)
  鍵盤模擬操作
  對于鍵盤的模擬操作,Actions 類中有提供 keyUp(theKey)、keyDown(theKey)、sendKeys(keysToSend) 等方法來實(shí)現(xiàn)。鍵盤的操作有普通鍵盤和修飾鍵盤(Modifier Keys, 下面的章節(jié)將講到修飾鍵的概念)兩種 :
  1. 對于普通鍵盤,使用 sendKeys(keysToSend) 可以實(shí)現(xiàn),比如按鍵 TAB、Backspace 等。
  清單 8. 普通鍵盤模擬 sendKeys(keysToSend)
  Actions action = new Actions(driver);
  action.sendKeys(Keys.TAB);// 模擬按下并釋放 TAB 鍵
  action.sendKeys(Keys.SPACE);// 模擬按下并釋放空格鍵
  /***
  針對某個元素發(fā)出某個鍵盤的按鍵操作,或者是輸入操作,
  比如在 input 框中輸入某個字符也可以使用這個方法。這個方法也可以拆分成:
  action.click(element).sendKeys(keysToSend)。
  */
  action.sendKeys(element,keysToSend);
  注意除了 Actions 類有 sendKeys(keysToSend)方法外,WebElement 類也有一個 sendKeys(keysToSend)方法,這兩個方法對于一般的輸入操作基本上相同,不同點(diǎn)在于以下幾點(diǎn):
  Actions 中的 sendKeys(keysToSend) 對于修飾鍵 (Modifier Keys) 的調(diào)用并不會釋放,也是說當(dāng)調(diào)用 actions.sendKeys(Keys.ALT); actions.sendKeys(Keys.CONTROL); action.sendKeys(Keys.SHIFT); 的時候,相當(dāng)于調(diào)用 actions.keyDown(keysToSend),而如果在現(xiàn)實(shí)的應(yīng)用中想要模擬按下并且釋放這些修飾鍵,應(yīng)該再調(diào)用 action.sendKeys(keys.NULL) 來完成這個動作。
  其次是當(dāng) Actions 的 sendKeys(keysToSend) 執(zhí)行完之后,焦點(diǎn)不在當(dāng)前元素了。所以我們可以使用 sendKeys(Keys.TAB) 來切換元素的焦點(diǎn),從而達(dá)到選擇元素的作用,這個常用到的場景是在用戶名和密碼的輸入過程中。
  第三點(diǎn),在 WebDriver 中,我們可以使用 WebElement 類的 sendKeys(keysToSend) 來上傳附件,比如 element.sendKeys(“C:\test\uploadfile\test.jpg”); 這個操作將 test.jpg 上傳到服務(wù)器,但是使用:
  Actions action = New Actions(driver);
  action.sendKeys(element,“C:\test\upload\test.jpg”);
  action.click(element).sendKeys(“C:\test\upload\test.jpg”);
  這種方式是上傳不成功的,雖然 WebDriver 在執(zhí)行這條語句的時候不會出錯,但是實(shí)際上并沒有將文件上傳。所以要上傳文件,還是應(yīng)該使用前面一種方式。
  2.對于修飾鍵(Modifier keys),一般都是跟普通鍵組合使用的。比如 Ctrl+a、Alt+F4、 Shift+Ctrl+F 等等。
  這里先解釋一下修飾鍵的概念,修飾鍵是鍵盤上的一個或者一組特別的鍵,當(dāng)它與一般按鍵同時使用的時候,用來臨時改變一般鍵盤的普通行為。對于單獨(dú)按下修飾鍵本身一般不會觸發(fā)任何鍵盤事件。在個人計算機(jī)上的鍵盤上,有以下幾個修飾鍵:Shift、Ctrl、Alt(Option)、AltGr、Windows logo、Command、FN(Function)。但是在 WebDriver 中,一般的修飾鍵指前面三個。你可以點(diǎn)擊下面的 Wiki 鏈接去了解更多有關(guān)修飾鍵的信息,Modifier key。
  回到上面的話題,在 WebDriver 中對于修飾鍵的使用需要用到 KeyDown(theKey)、keyUp(theKey) 方法來操作。

上一頁12下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd