引用包來自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/
文中部分案例摘自網絡博客,僅用于學習記錄。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
