2015-04-28 59 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