1. 程式人生 > >WebDriver事件處理(滑鼠+按鍵)

WebDriver事件處理(滑鼠+按鍵)

我們在使用webdriver的clear方法時,我們需要注意其中selenium下webdriver的clear()方法,那我們首先看看官網上對clear()方法的描述:

  /**
   * If this element is a text entry element, this will clear the value. Has no effect on other
   * elements. Text entry elements are INPUT and TEXTAREA elements.
   *
   * Note that the events fired by this event may not be as you'd expect.  In particular, we don't
   * fire any keyboard or mouse events.  If you want to ensure keyboard events are fired, consider
   * using something like {@link #sendKeys(CharSequence...)} with the backspace key.  To ensure
   * you get a change event, consider following with a call to {@link #sendKeys(CharSequence...)}
   * with the tab key.
   */
  void clear();

我們在使用clear()方法時,有可能將非文字框空間的一些附加的事件函式也要清除掉,所以官方建議使用組合鍵backspace鍵做處理;那下面就將WebDriver事件處理的相關資料列出來,供大家使用。

測試工具webdriver的使用過程中,應該會用到使用工具來模擬用的滑鼠、鍵盤的一些輸入操作,比如說: 1、滑鼠的左鍵點選、雙擊、拖拽、右鍵點選等; 2、鍵盤的回車、回退、空格、ctrl、alt、shift等; 在webdriver中,有專門的一個類,是用來進行滑鼠、鍵盤的模擬操作的,那就是Actions類,該類使用時,又會涉及到Keyboard、Mouse、CompositeAction(複合動作),先對Mouse的方法做簡單羅列,然後再用程式碼說明: 1、滑鼠左鍵點選: Actions action = new Actions(driver); action.click(driver.findElement(By.xpath(xpath))); 左鍵點選是普通常用的方法,前面已經介紹過一種更簡單的方法: Driver driver=new Driver(); driver.findElement(By.xpath(xpath)).click(); 2、滑鼠左鍵雙擊: Actions action = new Actions(driver); action.doubleClick(driver.findElement(By.xpath(xpath))); 3、滑鼠左鍵按下操作: Actions action = new Actions(driver); action.clickAndHold(driver.findElemen(By.xpath(xpath))); 4、滑鼠左鍵移動到元素操作: Actions action = new Actions(driver); action.moveToElement(driver.findElement(By.xpath(xpath))); 5、滑鼠右鍵點選操作: Actions action = new Actions(driver) ; action.contextClick(driver.findElement(By.xpath(xpath))); 6、組合的滑鼠操作(將目標元素拖拽到指定的元素上): Actions action = new Actions(driver); action.dragAndDrop(driver.findElement(By.xpath(xpath)),driver.findElement(By.xpath(xpath))); 7、組合的滑鼠操作(將目標元素拖拽到指定的元素上): Actions action = new Actions(driver); action.dragAndDrop(driver.findElement(By.xpath(xpath)),xOffset,yOffset); 程式碼演示: driver.get("http://www.baidu.com"); driver.findElement(By.name("wd")).sendKeys("林丹"); //點選操作 driver.findElement(by.id("su")).click(); driver.navigate().back(); Actions action=new Actions(driver); action.click(driver.findElement(by.id("su"))); //雙擊操作(略) //拖拽選擇操作,滑鼠按住不放,進行拖拽選擇,然後釋放滑鼠,需要三個動作 action.clickAndHold(driver.findElement(By.id("1"))).moveToElement(driver.findElement(By.id("3"))).perform(); action.release(); //拖拽元素,將一個元素拖拽到另一個元素上,然後釋放滑鼠(略) 鍵盤的模擬操作,包括普通按鍵,比如enter、backspace、tab等,還包括四個修飾鍵(Modifier Keys),分別是Caps Lock,Control,Option,Command。 普通按鍵使用時,直接使用sendkeys(theKeys)就可以,如按下enter鍵: action.sendKeys(Keys.ENTER).perform(); 修飾鍵一般使用時,是和別的按鍵配合使用的,比如快捷鍵ctrl+F4,這時就得使用keyDown(theKeys)、keyUp(theKeys)來操作,程式碼如下: driver.get("http://www.baidu.com"); driver.findElement(by.name("wd")).sendKeys("林丹"); Actions action=new Actions(driver); //輸入框中輸入內容,然後點選回車進行百度
action.sendKeys(Keys.ENTER).perform(); //使用快捷鍵alt+f4關閉視窗(但是該方法不穩定,時行時不行,不行居多) action.keyDown(keys.ATL).keyDown(keys.F4).keyUp(keys.ALT).perform(); //使用ctrl+a全選,注意selenium-java-2.42.2.jar下使用該方法不能正常使用,現在我使用的是注意selenium-java-2.41.0.jar(正常使用)。 driver.findElement(By.id("kw")).click(); action.sendKeys(Keys.CONTROL,"a").perform(); //若我們需要多次使用同一個按鍵時,那我們一定要釋放該按鍵,比如需要多次使用ctrl+a時, action.sendKeys(Keys.CONTROL,"a").keyUp(Keys.CONTROL).perform();

使用 Robot 類來操作 Keys 沒有枚舉出來的按鍵操作

1.在 WebDriver 中,Keys 枚舉出了鍵盤上大多數的非字母類按鍵,從 F1 到 F10,NUMPAD0 到 NUMPAD9、ALT\TAB\CTRL\SHIFT 等等,你可以通過以下連結檢視 Keys 枚舉出來的所有按鍵。 但是並沒有列出鍵盤上的所有按鍵,比如字母鍵 a、b、c、d … z,一些符號鍵比如:‘ {}\[] ’、‘ \ ’、‘。’、‘ ? ’、‘:’、‘ + ’、‘ - ’、‘ = ’、、‘“”’,還有一些不常用到的功能鍵如 PrtSc、ScrLk/NmLk。對於字母鍵和符號鍵,前面我們已經提到可以直接使用 sendKeys(“a”),sendKeys(“/”) 的方式來觸發這些鍵盤事件。而對於一些功能組合鍵,如 Fn + NmLk 來關閉或者開啟數字鍵,或者 Alt+PrtSC 來抓取當前螢幕的活動視窗並儲存到圖片,通過 WebDriver 的 Keys 是沒辦法操作的。 這個時候我們就需要用到 Java 的 Robot 類來實現對這類組合鍵的操作了。

//使用robot來操作control+a程式碼如下: Robot robot = new Robot(); 
// 模擬按下鍵盤動作,這裡通過使用 KeyEvent 類來獲取對應鍵盤(CTRL)的虛擬鍵碼
robot.keyPress(java.awt.event.KeyEvent.VK_CONTROL);  // 按下 A鍵 robot.keyPress(java.awt.event.KeyEvent.VK_A); 
// 釋放鍵盤動作,當這個動作完成之後,模擬組合鍵 Ctrl+ a的過程就已經完成,
// 使用完後,做釋放按鍵處理
robot.keyRelease(java.awt.event.KeyEvent.VK_A); 
robot.keyRelease(java.awt.event.KeyEvent.VK_CONTROL); 
Tips: 1、拖拽選擇時,使用clickAndHold和moveToElement時,會受到滑鼠所在位置的影響,所以儘量是兩個方法一起使用; 2、拖拽元素時,dragAndDrop方法,我沒有找到實現的場景,所以沒有寫程式碼試驗; 3、直接按下普通按鍵時,直接使用sendkeys(theKeys)方法就能夠實現; 4、需要使用修飾鍵時,需要連貫動作中應該使用keydown和keyup方法; action.keyDown(keys.ATL).sendKeys(keys.F4).keyUp(keys.ALT).perform();//這是不能實現alt+f4關閉視窗的效果的,只能實現單獨按f4的效果 5、對於一些快捷鍵,如ctrl+a,可以直接sendkeys(Keys.CONTROL,"a") ,注意需要釋放按鈕;