2015-04-28 86 views
0

我有一個Web應用程序,我需要測試它是否可以模擬許多用戶同時登錄的用戶行爲,並執行多個文件上傳和下載。上傳和下載有多個入口點。我繼續使用Selenium模仿用戶行爲。集成的Java,Selenium,TestNG,AutoIT以及使用Selenium Grid連接到各種虛擬機以進行瀏覽器兼容性測試。支持的瀏覽器有Chrome,Firefox,IE 8,9,10,11。一切工作正常,除了並行處理窗口對話框。我遇到的任何處理窗口對話框的工具都需要窗口在前面。這是不可能的,當我運行說100個實例。請建議。使用硒測試多個文件上傳和下載

我正在添加代碼片段。他們不會運行,因爲他們被配置爲Selenium Grid。

這裏是我的java類:

public class Test { 
 
\t 
 
\t RemoteWebDriver driver; 
 
\t 
 
    @Test 
 
    public void testDownload() { 
 
\t 
 
\t driver.findElement(By.id("Download")).click(); 
 

 
    Runtime.getRuntime().exec("C:\\IE11.exe"); 
 
\t 
 
    } 
 
    
 
    @BeforeTest 
 
    @Parameters({"browser","version","environment","username","password"}) 
 
    public void launchBrowserAndLogin(String browser, String version, String environment, String username, String password) throws MalformedURLException, InterruptedException { 
 
\t 
 
\t DesiredCapabilities caps = new DesiredCapabilities(); 
 
\t \t 
 
\t if(browser.equalsIgnoreCase("chrome")){ 
 
\t \t System.setProperty("webdriver.chrome.driver", "C://chromedriver.exe"); 
 
\t \t caps = DesiredCapabilities.chrome(); 
 
\t } 
 

 
\t if(browser.equalsIgnoreCase("ie")){ 
 
\t \t System.setProperty("webdriver.ie.driver", "C://IEDriverServer.exe"); 
 
\t \t caps = DesiredCapabilities.internetExplorer(); 
 
\t \t caps.setVersion(version); 
 
\t } 
 
\t \t 
 
\t switch(environment){ 
 
\t \t case "trunk" : baseURL = "http://trunk-url"; break; 
 
\t \t case "prod" : baseURL = "https://prod-url"; break; 
 
\t \t default : baseURL = ""; break; 
 
\t } 
 
\t 
 
\t driver = new RemoteWebDriver(new URL("http://localhost/wd/hub"), caps); 
 
\t driver.navigate().to(baseURL); //go to selected URL 
 
\t driver.manage().window().maximize(); //maximize window 
 
\t Thread.sleep(7000); 
 
\t driver.findElement(By.xpath(".//*[@id='username']")).sendKeys(username); //enter Username 
 
\t driver.findElement(By.xpath(".//*[@id='password']")).sendKeys(password); //enter Password 
 
\t driver.findElement(By.xpath(".//*[@id='login']")).click(); //click on Login 
 
\t Thread.sleep(7000); 
 
\t Assert.assertEquals(driver.getTitle(), "Order History"); 
 
\t 
 
    } 
 

 
    @AfterTest 
 
    public void logoutAndTerminateBrowser() throws InterruptedException { 
 
\t 
 
\t driver.findElement(By.xpath(".//*[@id='login-menu']/a")).click(); //click on Logout 
 
\t Thread.sleep(7000); 
 
\t driver.quit(); 
 
\t 
 
    } 
 

 
}

正如你所看到的,

調用Runtime.getRuntime()EXEC( 「C:\ IE11.exe」) ;

運行AutoIt腳本。在AutoIt腳本只包含:

發送( 「S」!)

這只是將ALT + S(命令在IE下載保存彈出杆)。這是並行執行失敗的地方。

這裏是我的TestNG的XML:

<?xml version="1.0" encoding="UTF-8"?> 
 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
 
<suite name="TestSuite" verbose="2" parallel="tests" thread-count="2"> 
 

 

 
<test name="IE11_1"> 
 
    <parameter name="browser" value="ie"/> <parameter name="version" value="11"/> <parameter name="environment" value="trunk"/> <parameter name="username" value="User1"/> <parameter name="password" value="Pass1"/> 
 
    <classes><class name="Test"/></classes> 
 
</test> 
 

 

 
<test name="IE11_2"> 
 
    <parameter name="browser" value="ie"/> <parameter name="version" value="11"/> <parameter name="environment" value="trunk"/> <parameter name="username" value="User2"/> <parameter name="password" value="Pass2"/> 
 
    <classes><class name="Test"/></classes> 
 
</test>

+0

嗨,歡迎來到SO。請包括一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve),以便其他人可以複製您的問題並幫助您解決問題。 –

回答

0

在嘗試了很多東西之後,我得出的結論是,通過硒網格並行執行是可能的,如果我只在Chrome或Firefox上運行我的測試,文件上載和下載工作正常。 Selenium不適用於性能測試,其他工具(如JMeter)可能會更有幫助。

0

我只想規避Windows對話框乾脆模擬在使用HTTP請求與後端的網絡流量。

使用像Fiddler2來捕獲確切的流量,參數化它,瞧。

我有另一篇文章它的一個例子,一個秒:

從以前的答案抄上問題here

硒的webdriver真的不支持這一點。與非瀏覽器窗口(如本機文件上傳對話框和基本認證對話框)交互一直是WebDriver討論板上討論的主題,但在這個主題上幾乎沒有任何進展。

過去,我已經能夠通過使用諸如Fiddler2之類的工具捕獲底層請求來解決此問題,然後僅將指定文件作爲字節blob發送給該請求。

如果您需要經過身份驗證的會話的cookie,WebDriver.magage()。getCookies()應該在這方面爲您提供幫助。

編輯:我有代碼爲這個工作的地方,我會看看如果我能得到的東西,你可以使用。

public RosterPage UploadRosterFile(String filePath){ 
     Face().Log("Importing Roster..."); 

     LoginRequest login = new LoginRequest(); 
     login.username = Prefs.EmailLogin; 
     login.password = Prefs.PasswordLogin; 
     login.rememberMe = false; 
     login.forward = ""; 
     login.schoolId = ""; 

     //Set up request data 
     String url = "http://www.foo.bar.com" + "/ManageRoster/UploadRoster"; 
     String javaScript = "return $('#seasons li.selected') .attr('data-season-id');"; 
     String seasonId = (String)((IJavaScriptExecutor)Driver().GetBaseDriver()).ExecuteScript(javaScript); 
     javaScript = "return Foo.Bar.data.selectedTeamId;"; 
     String teamId = (String)((IJavaScriptExecutor)Driver().GetBaseDriver()).ExecuteScript(javaScript); 

     //Send Request and parse the response into the new Driver URL 
     MultipartForm form = new MultipartForm(url); 
     form.SetField("teamId", teamId); 
     form.SetField("seasonId", seasonId); 
     form.SendFile(filePath,LoginRequest.sendLoginRequest(login)); 
     String response = form.ResponseText.ToString(); 
     String newURL = StaticBaseTestObjs.RemoveStringSubString("http://www.foo.bar.com" + response.Split('"')[1].Split('"')[0],"amp;"); 

     Face().Log("Navigating to URL: "+ newURL); 
     Driver().GoTo(new Uri(newURL)); 

     return this; 
    } 

其中MultiPartForm是: MultiPartForm

而且LoginRequest /響應: LoginRequest LoginResponse

上面的代碼是在C#中,但也有相當於Java基礎類,會做什麼你需要他們來模仿這個功能。

所有代碼中最重要的部分是MultiPartForm.SendFile方法,這是魔術發生的地方。

+0

嗨@aholt,謝謝你的迴應。我只想確保在我開始挖掘等價的Java類之前,它可以用於並行執行。我沒有時間了! – Freya

+0

我以前用它來並行執行。沒有對話窗口讓腳本在這樣做時被絆倒。重要的是確保你通過像Fiddler2這樣的東西獲取流量,以便你可以模擬它。 – aholt

+0

好的,會給這個試試看。萬分感謝! – Freya