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

Using selenium for testing multiple file upload and download

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

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

这是我的 java class:

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");

运行s 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>

我会完全绕过 windows 对话框并使用 HTTP 请求在后端模拟网络流量。

使用 Fiddler2 之类的东西来捕获准确的流量,对其进行参数化,瞧。

我在另一个 post 上有一个例子,等一下:

复制自之前对问题 here 的回答:

Selenium Webdriver 并不真正支持这一点。与非浏览器交互 windows(例如本机文件上传对话框和基本身份验证对话框)一直是 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 方法,这是神奇的地方。

在尝试了很多事情之后,我得出的结论是可以通过 selenium 网格并行执行,如果我 运行 我的测试只在 Chrome 或 Firefox。 Selenium 不用于性能测试,其他工具(如 JMeter)可能更有帮助。