2017-01-10 147 views
0

我有一個硒Grid 3設置。 而現在我有1個集線器+2個節點。 (1個本地節點,一個外部節點)。 當我運行我的測試它在本地節點上執行它(打開3瀏覽器)。如何在Selenium Grid中執行50/50並行測試

如何以及在哪裏設置測試執行?如果我想在2個瀏覽器上運行所有測試,或者如果我想在2個瀏覽器上運行50/50測試? 我將附上我現有的代碼如下。

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」; 哪些指向特定節點的測試,但我如何設置測試指向不同節點,還是在2個節點上並行運行?

+0

你爲什麼要指向不同的節點並運行測試?你通過這樣做期待什麼作爲回報?您的測試應該指向網格網址,而不是節點網址。網格對並行或順序執行是不可知的。只要有足夠的節點插槽可用於運行所有並行測試,所有測試都將並行執行。 –

+0

你的意思是,如果不是指向節點「String nodeURL =」http://10.11.161.249:5555/wd/hub「」 我可以指向網格「http://10.11.161.249:4444」,它會在所有可用節點上自動運行測試? – Anton

+0

是的。這是電網的主要目的。假設您有兩個節點,每個節點可以提供5個會話,那麼如果您的測試啓動了6次並行執行,那麼負載將通過網格分佈在兩個節點上(假設兩個節點都具有相同的支持功能) –

回答

1

網格被設計來執行以下角色:

  • 鑑於所要求的功能(一些測試在瀏覽器中的味道/版本/平臺組合來詢問),網格負責運行通過註冊節點列表,並將其與實際能力進行匹配。
  • 保持在隊列中多餘的請求,然後委託請求一個節點,當它成爲免費的(當所有的節點都忙)

所以,你應該指向您的測試,以緊貼輪轂只能運行URL而不是針對節點的URL。網格將負責根據能力匹配將測試分發給節點。

誤差

org.openqa.selenium.WebDriverException:錯誤轉發新 會話不能找到:能力[{browserName =火狐, 版本= 55.0.2883.87,平臺= ANY}]

基本上是網格告訴你的方式,你需要一個firefox瀏覽器的風格,其版本爲在任何平臺上運行,但網格沒有任何註冊到它的節點具有此功能。

這是對的,因爲您的節點配置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": { 
    } 
} 

要解決這個問題,無論是

  • 請從setup()方法(或)刪除行caps.setVersion(version);
  • 增強您的節點配置JSON文件,包括版本號也爲Firefox瀏覽器。

鞏固我的回答作爲答案。

+0

選項與刪除莫名其妙不適合我,也許我錯過了那裏的東西。 但迷人的節點配置幫助了我,我剛剛在兒子文件中添加了版本號,並且看起來好像運行正常。 謝謝! – Anton

相關問題