2017-01-10 5 views
0

セレングリッド3をセットアップしました。 今、私は1つのハブ+ 2ノードがあります。 (1つのローカルノード、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(); 
    } 
} 

は私が 文字列nodeURLは= "http://10.11.161.249:5555/wd/hub" を持っている私のテストでは、私の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> 

です。 特定のノードに対する私のテストを指していますが、別のノードを指すようにテストを設定する方法、または2ノードで並列実行する方法はありますか?

+0

なぜ異なるノードを指してテストを並行して実行したいのですか?あなたはそれを行うことで何を返すと期待していますか?あなたのテストはグリッドURLを指し、ノードURLは指していないはずです。グリッドは、並列実行または順次実行については無関心です。すべての並列テストを実行するのに十分なノードスロットがある限り、すべてのテストは並行して実行されます。 –

+0

ノード "String nodeURL =" http://10.11.161.249:5555/wd/hub "" を指すのではなく、グリッド "http://10.11.161.249:4444"を指すことができます。すべての使用可能なノードで自動的にテストを実行しますか? – Anton

+0

はい。これがグリッドの主な目的です。それぞれが5つのセッションに対応できる2つのノードを持っているとします。テストが6つの並列実行を終了すると、両方のノードがグリッドによって両方のノードに分散されます(両方のノードが同じ機能をサポートしていると仮定します)。 –

答えて

1

グリッドは、以下の役割を実行するように設計されています

  • (テストは、ブラウザの味/バージョン/プラットフォームの組み合わせの面で何かを要求する)は、所望の性能を考慮すると、グリッドは、実行中に責任があります登録されたノードのリストを介して、それを実際の能力に照合する。
  • (すべてのノードが忙しいとき)ですから、唯一HUBに対して実行するテストを指している必要があり

をキュー内に過剰要求を保持し、その後、ノードに要求を委任してたときに、それは無料となりURLであり、ノードのURLとは一致しません。グリッドは、機能のマッチングに基づいてノードにテストを分散して処理します。

エラー

org.openqa.selenium.WebDriverException:新しい セッションを転送エラーが見つかりません:機能[{browserName = Firefoxの、 バージョン= 55.0.2883.87、プラットフォーム= ANY}]

は基本的にグリッドの形で、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": { 
    } 
} 

この問題を解決するには、いずれかの

  • Firefox用もバージョン番号を含めるようにノード構成JSONファイルを強化し、あなたのsetup()法(または)
  • からラインcaps.setVersion(version);を削除してください。

回答を回答としてまとめます。

+0

何とか削除すると、私のために働かなかったというオプションがありました。 しかし、魅力的なノード構成は私の助けになりました。ちょうどsonファイルにバージョン番号を追加しました。 ありがとうございます! – Anton

関連する問題