Selenium WebDriver 中鼠標(biāo)和鍵盤(pán)事件分析及擴(kuò)展

在使用 Selenium WebDriver 做自動(dòng)化測(cè)試的時(shí)候骑篙,會(huì)經(jīng)常模擬鼠標(biāo)和鍵盤(pán)的一些行為。比如使用鼠標(biāo)單擊森书、雙擊靶端、右擊、拖拽等動(dòng)作凛膏;或者鍵盤(pán)輸入杨名、快捷鍵使用、組合鍵使用等模擬鍵盤(pán)的操作猖毫。在 WebDeriver 中台谍,有一個(gè)專門(mén)的類來(lái)負(fù)責(zé)實(shí)現(xiàn)這些測(cè)試場(chǎng)景,那就是 Actions 類吁断,在使用該類的過(guò)程中會(huì)配合使用到 Keys 枚舉以及 Mouse典唇、 Keyboard、CompositeAction 等類胯府。

其次,在實(shí)際測(cè)試過(guò)程中恨胚,可能會(huì)遇到某些按鍵沒(méi)辦法使用 Actions骂因、Keys 等類來(lái)實(shí)現(xiàn)的情況。 比如通過(guò)使用 Alt+PrtSc 組合鍵來(lái)實(shí)現(xiàn)截取屏幕當(dāng)前活動(dòng)窗口的圖像赃泡,在 Keys 枚舉中寒波,因?yàn)闆](méi)有枚舉出 PrtSc 鍵乘盼,所以沒(méi)辦法通過(guò) Action 的 KeyDown(Keys) 來(lái)模擬按下這個(gè)動(dòng)作。

再次是在自動(dòng)化測(cè)試中俄烁,可能會(huì)遇到一些附件绸栅、文件上傳的場(chǎng)景撒璧,或者是多文件上傳哟玷,這些在 Selenium2.0 之后,可以直接使用 WebElement 類的 sendKeys() 方法來(lái)實(shí)現(xiàn)咨演。

下面就分別介紹這些情況的具體使用辰企。

回頁(yè)首

鼠標(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)拖拽動(dòng)作

Actions action = new Actions(driver);

// 鼠標(biāo)拖拽動(dòng)作风纠,將 source 元素拖放到 target 元素的位置。

action.dragAndDrop(source,target);

// 鼠標(biāo)拖拽動(dòng)作牢贸,將 source 元素拖放到 (xOffset, yOffset) 位置竹观,其中 xOffset 為橫坐標(biāo),yOffset 為縱坐標(biāo)潜索。

action.dragAndDrop(source,xOffset,yOffset);

在這個(gè)拖拽的過(guò)程中臭增,已經(jīng)使用到了鼠標(biāo)的組合動(dòng)作,首先是鼠標(biāo)點(diǎn)擊并按住 (click-and-hold) source 元素竹习,然后執(zhí)行鼠標(biāo)移動(dòng)動(dòng)作 (mouse move)誊抛,移動(dòng)到 target 元素位置或者是 (xOffset, yOffset) 位置,再執(zhí)行鼠標(biāo)的釋放動(dòng)作 (mouse release)由驹。所以上面的方法也可以拆分成以下的幾個(gè)執(zhí)行動(dòng)作來(lái)完成:

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) 這個(gè)方法實(shí)際上是執(zhí)行了兩個(gè)動(dòng)作,首先是鼠標(biāo)移動(dòng)到元素 onElement蔓榄,然后再 clickAndHold, 所以這個(gè)方法也可以寫(xiě)成 action.moveToElement(onElement).clickAndHold()并炮。

清單 6. 鼠標(biāo)移動(dòng)操作

Actions action = new Actions(driver);

action.moveToElement(toElement);// 將鼠標(biāo)移到 toElement 元素中點(diǎn)

// 將鼠標(biāo)移到元素 toElement 的 (xOffset, yOffset) 位置,

//這里的 (xOffset, yOffset) 是以元素 toElement 的左上角為 (0,0) 開(kāi)始的 (x, y) 坐標(biāo)軸甥郑。

action.moveToElement(toElement,xOffset,yOffset)

// 以鼠標(biāo)當(dāng)前位置或者 (0,0) 為中心開(kāi)始移動(dòng)到 (xOffset, yOffset) 坐標(biāo)軸

action.moveByOffset(xOffset,yOffset);

action.moveByOffset(xOffset,yOffset) 這里需要注意逃魄,如果 xOffset 為負(fù)數(shù),表示橫坐標(biāo)向左移動(dòng)澜搅,yOffset 為負(fù)數(shù)表示縱坐標(biāo)向上移動(dòng)伍俘。而且如果這兩個(gè)值大于當(dāng)前屏幕的大小,鼠標(biāo)只能移到屏幕最邊界的位置同時(shí)拋出 MoveTargetOutOfBoundsExecption 的異常勉躺。

鼠標(biāo)移動(dòng)操作在測(cè)試環(huán)境中比較常用到的場(chǎng)景是需要獲取某元素的 flyover/tips癌瘾,實(shí)際應(yīng)用中很多 flyover 只有當(dāng)鼠標(biāo)移動(dòng)到這個(gè)元素之后才出現(xiàn),所以這個(gè)時(shí)候通過(guò)執(zhí)行 moveToElement(toElement) 操作饵溅,就能達(dá)到預(yù)期的效果妨退。但是根據(jù)我個(gè)人的經(jīng)驗(yàn),這個(gè)方法對(duì)于某些特定產(chǎn)品的圖標(biāo),圖像之類的 flyover/tips 也不起作用咬荷,雖然在手動(dòng)操作的時(shí)候移動(dòng)鼠標(biāo)到這些圖標(biāo)上面可以出現(xiàn) flyover, 但是當(dāng)使用 WebDriver 來(lái)模擬這一移動(dòng)操作時(shí)冠句,雖然方法成功執(zhí)行了,但是 flyover 卻出不來(lái)幸乒。所以在實(shí)際應(yīng)用中懦底,還需要對(duì)具體的產(chǎn)品頁(yè)面做相應(yīng)的處理。

清單 7. 鼠標(biāo)釋放操

Actions action = new Actions(driver);

action.release();// 釋放鼠標(biāo)

回頁(yè)首

鍵盤(pán)模擬操作

對(duì)于鍵盤(pán)的模擬操作罕扎,Actions 類中有提供 keyUp(theKey)聚唐、keyDown(theKey)、sendKeys(keysToSend) 等方法來(lái)實(shí)現(xiàn)壳影。鍵盤(pán)的操作有普通鍵盤(pán)和修飾鍵盤(pán)(Modifier Keys, 下面的章節(jié)將講到修飾鍵的概念)兩種 :

1. 對(duì)于普通鍵盤(pán)拱层,使用 sendKeys(keysToSend) 就可以實(shí)現(xiàn),比如按鍵 TAB宴咧、Backspace 等根灯。

清單 8. 普通鍵盤(pán)模擬 sendKeys(keysToSend)

Actions action = new Actions(driver);

action.sendKeys(Keys.TAB);// 模擬按下并釋放 TAB 鍵

action.sendKeys(Keys.SPACE);// 模擬按下并釋放空格鍵

/***

針對(duì)某個(gè)元素發(fā)出某個(gè)鍵盤(pán)的按鍵操作,或者是輸入操作掺栅,

比如在 input 框中輸入某個(gè)字符也可以使用這個(gè)方法烙肺。這個(gè)方法也可以拆分成:

action.click(element).sendKeys(keysToSend)。

*/

action.sendKeys(element,keysToSend);

注意除了 Actions 類有 sendKeys(keysToSend)方法外氧卧,WebElement 類也有一個(gè) sendKeys(keysToSend)方法桃笙,這兩個(gè)方法對(duì)于一般的輸入操作基本上相同,不同點(diǎn)在于以下幾點(diǎn):

Actions 中的 sendKeys(keysToSend) 對(duì)于修飾鍵 (Modifier Keys) 的調(diào)用并不會(huì)釋放沙绝,也就是說(shuō)當(dāng)調(diào)用 actions.sendKeys(Keys.ALT); actions.sendKeys(Keys.CONTROL); action.sendKeys(Keys.SHIFT); 的時(shí)候搏明,相當(dāng)于調(diào)用 actions.keyDown(keysToSend),而如果在現(xiàn)實(shí)的應(yīng)用中想要模擬按下并且釋放這些修飾鍵闪檬,應(yīng)該再調(diào)用 action.sendKeys(keys.NULL) 來(lái)完成這個(gè)動(dòng)作星著。

其次就是當(dāng) Actions 的 sendKeys(keysToSend) 執(zhí)行完之后,焦點(diǎn)就不在當(dāng)前元素了粗悯。所以我們可以使用 sendKeys(Keys.TAB) 來(lái)切換元素的焦點(diǎn)虚循,從而達(dá)到選擇元素的作用,這個(gè)最常用到的場(chǎng)景就是在用戶名和密碼的輸入過(guò)程中样傍。

第三點(diǎn)横缔,在 WebDriver 中,我們可以使用 WebElement 類的 sendKeys(keysToSend) 來(lái)上傳附件衫哥,比如 element.sendKeys(“C:\\test\\uploadfile\\test.jpg”); 這個(gè)操作將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í)行這條語(yǔ)句的時(shí)候不會(huì)出錯(cuò)撤逢,但是實(shí)際上并沒(méi)有將文件上傳斗蒋。所以要上傳文件捌斧,還是應(yīng)該使用前面一種方式。

2.對(duì)于修飾鍵(Modifier keys)泉沾,一般都是跟普通鍵組合使用的。比如 Ctrl+a妇押、Alt+F4跷究、 Shift+Ctrl+F 等等。

這里先解釋一下修飾鍵的概念敲霍,修飾鍵是鍵盤(pán)上的一個(gè)或者一組特別的鍵俊马,當(dāng)它與一般按鍵同時(shí)使用的時(shí)候,用來(lái)臨時(shí)改變一般鍵盤(pán)的普通行為肩杈。對(duì)于單獨(dú)按下修飾鍵本身一般不會(huì)觸發(fā)任何鍵盤(pán)事件柴我。在個(gè)人計(jì)算機(jī)上的鍵盤(pán)上,有以下幾個(gè)修飾鍵:Shift扩然、Ctrl艘儒、Alt(Option)、AltGr夫偶、Windows logo界睁、Command、FN(Function)兵拢。但是在 WebDriver 中翻斟,一般的修飾鍵指前面三個(gè)。你可以點(diǎn)擊下面的 Wiki 鏈接去了解更多有關(guān)修飾鍵的信息说铃,Modifier key访惜。

回到上面的話題,在 WebDriver 中對(duì)于修飾鍵的使用需要用到 KeyDown(theKey)腻扇、keyUp(theKey) 方法來(lái)操作债热。

清單 9. 修飾鍵方法 KeyDown(theKey)、keyUp(theKey)

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 鍵

所以要通過(guò) Alt+F4 來(lái)關(guān)閉當(dāng)前的活動(dòng)窗口衙解,可以通過(guò)下面語(yǔ)句來(lái)實(shí)現(xiàn):action.keyDown(Keys.ALT).keyDown(Keys.F4).keyUp(Keys.ALT).perform();

而如果是對(duì)于像鍵盤(pán)上面的字母鍵 a,b,c,d... 等的組合使用阳柔,可以通過(guò)以下語(yǔ)句實(shí)現(xiàn) :action.keyDown(Keys.CONTROL).sednKeys(“a”).perform();

在 WebDriver API 中,KeyDown(Keys theKey)蚓峦、KeyUp(Keys theKey) 方法的參數(shù)只能是修飾鍵:Keys.SHIFT舌剂、Keys.ALT、Keys.CONTROL, 否者將拋出 IllegalArgumentException 異常暑椰。 其次對(duì)于 action.keyDown(theKey) 方法的調(diào)用霍转,如果沒(méi)有顯示的調(diào)用 action.keyUp(theKey) 或者 action.sendKeys(Keys.NULL) 來(lái)釋放的話,這個(gè)按鍵將一直保持按住狀態(tài)一汽。

回頁(yè)首

使用 Robot 類來(lái)操作 Keys 沒(méi)有枚舉出來(lái)的按鍵操作

1.在 WebDriver 中避消,Keys 枚舉出了鍵盤(pán)上大多數(shù)的非字母類按鍵低滩,從 F1 到 F10,NUMPAD0 到 NUMPAD9岩喷、ALT\TAB\CTRL\SHIFT 等等恕沫,你可以通過(guò)以下鏈接查看 Keys 枚舉出來(lái)的所有按鍵,Enum Keys纱意。 但是并沒(méi)有列出鍵盤(pán)上的所有按鍵婶溯,比如字母鍵 a、b偷霉、c迄委、d … z,一些符號(hào)鍵比如:‘ {}\[] ’类少、‘ \ ’叙身、‘×蚰’信轿、‘ ? ’、‘:’妓忍、‘ + ’虏两、‘ - ’、‘ = ’世剖、定罢、‘“”’,還有一些不常用到的功能鍵如 PrtSc旁瘫、ScrLk/NmLk祖凫。對(duì)于字母鍵和符號(hào)鍵,前面我們已經(jīng)提到可以直接使用 sendKeys(“a”)酬凳,sendKeys(“/”) 的方式來(lái)觸發(fā)這些鍵盤(pán)事件惠况。而對(duì)于一些功能組合鍵,如 Fn + NmLk 來(lái)關(guān)閉或者打開(kāi)數(shù)字鍵宁仔,或者 Alt+PrtSC 來(lái)抓取當(dāng)前屏幕的活動(dòng)窗口并保存到圖片稠屠,通過(guò) WebDriver 的 Keys 是沒(méi)辦法操作的。 這個(gè)時(shí)候我們就需要用到 Java 的 Robot 類來(lái)實(shí)現(xiàn)對(duì)這類組合鍵的操作了翎苫。

2.下面就以對(duì) Alt+PrtSc 為例介紹一下 Robot 對(duì)鍵盤(pán)的操作权埠。如代碼清單 10。

清單 10. 通過(guò) Robot 發(fā)出組合鍵動(dòng)作

/**

*

* @Description: 這個(gè)方法用來(lái)模擬發(fā)送組合鍵 Alt + PrtSc, 當(dāng)組合鍵盤(pán)事件執(zhí)行之后煎谍,屏幕上的活動(dòng)窗口

* 就被截取并且存儲(chǔ)在剪切板了攘蔽。 接下來(lái)就是通過(guò)讀取剪切板數(shù)據(jù)轉(zhuǎn)換成 Image 圖像對(duì)象并保存到本地。

* @param filename : 要保存的圖像的名稱

*/

public static void sendComposeKeys(String fileName) throws Exception {

// 構(gòu)建 Robot 對(duì)象呐粘,用來(lái)操作鍵盤(pán)

Robot robot = new Robot();

// 模擬按下鍵盤(pán)動(dòng)作满俗,這里通過(guò)使用 KeyEvent 類來(lái)獲取對(duì)應(yīng)鍵盤(pán)(ALT)的虛擬鍵碼

robot.keyPress(java.awt.event.KeyEvent.VK_ALT);

// 按下 PrtSC 鍵

robot.keyPress(java.awt.event.KeyEvent.VK_PRINTSCREEN);

// 釋放鍵盤(pán)動(dòng)作转捕,當(dāng)這個(gè)動(dòng)作完成之后,模擬組合鍵 Alt + PrtSC 的過(guò)程就已經(jīng)完成唆垃,

//此時(shí)屏幕活動(dòng)窗口就一被截取并存入到剪切板

robot.keyRelease(java.awt.event.KeyEvent.VK_ALT);

// 獲取系統(tǒng)剪切板實(shí)例

Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();

// 通過(guò) getContents() 方法就可以將剪切板內(nèi)容獲取并存入 Transferable 對(duì)象中

Transferable data = sysc.getContents(null);

if (data != null) {

/***

判斷從剪切板獲取的對(duì)象內(nèi)容是否為 Java Image 類五芝, 如果是將直接轉(zhuǎn)化為 Image 對(duì)象。

到此為止辕万,我們就從發(fā)出組合鍵到抓取活動(dòng)窗口与柑,再讀取剪切板并存入 Image 對(duì)象的過(guò)程

就完成了,接下來(lái)要做的就是需要將 Image 對(duì)象保存到本地蓄坏。

*/

if (data.isDataFlavorSupported(DataFlavor.imageFlavor)) {

Image image = (Image) data

.getTransferData(DataFlavor.imageFlavor);

writeImageToFile(image, fileName);

}

}

}

Robot 類對(duì)鍵盤(pán)的處理是通過(guò) keyPress(int keycode)、keyRelease(int keycode) 方法來(lái)實(shí)現(xiàn)的丑念,其中他們需要的參數(shù)是鍵盤(pán)按鍵對(duì)應(yīng)的虛擬鍵碼涡戳,虛擬鍵碼的值可以通過(guò) KeyEvent 類來(lái)獲取。在 Java API 中對(duì)于虛擬鍵碼的解釋如下: 虛擬鍵碼用于報(bào)告按下了鍵盤(pán)上的哪個(gè)鍵脯倚,而不是一次或多次鍵擊組合生成的字符(如 "A" 是由 shift + "a" 生成的)渔彰。 例如,按下 Shift 鍵會(huì)生成 keyCode 為 VK_SHIFT 的 KEY_PRESSED 事件推正,而按下 'a' 鍵將生成 keyCode 為 VK_A 的 KEY_PRESSED 事件恍涂。釋放 'a' 鍵后,會(huì)激發(fā) keyCode 為 VK_A 的 KEY_RELEASED 事件植榕。另外再沧,還會(huì)生成一個(gè) keyChar 值為 'A' 的 KEY_TYPED 事件。 按下和釋放鍵盤(pán)上的鍵會(huì)導(dǎo)致(依次)生成以下鍵事件:

KEY_PRESSED

KEY_TYPED(只在可生成有效 Unicode 字符時(shí)產(chǎn)生尊残。)

KEY_RELEASED

所以當(dāng)測(cè)試中需要用到按下鍵盤(pán) Alt+PrtSc 鍵的時(shí)候炒瘸,只需要執(zhí)行代碼清單 10 中兩個(gè) keyPress() 和一個(gè) keyRelease() 方法即可。

3.當(dāng)這兩個(gè)按鍵執(zhí)行結(jié)束之后寝衫,屏幕上面的活動(dòng)窗口已經(jīng)保存到剪切板中顷扩。如果需要將其保存本地圖片,只需要從剪切板讀取并通過(guò) JPEGImageEncoder 類或者 ImageIO 類將其寫(xiě)入本地即可慰毅。

清單 11. 使用 JPEGImageEncoder 將 Image 對(duì)象保存到本地

/**

*

* @Description: 這個(gè)方法用來(lái)將 Image 對(duì)象保存到本地隘截,主要是通過(guò) JPEGImageEncoder 類來(lái)實(shí)現(xiàn)圖像的

* 保存

* @param image : 要保存的 Image 對(duì)象

* @param filename : 保存圖片的文件名稱

*/

public static void writeImageToFile(Image image, String fileName) {

try {

// 獲取 Image 對(duì)象的寬度和高度, 這里的參數(shù)為 null 表示不需要通知任何觀察者int width = image.getWidth(null);int height = image.getHeight(null);

BufferedImage bi = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

// 通過(guò) BufferedImage 繪制圖像并保存在其對(duì)象中

bi.getGraphics().drawImage(image, 0, 0, null);

// 構(gòu)建圖像名稱及保存路徑

String name = Const.DIRECTORY + fileName + Const.FORMAT;

File dir = new File(Const.DIRECTORY);

if (!dir.exists()) {

dir.mkdir();

}

FileOutputStream ut = new FileOutputStream(name);

@SuppressWarnings("restriction")

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

encoder.encode(bi);

out.flush();

out.close();

} catch (Exception e) {

e.printStackTrace();

}

}

代碼清單 11 是通過(guò) JPEGImageEncoder 類將 Image 對(duì)象寫(xiě)到本地文件流汹胃,注意 Image 對(duì)象是在代碼清單 10 中的如下語(yǔ)句獲取到的:

Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();

Transferable data = sysc.getContents(null);

if (data != null) {

if (data.isDataFlavorSupported(DataFlavor.imageFlavor)) {

Image image = (Image) data

.getTransferData(DataFlavor.imageFlavor);

writeImageToFile(image, fileName);

}

}

清單 12. 使用 ImageIO 將 Image 對(duì)象保存到本地

/**

*

* @Description: 通過(guò)使用 ImageIO 類來(lái)保存 Image 對(duì)象為本地圖片

* @param image : 需要保存的 Image 對(duì)象

* @param filename : 文件名

*/

public static void saveImage(Image image, String fileName) throws Exception {

// 獲取 Image 對(duì)象的高度和寬度

int width = image.getWidth(null);

int height = image.getHeight(null);

BufferedImage bi = new BufferedImage(width, height,

BufferedImage.TYPE_INT_RGB);

Graphics g = bi.getGraphics();

//通過(guò) BufferedImage 繪制圖像并保存在其對(duì)象中

g.drawImage(image, 0, 0, width, height, null);

g.dispose();

File f = new File(fileName);

// 通過(guò) ImageIO 將圖像寫(xiě)入到文件

ImageIO.write(bi, "jpg", f);

}

回頁(yè)首

使用 sendKeys(keysToSend) 批量上傳文件

在 Selenium2.0 之前婶芭,要上傳文件是比較麻煩的一件事件,因?yàn)辄c(diǎn)擊 Upload File 控件會(huì)彈出 Windows 窗口以提供用戶選擇文件统台,但是 Window 窗口已經(jīng)是瀏覽器之外的組件雕擂,所以 Selenium 本身沒(méi)辦法控制, 而必須使用 Java Robot 類來(lái)模擬鍵盤(pán)去操作剪切板實(shí)現(xiàn)上傳功能贱勃,而且及其不穩(wěn)定井赌。 在 Selenium 2.0 之后谤逼,WebDriver 解決了這個(gè)問(wèn)題。前面已經(jīng)談到過(guò)仇穗,直接使用 WebElement 類的 sendKeys(keysToSend) 方法就可以實(shí)現(xiàn)文件上傳了流部。但是如果想批量上傳文件,使用 element.sendKeys(“C:\\test\\upload\\test1.txt”, “C:\\test\\upload\\test2.txt”...) 方法也是不行的纹坐,它能通過(guò)執(zhí)行枝冀,但是實(shí)際上沒(méi)有上傳成功。這時(shí)可以通過(guò)循環(huán)的方式來(lái)實(shí)現(xiàn)文件的批量上傳耘子,代碼清單 13 是我在百度云上面批量上傳文件的測(cè)試果漾。

清單 13. 批量上傳文件

/**

*

* @Description: 在百度云上測(cè)試文件批量上傳功能,主要是通過(guò)循環(huán)的方式去做單一

* 的上傳動(dòng)作 , 登陸過(guò)程已經(jīng)去掉

*/

@Test

public void test_mutilUploadFile() throws Exception {

System.out.println("upload start");

// 獲取上傳控件元素

WebElement uploadButton = driver.findElement(By.name("html5uploader"));

// 構(gòu)建上傳文件路徑谷誓,將需要上傳的文件添加到 CharSequence 數(shù)組

CharSequence[] files = new CharSequence[5];

files[0] = "C:\\test\\test1.txt";

files[1] = "C:\\test\\test2.txt";

files[2] = "C:\\test\\test3.txt";

files[3] = "C:\\test\\test4.txt";

files[4] = "C:\\test\\test5.txt";

// 循環(huán)列出每支需要上傳的文件路徑绒障,做單一上傳動(dòng)作

for(CharSequence file: files){

uploadButton.sendKeys(file);

}

Thread.sleep(2000);

System.out.println("upload end");

}

當(dāng)執(zhí)行結(jié)束后,效果如圖 1捍歪。

圖 1. 批量上傳文件

批量上傳文件

回頁(yè)首

結(jié)束語(yǔ)

在 Selenium WebDriver 中户辱,有了 Actions 類和 Keys 枚舉對(duì)鍵盤(pán)和鼠標(biāo)的操作已經(jīng)做的非常到位,再結(jié)合 Java 本身 Robot糙臼、KeyEvent 等類的使用庐镐,基本上可以滿足工作中遇到的對(duì)鼠標(biāo)鍵盤(pán)操作的應(yīng)用了。

其次要注意的地方是 WebDriver 對(duì)瀏覽器的支持問(wèn)題变逃,Selenium WebDriver 支持的瀏覽器非常廣泛必逆,從 IE、Firefox韧献、Chrome 到 Safari 等瀏覽器末患, WebDriver 都有相對(duì)應(yīng)的實(shí)現(xiàn):InterntExplorerDriver、FirefoxDriver锤窑、ChromeDriver璧针、SafariDriver、AndroidDriver渊啰、 IPhoneDriver探橱、HtmlUnitDriver 等。根據(jù)個(gè)人的經(jīng)驗(yàn)绘证,F(xiàn)irefox 以及 Chrome 瀏覽器對(duì) WebDriver 的支持最好了隧膏,F(xiàn)irefox 搭上 Firebug 以及 Firepath, 在寫(xiě)腳本的過(guò)程中非常方便,而 ChromeDriver 是 Google 公司自己支持與維護(hù)的項(xiàng)目嚷那。HtmlUnitDriver 速度最快胞枕,一個(gè)純 Java 實(shí)現(xiàn)的瀏覽器。IE 比較慢魏宽,而且對(duì)于 Xpath 等支持不是很好腐泻。更多關(guān)于 Selenium WebDriver 的知識(shí)决乎,大家可以從下面的鏈接去訪問(wèn) Selenium 官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市派桩,隨后出現(xiàn)的幾起案子构诚,更是在濱河造成了極大的恐慌,老刑警劉巖铆惑,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件范嘱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡员魏,警方通過(guò)查閱死者的電腦和手機(jī)丑蛤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)撕阎,“玉大人盏阶,你說(shuō)我怎么就攤上這事∥攀椋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵脑慧,是天一觀的道長(zhǎng)魄眉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)闷袒,這世上最難降的妖魔是什么坑律? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮囊骤,結(jié)果婚禮上晃择,老公的妹妹穿的比我還像新娘。我一直安慰自己也物,他們只是感情好宫屠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著滑蚯,像睡著了一般浪蹂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上告材,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天坤次,我揣著相機(jī)與錄音,去河邊找鬼斥赋。 笑死缰猴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疤剑。 我是一名探鬼主播滑绒,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼闷堡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蹬挤?” 一聲冷哼從身側(cè)響起缚窿,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎焰扳,沒(méi)想到半個(gè)月后倦零,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吨悍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年扫茅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片育瓜。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡葫隙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躏仇,到底是詐尸還是另有隱情恋脚,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布焰手,位于F島的核電站糟描,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏书妻。R本人自食惡果不足惜船响,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躲履。 院中可真熱鬧见间,春花似錦、人聲如沸工猜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)篷帅。三九已至荒辕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犹褒,已是汗流浹背抵窒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叠骑,地道東北人李皇。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親掉房。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茧跋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容