2015-04-28 5 views
0

У меня есть веб-приложение, которое мне нужно проверить, может ли оно моделировать поведение пользователя для многих пользователей, которые вошли в систему одновременно и выполняют несколько загрузок файлов и загрузок. Существует множество точек входа для загрузки, а также для загрузки. Я продолжил использовать Selenium для имитации поведения пользователей. Интегрированные Java, Selenium, TestNG, AutoIT, а также использование Selenium Grid для подключения к различным виртуальным машинам для тестирования совместимости браузеров. Браузеры поддерживаются Chrome, Firefox, IE 8,9,10,11. Все работает отлично, за исключением обработки диалоговых окон Windows параллельно. Любой инструмент, с которым я сталкивался, который обрабатывает диалоговые окна Windows, требует, чтобы окно было спереди. Это невозможно, когда я запускаю 100 экземпляров. Пожалуйста, предложите.Использование селена для тестирования загрузки и скачивания нескольких файлов

Я добавляю фрагменты кода. Они не будут работать, потому что они настроены для селеновой сетки.

Вот мой 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 просто содержит:

Send ("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

Я бы просто обойти диалоговые окна вообще и моделировать сетевой трафик на интерфейсе с помощью HTTP-запросов.

Используйте что-то вроде Fiddler2, чтобы зафиксировать точный трафик, параметризовать его и вуаля.

У меня есть пример его на другую должность, один сек:

Скопировано из предыдущего ответа на вопрос here:

Селен WebDriver действительно не поддерживает это. Взаимодействие с окнами без браузера (например, диалоговые окна загрузки файлов и основные диалоговые окна) было предметом много дискуссий на доске объявлений WebDriver, но прогресс по этому вопросу практически не был достигнут.

В прошлом я мог обойти это, взяв базовый запрос с помощью инструмента, такого как Fiddler2, а затем просто отправил запрос с указанным файлом, прикрепленным в виде байтового блоба.

Если вам нужны куки-файлы из аутентифицированного сеанса, 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

Смежные вопросы