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

ve7v8dk2  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(493)

我有一个web应用程序,我需要测试它是否可以模拟用户行为的许多用户同时登录,并执行多个文件上传和下载。上传和下载都有多个入口点。我继续使用selenium来模仿用户行为。集成了java、selenium、testng、autoit,还使用selenium网格连接到各种vm进行浏览器兼容性测试。支持的浏览器有chrome、firefox、ie 8、9、10、11。除了并行处理windows对话框外,其他一切都正常。我遇到的任何处理windows对话框的工具都要求窗口在前面。当我运行say 100示例时,这是不可能的。请建议。
我正在添加代码片段。它们不会运行,因为它们是为selenium网格配置的。
下面是我的java类:

  1. public class Test {
  2. RemoteWebDriver driver;
  3. @Test
  4. public void testDownload() {
  5. driver.findElement(By.id("Download")).click();
  6. Runtime.getRuntime().exec("C:\\IE11.exe");
  7. }
  8. @BeforeTest
  9. @Parameters({"browser","version","environment","username","password"})
  10. public void launchBrowserAndLogin(String browser, String version, String environment, String username, String password) throws MalformedURLException, InterruptedException {
  11. DesiredCapabilities caps = new DesiredCapabilities();
  12. if(browser.equalsIgnoreCase("chrome")){
  13. System.setProperty("webdriver.chrome.driver", "C://chromedriver.exe");
  14. caps = DesiredCapabilities.chrome();
  15. }
  16. if(browser.equalsIgnoreCase("ie")){
  17. System.setProperty("webdriver.ie.driver", "C://IEDriverServer.exe");
  18. caps = DesiredCapabilities.internetExplorer();
  19. caps.setVersion(version);
  20. }
  21. switch(environment){
  22. case "trunk" : baseURL = "http://trunk-url"; break;
  23. case "prod" : baseURL = "https://prod-url"; break;
  24. default : baseURL = ""; break;
  25. }
  26. driver = new RemoteWebDriver(new URL("http://localhost/wd/hub"), caps);
  27. driver.navigate().to(baseURL); //go to selected URL
  28. driver.manage().window().maximize(); //maximize window
  29. Thread.sleep(7000);
  30. driver.findElement(By.xpath(".//*[@id='username']")).sendKeys(username); //enter Username
  31. driver.findElement(By.xpath(".//*[@id='password']")).sendKeys(password); //enter Password
  32. driver.findElement(By.xpath(".//*[@id='login']")).click(); //click on Login
  33. Thread.sleep(7000);
  34. Assert.assertEquals(driver.getTitle(), "Order History");
  35. }
  36. @AfterTest
  37. public void logoutAndTerminateBrowser() throws InterruptedException {
  38. driver.findElement(By.xpath(".//*[@id='login-menu']/a")).click(); //click on Logout
  39. Thread.sleep(7000);
  40. driver.quit();
  41. }
  42. }

如你所见
runtime.getruntime().exec(“c:\ie11.exe”);
运行autoit脚本。autoit脚本只包含:
发送(“!s“)
这只是发送alt+s(命令保存在ie下载弹出栏)。这就是并行执行失败的地方。
下面是我的testng xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
  3. <suite name="TestSuite" verbose="2" parallel="tests" thread-count="2">
  4. <test name="IE11_1">
  5. <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"/>
  6. <classes><class name="Test"/></classes>
  7. </test>
  8. <test name="IE11_2">
  9. <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"/>
  10. <classes><class name="Test"/></classes>
  11. </test>
pgky5nke

pgky5nke1#

在尝试了很多东西之后,我得出了这样的结论:通过selenium网格可以并行执行,如果我只在chrome或firefox上运行测试,那么文件上传和下载就可以了。selenium不是用于性能测试的,其他工具(比如jmeter)可能更有用。

wmvff8tz

wmvff8tz2#

我将完全绕过windows对话框,使用http请求模拟后端的网络流量。
使用像fiddler2这样的东西来捕获确切的流量,参数化它,瞧。
我在另一篇文章上有一个例子,一秒钟:

抄袭上一个问题的答案:

selenium webdriver并不真正支持这一点。与非浏览器窗口(如本机文件上载对话框和基本身份验证对话框)交互一直是webdriver讨论板上讨论的一个主题,但在这个主题上几乎没有进展。
在过去,我可以通过使用fiddler2之类的工具捕获底层请求,然后只发送带有作为字节blob附加的指定文件的请求来解决这个问题。
如果您需要来自经过身份验证的会话的cookies,webdriver.magage().getcookies()应该在这方面对您有所帮助。
编辑:我有这个地方的代码,工作,我会看看我是否可以得到一些东西,你可以使用。

  1. public RosterPage UploadRosterFile(String filePath){
  2. Face().Log("Importing Roster...");
  3. LoginRequest login = new LoginRequest();
  4. login.username = Prefs.EmailLogin;
  5. login.password = Prefs.PasswordLogin;
  6. login.rememberMe = false;
  7. login.forward = "";
  8. login.schoolId = "";
  9. //Set up request data
  10. String url = "http://www.foo.bar.com" + "/ManageRoster/UploadRoster";
  11. String javaScript = "return $('#seasons li.selected') .attr('data-season-id');";
  12. String seasonId = (String)((IJavaScriptExecutor)Driver().GetBaseDriver()).ExecuteScript(javaScript);
  13. javaScript = "return Foo.Bar.data.selectedTeamId;";
  14. String teamId = (String)((IJavaScriptExecutor)Driver().GetBaseDriver()).ExecuteScript(javaScript);
  15. //Send Request and parse the response into the new Driver URL
  16. MultipartForm form = new MultipartForm(url);
  17. form.SetField("teamId", teamId);
  18. form.SetField("seasonId", seasonId);
  19. form.SendFile(filePath,LoginRequest.sendLoginRequest(login));
  20. String response = form.ResponseText.ToString();
  21. String newURL = StaticBaseTestObjs.RemoveStringSubString("http://www.foo.bar.com" + response.Split('"')[1].Split('"')[0],"amp;");
  22. Face().Log("Navigating to URL: "+ newURL);
  23. Driver().GoTo(new Uri(newURL));
  24. return this;
  25. }

其中multipartform是:multipartform
和loginrequest/response:loginrequestloginresponse
上面的代码是c#,但是java中有一些等价的基类,它们可以做您需要它们做的事情来模拟这个功能。
所有这些代码中最重要的部分是multipartform.sendfile方法,这就是神奇发生的地方。

展开查看全部

相关问题