我有一个web应用程序,我需要测试它是否可以模拟多个用户同时登录的用户行为,并执行多个文件上传和下载。上传和下载有多个入口点。我继续使用Selenium来模仿用户行为。集成了Java、Selenium、TestNG、AutoIT,还使用Selenium Grid连接到各种虚拟机进行浏览器兼容性测试。支持的浏览器有Chrome、Firefox、IE 8,9,10,11。除了并行处理windows对话框之外,一切都很好。我遇到的任何处理窗口对话框的工具都需要窗口在前面。当我运行say 100个实例时,这是不可能的。请提出建议。
我正在添加代码片段。它们不会运行,因为它们是为SeleniumGrid配置的。
这是我的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");
运行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这样的东西来捕捉确切的流量,参数化它,瞧。
我在另一篇文章中有一个例子,一秒钟:
复制自上一个问题的答案:
Selenium Web驱动程序并不真正支持这一点。与非浏览器窗口(如本地文件上传对话框和基本身份验证对话框)的交互一直是WebDriver讨论板上的一个热门话题,但在这个话题上几乎没有进展。
过去,我可以通过使用Fiddler2等工具捕获底层请求,然后发送带有指定文件的请求(作为字节blob附加)来解决此问题。
如果您需要来自已验证会话的cookie,WebDriver.magage().getCookies()应该在这方面对您有所帮助。
edit:我在某个地方有这个的代码,我会看看我是否能找到你可以使用的东西。
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所在位置:多部件形式
以及登录请求/响应:登录请求登录响应
上面的代码是用C#编写的,但Java中也有等效的基类,它们将按照您的需要来模仿此功能。
所有这些代码中最重要的部分是MultiPartForm.SendFile方法,这就是魔术发生的地方。
在尝试了很多事情之后,我得出的结论是,通过selenium网格并行执行是可能的,如果我只在Chrome或Firefox上运行测试,文件上传和下载可以很好地工作。Selenium不用于性能测试,其他工具(如JMeter)可能更有用。