2017-01-10 5 views
0

У меня есть сетка 3 селена. И прямо сейчас у меня есть 1 хаб + 2 узла. (1 локальный узел, один внешний узел). Когда я запускаю свой тест, он выполняет его на локальном узле (открывается 3 браузера).Как выполнить тесты 50/50 параллельно в селеновой сетке

Как и где я должен настроить выполнение теста? Если я хочу запустить все тесты в двух браузерах или если я хочу запустить 50/50 тестов на 2 браузерах? Я приложу свой существующий код ниже.

package com.ParallelTest; 


     import org.openqa.selenium.chrome.ChromeDriver; 
     import org.testng.annotations.BeforeClass; 
     import org.testng.annotations.Parameters; 

     import java.io.File; 
     import java.net.MalformedURLException; 
     import java.net.URL; 
     import java.util.concurrent.TimeUnit; 

     import org.openqa.selenium.Platform; 
     import org.openqa.selenium.WebDriver; 
     import org.openqa.selenium.remote.DesiredCapabilities; 
     import org.openqa.selenium.remote.RemoteWebDriver; 
     import org.testng.annotations.AfterClass; 

public class Framework { 
    protected WebDriver driver; 

    @Parameters({ "platform","browser","version", "url" }) 
    @BeforeClass(alwaysRun=true) 
    public void setup(String platform, String browser, String 
      version, String url) throws MalformedURLException 
    { 
     driver = getDriverInstance(platform, browser, version, url); 

    } 

    public static WebDriver getDriverInstance(String platform, String browser, String version, String url) 
      throws MalformedURLException { 
     String nodeURL = null; 

*// IS this should be a Node or Hub path? Because right now it`s a node path. But if i want to use 2 different nodes? How i can implement it????* 
     String nodeURL = "http://10.11.161.249:5555/wd/hub"; 
     WebDriver driver = null; 
     DesiredCapabilities caps = new DesiredCapabilities(); 

     // Platforms 
     if (platform.equalsIgnoreCase("Windows")) { 
      caps.setPlatform(Platform.WINDOWS); 


     } 
     if (platform.equalsIgnoreCase("MAC")) { 
      caps.setPlatform(Platform.MAC); 

     } 
     // Browsers 
     if (browser.equalsIgnoreCase("chrome")) { 
      caps = DesiredCapabilities.chrome(); 
      System.setProperty("webdriver.chrome.driver", "/Users/antonfiliptsov/Desktop/Grid/ChromeDriver/chromedriver"); 
     } 
     if (browser.equalsIgnoreCase("firefox")) { 
      caps = DesiredCapabilities.firefox(); 
      System.setProperty("webdriver.gecko.driver","/Users/antonfiliptsov/Desktop/Grid/Firefox/geckodriver"); 

     } 
     if (browser.equalsIgnoreCase("safari")){ 
      caps = DesiredCapabilities.safari(); 
     } 

     // Version 
     caps.setVersion(version); 
     driver = new RemoteWebDriver(new URL(nodeURL), caps); 
     // Maximize the browser's window 
     // driver.manage().window().maximize(); 
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
     // Open the Application 
     driver.get(url); 
     return driver; 
    } 

    @AfterClass 
    public void afterClass() { 
     driver.quit(); 
    } 
} 

Вот мой TestNG Файл

<suite name="TestSuite" parallel="tests"> 
    <test name="FireFox Test"> 
     <parameters> 
      <parameter name="platform" value="MAC" /> 
      <parameter name="browser" value="firefox" /> 
      <parameter name="version" value="50.1.0" /> 
      <parameter name="url" value="https://google.com" /> 
     </parameters> 
     <classes> 
      <class name="com.test"> 
      </class> 
     </classes> 
    </test> 
    <test name="Chrome Test"> 
     <parameters> 
      <parameter name="platform" value="MAC" /> 
      <parameter name="browser" value="chrome" /> 
      <parameter name="version" value="55.0.2883.87" /> 
      <parameter name="url" value="https://google.com" /> 
     </parameters> 
     <classes> 
      <class name="com.test"> 
      </class> 
     </classes> 
    </test> 
<test name="Chrome Test 1"> 
<parameters> 
    <parameter name="platform" value="MAC" /> 
    <parameter name="browser" value="chrome" /> 
    <parameter name="version" value="55.0.2883.87" /> 
    <parameter name="url" value="https://google.com" /> 
</parameters> 
<classes> 
    <class name="com.test"> 
    </class> 
</classes> 
</test> 

</suite> 

В моем тесте я есть Строка nodeURL = "http://10.11.161.249:5555/wd/hub"; Какая точка моего теста для конкретного узла, но как я могу настроить тест, указывающий на другой узел, или работающий параллельно на двух узлах?

+0

Почему вы хотите указывать на разные узлы и параллельно выполнять тесты?Что вы ожидаете от этого? Ваш тест должен указывать на URL-адрес Grid, а не на URL-адрес узла. Сетка агностически связана с параллельным или последовательным исполнением. До тех пор, пока для выполнения всех ваших параллельных тестов достаточно узловых слотов, все тесты будут выполняться параллельно. –

+0

Вы имеете в виду, что если вместо указания на узел "String nodeURL =" http://10.11.161.249:5555/wd/hub "" Я могу указать на сетку "http://10.11.161.249:4444", и это будет запустить тест на все доступные узлы автоматически ???? – Anton

+0

Да. Это основная цель сетки. Допустим, у вас есть два узла, каждый из которых может обслуживать 5 сеансов, а затем, если ваши тесты начнут отходить от шести параллельных исполнений, загрузка будет распределена по обеим узлам сеткой (при условии, что оба узла имеют одинаковые поддерживаемые возможности). –

ответ

1

Сетка предназначена для выполнения ниже роли:

  • Учитывая желаемая возможность (то, что тест просит с точки зрения браузера ароматизатора/версия/комбинации платформы), сетка отвечает за ход через список зарегистрированных узлов и сопоставить его с фактической возможностью.
  • Удержание избыточных запросов в очереди, а затем передать запрос на узел, как и когда он становится свободным (когда все узлы заняты)

Таким образом, вы должны указывать свои тесты, чтобы работать только против HUB URL, а не URL-адрес узла. Grid позаботится о распределении тестов с узлами на основе соответствия возможностей.

Ошибки

org.openqa.selenium.WebDriverException: Ошибка переадресации новой сессии не может найти: Capabilities [{browserName = FireFox, версии = 55.0.2883.87, платформа = ANY}]

- это, в основном, способ Grid сообщить вам, что вы запросили урагальный код firefox с его версией 55.0.2883.87, работающей на любой платформе, но в сетке нет ни одного зарегистрированного узла, обладающего этой возможностью.

Это правильно, потому что ваша конфигурация узла JSON не указывает версию для firefox.

{ 
    "capabilities": [ 
     { 
      "browserName": "firefox", 
      "maxInstances": 5, 
      "seleniumProtocol": "WebDriver" 
     }, 
     { 
      "browserName": "chrome", 
      "maxInstances": 5, 
      "seleniumProtocol": "WebDriver" 
     }, 
     { 
      "browserName": "safari", 
      "maxInstances": 1, 
      "seleniumProtocol": "WebDriver" 
     } 
    ], 
    "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", 
    "maxSession": 5, 
    "port": 5555, 
    "register": true, 
    "registerCycle": 5000, 
    "hub": "http://192.168.1.115:4444", 
    "nodeStatusCheckTimeout": 5000, 
    "nodePolling": 5000, 
    "role": "node", 
    "unregisterIfStillDownAfter": 60000, 
    "downPollingLimit": 2, 
    "debug": false, 
    "servlets": [ 

    ], 
    "withoutServlets": [ 

    ], 
    "custom": { 
    } 
} 

Чтобы устранить эту проблему, либо

  • удалите строку caps.setVersion(version); из вашего setup() метода (или)
  • Повысьте узел файл конфигурации в формате JSON, чтобы включить номер версии также для Firefox.

Консолидация ответов в ответе.

+0

Опция с удалением как-то не сработала для меня, возможно, я что-то пропустил. Но настройка чарующего узла помогла мне, я просто добавил номера версий в файле son и выглядел так, как будто работает нормально. Спасибо! – Anton