使用selenium测试多个文件上传和下载

时间:2015-04-28 01:42:33

标签: java selenium-webdriver testng autoit selenium-grid

我有一个Web应用程序,我需要测试它是否可以模拟同时登录的许多用户的用户行为并执行多个文件上载和下载。上传和下载有多个入口点。我继续使用Selenium来模仿用户行为。集成Java,Selenium,TestNG,AutoIT以及使用Selenium Grid连接到各种VM以进行浏览器兼容性测试。支持的浏览器是Chrome,Firefox,IE 8,9,10,11。除了并行处理windows对话框外,一切正常。我遇到的任何处理窗口对话框的工具都需要窗口在前面。当我运行100个实例时,这是不可能的。请建议。

我正在添加代码段。它们不会运行,因为它们是为Selenium Grid配置的。

这是我的java类:



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

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

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

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

}




如您所见,

调用Runtime.getRuntime()EXEC(" C:\ IE11.exe&#34);

运行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>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

我只是完全绕过Windows对话框,并使用HTTP请求模拟后端的网络流量。

使用像Fiddler2这样的东西来捕获确切的流量,对其进行参数化和瞧瞧。

我在另一篇文章中有一个例子,一秒钟:

复制了问题here上的上一个答案:

Selenium 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 / Response:     LoginRequest     LoginResponse

上面的代码是在C#中,但是Java中有相同的基类可以完成模拟这个功能所需的操作。

所有代码中最重要的部分是MultiPartForm.SendFile方法,这就是魔术发生的地方。

答案 1 :(得分:0)

在尝试了很多东西后,我得出的结论是,通过selenium网格可以并行执行,如果我只在Chrome或Firefox上运行测试,文件上传和下载工作正常。 Selenium不用于性能测试,其他工具(如JMeter)可能更有帮助。