簡體   English   中英

如何使用 selenium 或 webdriver 在測試自動化中處理文件上傳

[英]How to deal with file uploading in test automation using selenium or webdriver

我想每個使用Webdriver進行測試自動化的人一定知道它在web開發方面的巨大優勢。

但是,如果文件上傳是 web 流程的一部分,則會出現一個大問題。 它不再是測試自動化。 瀏覽器的安全限制(調用文件選擇)實際上使得自動化測試變得不可能。

Afaik 唯一的選擇是讓 Webdriver 單擊文件上傳按鈕,休眠線程,讓開發人員/測試人員手動 select 文件,然后執行 Z2567A5EC9705EB7AC2C984033E06 流程的 rest。

這個怎么處理,有沒有解決辦法? 因為真的不能這樣。 這沒有任何意義。

這是我所知道的瀏覽器安全限制不適用的唯一情況:

<script language=javascript>   
  function window.onload(){   
          document.all.attachment.focus();   
          var WshShell=new ActiveXObject("WScript.Shell")   
          WshShell.sendKeys("D:\MyFile.doc")
  }   
</script>

Webdriver 在 IE 和 Firefox 中可以很容易地處理這個問題。 這是一個查找元素並輸入元素的簡單案例。

driver = webdriver.Firefox()
element = driver.find_element_by_id("fileUpload")
element.send_keys("myfile.txt")

上面的例子在 Python 但你明白了

如果您使用的是 Java,那么使用 AWT 機器人是一種選擇。 但這不是一個好的選擇,它不是很可靠,而且根本不干凈。 看這里

我使用 HttpClient 並在 Selenium 之外運行了一些測試。 這更可靠,更清潔。

請參閱下面的代碼。 您將需要更多的異常處理和條件來使其適合您的工作。

HttpClient c = new HttpClient();
String url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/j_security_check";
PostMethod post = new PostMethod(url);
post.setParameter("j_username", username);
post.setParameter("j_password", password);
c.executeMethod(post);

url = "http://" + cargoHost + ":" + cargoPort + contextPath + "/myurl.html";
MultipartPostMethod mPost = new MultipartPostMethod(url);
String fileNameWithPath = this.getClass().getClassLoader().getResource(filename).getPath();
File f1 = new File(fileNameWithPath);
mPost.addParameter(elementName, f1);
mPost.addParameter("action", "upload");
mPost.addParameter("ajax", "true");

c.executeMethod(mPost);
mPost.getResponseBodyAsString();

僅當啟用文本框時,在文本框中鍵入的建議才有效。 出於顯而易見的原因,相當多的應用程序迫使您通過文件系統文件瀏覽器訪問 go。 那你怎么辦呢? 我不認為 WebDriver 專家只是想將鍵呈現到 KeyBoard 緩沖區中(在早期的自動化時代,這曾經是“不費吹灰之力”)

===

經過幾天的短暫睡眠、撞頭和拉頭發后,我能夠獲得這里(和其他地方)建議的一些基於機器人的解決方案。

我遇到的問題是使用正確的文件路徑和名稱填充的對話框文本框無法響應使用 VK_ENTER 終止文件名的按鍵/釋放事件,如下所示:

private final static int Enter = KeyEvent.VK_ENTER;
keyboard.keyPress(Enter);
keyboard.keyRelease(Enter);

發生的情況是正確輸入了文件路徑和文件名,但對話框仍然打開 - 我一直希望並祈禱密鑰仿真將終止它並由正在測試的應用程序處理。

有誰知道如何讓這個機器人表現得更好一點?

只是想我會為作者使用 ActiveX 的原始帖子提供一個僅供參考。 另一種解決方法是與桌面 GUI 自動化工具集成來完成這項工作。 例如,谷歌“Selenium AutoIt”。 對於更跨平台的解決方案,請考慮使用 Sikuli 等工具而不是 AutoIt。

當然,這不是考慮 WebDriver 支持通過 SendKeys 在 IE 和 Firefox 上上傳,或者考慮其他瀏覽器在該方法不起作用的情況下。

如果您正在使用網格,則可以打開測試文件的文件夾以供共享。

這樣,您可以 select 上傳輸入字段並將其值設置為 \\pc-name\myTestFiles

如果不是,則應在每個系統上使用 go 與本地文件。

在解決這個問題太多小時后,我想與社區分享 Firefox 7.0.1 似乎與上面提到的 FirefoxDriver sendKeys() 實現存在問題(至少我無法讓它工作在我的 Windows 7 x64 盒子上),我沒有找到解決方法,但更新到 Firefox 8.0.1 似乎已經解決了這個問題。 對於那些想知道的人,也可以使用 Selenium RC 來解決這個問題(盡管您需要考慮所有目標操作系統以及與其文件選擇對話框交互所需的本機按鍵)。 希望我必須解決的問題可以為其他人節省一些時間,總結如下:

https://gist.github.com/1511360

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM