引用包來自selenium-java-2.23.1.jar
調用以下代碼時,需要引入actions類,以java為例: import org.openqa.selenium.interactions.Actions;
鼠標事件-概述
1.單擊 click()、click(WebElement onElement)
2.雙擊 doubleClick() 、 doubleClick(WebElement onElement)
3.右擊 contextClick()、 contextClick(WebElement onElement)
4.移動/懸浮 moveByOffset(int xOffset, int yOffset)、moveToElement(WebElement toElement)、moveToElement(WebElement toElement, int xOffset, int yOffset)
5.左鍵按下不釋放 clickAndHold()、clickAndHold(WebElement onElement)
6.釋放 release()、release(WebElement onElement),經常與clickAndHold相配合
7.拖動 dragAndDrop(WebElement source, WebElement target)、 dragAndDropBy(WebElement source, int xOffset, int yOffset)
- 以上方法返回值均為Actions, 需要調用perform()后才能真正執行。
鍵盤事件-概述
1.普通鍵操作:sendKeys(java.lang.CharSequence... keysToSend)、sendKeys(WebElement element, java.lang.CharSequence... keysToSend)
2.修飾鍵操作:
按下修飾鍵:keyDown(Keys theKey)、keyDown(WebElement element, Keys theKey)、sendKeys(keysToSend)
松開修飾鍵:keyUp(Keys theKey)、keyUp(WebElement element, Keys theKey)、sendKeys(Keys.NULL)
- 以上方法返回值均為Actions, 需要調用perform()后才能真正執行。
- keyDown\keyUp 參數只能是修飾鍵,否則拋出llegalArgumentException 異常
- 執行keyDown(theKey)和sendKeys(修飾鍵)后,需要明顯釋放,否則將一直執行;釋放方法分別為keyUp(theKey),sendKeys(Keys.NULL)
- 區分Actions.sendKeys(keysToSend)和
WebElement.sendKeys(CharSequence...)
執行事件
1.build():組合所有actions,生成新的actions
2.perform():執行actions,參考源碼發現該方法包含build()
- 所有Actions事件必須調用perform后才被真正執行
============================================================================================
鼠標事件-案例
1.單擊 click()、click(WebElement onElement)
Actions action = new Actions(driver);
action.click().perform();// 鼠標左鍵在當前停留的位置做單擊操作 action.click(driver.findElement(By.***)).perform();// 鼠標左鍵點擊指定的元素
2.雙擊 doubleClick() 、 doubleClick(WebElement onElement)
Actions action = new Actions(driver); action.doubleClick().perform();// 鼠標在當前停留的位置做雙擊操作 action.doubleClick(driver.findElement(By.***)).perform();// 鼠標雙擊指定的元素
3.右擊 contextClick()、 contextClick(WebElement onElement)
Actions action = new Actions(driver); action.contextClick().perform();// 鼠標右鍵在當前停留的位置做單擊操作 action.contextClick(driver.findElement(By.***)).perform();// 鼠標右鍵點擊指定的元素
4.移動/懸浮 moveByOffset(int xOffset, int yOffset)、moveToElement(WebElement toElement)、moveToElement(WebElement toElement, int xOffset, int yOffset)
Actions action = new Actions(driver); action.moveToElement(toElement).perform();// 將鼠標移到 toElement 元素中心點
action.moveToElement(toElement,xOffset,yOffset).perform();// 將鼠標移到元素 toElement 的 (xOffset, yOffset) 位置,
//這里的 (xOffset, yOffset) 是以元素 toElement 的左上角為 (0,0) 開始的 (x, y) 坐標軸。 action.moveByOffset(xOffset,yOffset).perform();// 以鼠標當前位置或者 (0,0) 為中心開始移動到 (xOffset, yOffset) 坐標軸
action.moveByOffset(xOffset,yOffset) 這里需要注意,如果 xOffset為負數,表示橫坐標向左移動,yOffset 為負數表示縱坐標向上移動。而且如果這兩個值大於當前屏幕的大小,鼠標只能移到屏幕最邊界的位置同時拋出MoveTargetOutOfBoundsExecption 的異常。
5.左鍵按下不釋放 clickAndHold()、clickAndHold(WebElement onElement)
Actions action = new Actions(driver); action.clickAndHold().perform();// 鼠標在當前位置點擊后不釋放 action.clickAndHold(onElement).perform();// 鼠標在 onElement 元素的位置點擊后不釋放
6.釋放 release()、release(WebElement onElement),經常與clickAndHold相配合
Actions action = new Actions(driver); action.release().perform();// 釋放鼠標
7.拖動 dragAndDrop(WebElement source, WebElement target)、 dragAndDropBy(WebElement source, int xOffset, int yOffset)
Actions action = new Actions(driver);
action.dragAndDrop(source,target).perform();// 將 source 元素拖放到 target 元素的位置。
action.dragAndDrop(source,xOffset,yOffset).perform();// 將 source 元素拖放到 (xOffset, yOffset) 位置,其中 xOffset 為橫坐標,yOffset 為縱坐標。
拖拽動作是組合動作可以拆分實現:
Actions action = new Actions(driver);
action.clickAndHold(source).moveToElement(target).release().perform(); //選中source元素->移動到target元素位置->釋放左鍵
action.clickAndHold(source).moveByOffset(xOffset,yOffset).release().perform(); //選中source元素->拖放到(xOffset,yOffset)位置->釋放左鍵
鍵盤事件-案例
鍵盤的划分:
- 普通鍵
- 已枚舉:Keys.TAB、Keys.SPACE、Keys.F4、Keys.NUMPAD2、Keys.ARROW_DOWN、Keys.BACK_SPACE等;更多枚舉鍵可參考selenium api中的keys類
- 未枚舉:的字母鍵(a、b、c...)和符號鍵(‘ {}\[]’、‘ \ ’、‘。’、‘ ? ’、‘:’、‘ + ’、‘ – ’、‘ = ’、、‘“”’)等
- 修飾鍵 Keys.CONTROL、Keys.SHIFT、Keys.ALT等,單獨按下修飾鍵本身一般不會觸發任何鍵盤事件,通常和普通建組合使用。
- 更多信息可參考Modifier key
Actions action = new Actions(driver); action.sendKeys(Keys.TAB).perform();// 模擬按下並釋放 TAB 鍵 action.sendKeys(element,Keys.SPACE).perform();// 對element輸入並釋放空格鍵--可拆分為 action.click(element).sendKeys(Keys.SPACE).perform();
action.sendKeys("a").perform();// 模擬輸入a
action.sendKeys(",").perform();// 模擬輸入,
Actions.sendKeys(keysToSend)和 WebElement.sendKeys(CharSequence...)區別
-
- Actions.sendKeys(keysToSend) ,操作修飾鍵時不會釋放,等於actions.sendKeys(keysToSend),需要action.sendKeys(keys.NULL) 釋放修飾鍵;
WebElement.sendKeys()直接釋放參數 - 其次就是當 Actions 的 sendKeys(keysToSend) 執行完之后,焦點就不在當前元素了。所以我們可以使用sendKeys(Keys.TAB) 來切換元素的焦點,從而達到選擇元素的作用,這個最常用到的場景就是在用戶名和密碼的輸入過程中。
- Actions.sendKeys(keysToSend) ,操作修飾鍵時不會釋放,等於actions.sendKeys(keysToSend),需要action.sendKeys(keys.NULL) 釋放修飾鍵;
- 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”);
按下修飾鍵:keyDown(Keys theKey)、keyDown(WebElement element, Keys theKey)、sendKeys(keysToSend)
松開修飾鍵:keyUp(Keys theKey)、keyUp(WebElement element, Keys theKey)、sendKeys(Keys.NULL)
1)修飾鍵慣用操作:
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 鍵
sendKeys(keysToSend);//按下修飾鍵
sendKeys(Keys.NULL);//釋放修飾鍵
2)組合件輸入-案例
SHIFT+a 預期輸入A
Actions action = new Actions(driver);
action.keyDown(Keys.SHIFT).sendKeys(driver.findElement(By.tagName("input")),"a").keyUp(Keys.SHIFT).perform();//按下Shift->輸入a->釋放Shift,結果輸入A
3)輸入修飾鍵后需要明顯釋放-案例
WebElement input = driver.findElement(By.tagName("input"));
Actions action = new Actions(driver);
action.keyDown(Keys.SHIFT).sendKeys(input,"a").perform();//按下Shift->輸入a,結果輸入A ;未釋放Shift
action.sendKeys(input, "b").perform();//輸入大寫B
WebElement input = driver.findElement(By.tagName("input"));
Actions action = new Actions(driver);
action.keyDown(Keys.SHIFT).sendKeys(input,"a").keyUp(Keys.SHIFT).perform();//按下Shift->輸入a->釋放Shift,結果輸入A ; 已釋放Shift
action.sendKeys(input, "b").perform();//輸入小寫b
同理,使用Actions.sendKeys(修飾鍵)后,需要使用sendKeys(Keys.NULL) 釋放修飾鍵,否則修飾鍵一直處於被按下狀態
3.robot類處理未枚舉鍵:(未驗證)
java.awt.Robot robot = new Robot();
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);
robot.keyPress(java.awt.event.KeyEvent.VK_ALT);
===========================================================================================
更多參考資料:
Selenium java api http://selenium.googlecode.com/git/docs/api/java/index.html
Selenium 源碼 git clone https://code.google.com/p/selenium/
文中部分案例摘自網絡博客,僅用於學習記錄。
