在自動化中我們可能需要用到鼠標或者是鍵盤操作,在webdriver中是Actions類進行這些操作的。
代碼如下:
Actions action = new Actions(driver); //-------定義一個action對象 action.click(); action.click(searchBt); //-------單擊操作 action.doubleClick().perform(); action.doubleClick(searchBt).perform(); //-------雙擊操作 action.clickAndHold().perform(); action.clickAndHold(searchBt).perform(); //-------懸停操作 action.contextClick().perform(); action.contextClick(searchBt).perform(); //-------右擊操作 action.dragAndDrop(searchBt, searchBt).perform(); //-------拖拽操作 從一個元素拖拽到目標元素
這是幾個常用操作的簡單用法,老規矩,看下源碼是怎么定義的action類的:
我們可以看到actons類有多種構造函數和方法,都是根據平時我們不同的需要來進行使用,我們也可以根據自己項目來封裝這些操作,做個簡單的例子:
package com.testngDemo; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.interactions.Actions; public class Demo_ActionsHelper { protected WebDriver driver; public Demo_ActionsHelper(WebDriver driver) { this.driver = driver; } /** * 單擊操作 * @param by 定位元素 */ public void click(By by) { driver.findElement(by).click(); } /** * 雙擊操作 * @param by */ public void doubleClick(By by) { new Actions(driver).doubleClick(driver.findElement(by)).perform(); } /** * 右擊點開菜單 * @param by */ public void contextmenu(By by) { new Actions(driver).contextClick(driver.findElement(by)).perform(); } }
然后調用自己封裝好的類
僅提供一個小的例子 ,具體的要根據自己項目的需要不斷完善和維護腳本,豐富自己項目的腳本代碼,提高自動化測試腳本開發的效率。
那么我們再來看下鍵盤是如何調用的?
鍵盤的調用我們是調用的Keys這個類
/* Copyright 2007-2012 Selenium committers Copyright 2013 Software Freedom Conservancy Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.openqa.selenium; import java.util.Arrays; /** * Representations of pressable keys that aren't text. These are stored in the Unicode PUA (Private * Use Area) code points, 0xE000-0xF8FF. * * @see <a href="http://www.google.com.au/search?&q=unicode+pua&btnG=Search">http://www.google.com.au/search?&q=unicode+pua&btnG=Search</a> */ public enum Keys implements CharSequence { NULL ('\uE000'), CANCEL ('\uE001'), // ^break HELP ('\uE002'), BACK_SPACE ('\uE003'), TAB ('\uE004'), CLEAR ('\uE005'), RETURN ('\uE006'), ENTER ('\uE007'), SHIFT ('\uE008'), LEFT_SHIFT (Keys.SHIFT), CONTROL ('\uE009'), LEFT_CONTROL (Keys.CONTROL), ALT ('\uE00A'), LEFT_ALT (Keys.ALT), PAUSE ('\uE00B'), ESCAPE ('\uE00C'), SPACE ('\uE00D'), PAGE_UP ('\uE00E'), PAGE_DOWN ('\uE00F'), END ('\uE010'), HOME ('\uE011'), LEFT ('\uE012'), ARROW_LEFT (Keys.LEFT), UP ('\uE013'), ARROW_UP (Keys.UP), RIGHT ('\uE014'), ARROW_RIGHT (Keys.RIGHT), DOWN ('\uE015'), ARROW_DOWN (Keys.DOWN), INSERT ('\uE016'), DELETE ('\uE017'), SEMICOLON ('\uE018'), EQUALS ('\uE019'), // Number pad keys NUMPAD0 ('\uE01A'), NUMPAD1 ('\uE01B'), NUMPAD2 ('\uE01C'), NUMPAD3 ('\uE01D'), NUMPAD4 ('\uE01E'), NUMPAD5 ('\uE01F'), NUMPAD6 ('\uE020'), NUMPAD7 ('\uE021'), NUMPAD8 ('\uE022'), NUMPAD9 ('\uE023'), MULTIPLY ('\uE024'), ADD ('\uE025'), SEPARATOR ('\uE026'), SUBTRACT ('\uE027'), DECIMAL ('\uE028'), DIVIDE ('\uE029'), // Function keys F1 ('\uE031'), F2 ('\uE032'), F3 ('\uE033'), F4 ('\uE034'), F5 ('\uE035'), F6 ('\uE036'), F7 ('\uE037'), F8 ('\uE038'), F9 ('\uE039'), F10 ('\uE03A'), F11 ('\uE03B'), F12 ('\uE03C'), META ('\uE03D'), COMMAND (Keys.META), ZENKAKU_HANKAKU ('\uE040'); private final char keyCode; Keys(Keys key) { this(key.charAt(0)); } Keys(char keyCode) { this.keyCode = keyCode; } public char charAt(int index) { if (index == 0) { return keyCode; } return 0; } public int length() { return 1; } public CharSequence subSequence(int start, int end) { if (start == 0 && end == 1) { return String.valueOf(keyCode); } throw new IndexOutOfBoundsException(); } @Override public String toString() { return String.valueOf(keyCode); } /** * Simulate pressing many keys at once in a "chord". Takes a sequence of Keys.XXXX or strings; * appends each of the values to a string, and adds the chord termination key (Keys.NULL) and * returns the resultant string. * * Note: When the low-level webdriver key handlers see Keys.NULL, active modifier keys * (CTRL/ALT/SHIFT/etc) release via a keyup event. * * Issue: http://code.google.com/p/webdriver/issues/detail?id=79 */ public static String chord(CharSequence... value) { return chord(Arrays.asList(value)); } /** * @see #chord(CharSequence...) */ public static String chord(Iterable<CharSequence> value) { StringBuilder builder = new StringBuilder(); for (CharSequence seq : value) { builder.append(seq); } builder.append(Keys.NULL); return builder.toString(); } /** * Get the special key representation, {@link Keys}, of the supplied character if there is one. If * there is no special key tied to this character, null will be returned. * * @param key unicode character code * @return special key linked to the character code, or null if character is not a special key */ public static Keys getKeyFromUnicode(char key) { for (Keys unicodeKey : values()) { if (unicodeKey.charAt(0) == key) { return unicodeKey; } } return null; } }
它為我們提供了鍵盤上的絕大多數的鍵位,我們可以直接輸入鍵位名稱來實現鍵盤的調用
當然我們也可以根據自己的需要將特定的操作、組合操作封裝起來供我們自己使用。
另外在actions類中的keyup keydown修飾鍵方法,參數參數只能是修飾鍵:Keys.SHIFT、Keys.ALT、Keys.CONTROL, 否者將拋出 IllegalArgumentException 異常。 其次對於 action.keyDown(theKey) 方法的調用,如果沒有顯示的調用 action.keyUp(theKey) 或者 action.sendKeys(Keys.NULL) 來釋放的話,這個按鍵將一直保持按住狀態。