0

我使用所述硒網格上3個不同的設備A,B和C.機器A我GWT Web應用程序的跨瀏覽器測試(使用TestNG)正在工作,輪轂以及該節點。而另外兩臺機器B和C被賦予節點的角色。現在如何讓集線器決定在Selenium Grid的並行測試期間執行哪個節點?

,在我面前的任務是讓中心自行決定哪些節點出了三個節點都提供給它,然後它會執行這些特定節點上的測試。對於例如:如果B機關閉或當前不使用則集線器將不執行,並會繼續與機器A和C.

而且測試,其他的任務不是改變代碼爲每特別是Node,因爲根據我在Selenium Grid中的一些知識和經驗,這就是我在這裏所做的。下面提到的是我在啓動集線器後編寫的代碼以及所有這些機器上的節點。

package testNgPackage; 

public class Browser { 
    //ThreadLocal will provide thread-safe tests 
    protected ThreadLocal<RemoteWebDriver> threadLocal = null; 
    @BeforeTest 
    @Parameters("browser") 
    public void setup(String browser) throws MalformedURLException{ 
     String nodeMachine1 = "http://xxx/wd/hub"; 
     String nodeMachine2 = "http://yyy/wd/hub"; 
     String nodeMachine3 = "http://zzz/wd/hub"; 
     if(browser.equalsIgnoreCase("chrome")) { 

      System.setProperty("webdriver.chrome.driver", ".src/Drivers/chromedriver.exe"); 
      DesiredCapabilities capability = null; 
      capability = DesiredCapabilities.chrome(); 
      capability.setPlatform(Platform.VISTA); 
      capability.setBrowserName("chrome"); 
      threadLocal = new ThreadLocal<RemoteWebDriver>(); 
      threadLocal.set(new RemoteWebDriver(new URL(nodeMachine1), capability)); 
     } 
     else if(browser.equalsIgnoreCase("firefox")) { 

      System.setProperty("webdriver.gecko.driver", ".src/Drivers/geckodriver.exe"); 
      DesiredCapabilities capability = null; 
      capability = DesiredCapabilities.firefox(); 
      capability.setPlatform(Platform.WIN10); 
      capability.setBrowserName("firefox"); 
      threadLocal = new ThreadLocal<RemoteWebDriver>(); 
      threadLocal.set(new RemoteWebDriver(new URL(nodeMachine2), capability)); 
     } 

    } 

    public WebDriver getDriver() { 
     return threadLocal.get(); 
    } 


    @AfterTest 
    public void closeBrowser(){ 
     getDriver().close(); 
    } 

} 

要在其上執行測試的代碼擴展了這個Browser類,但是編寫代碼在這裏沒有用處。下面還提到了testng.xml文件。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Parallel test suite" parallel="tests" thread-count="2"> 
    <test name="FirefoxTest"> 
     <parameter name="browser" value="Firefox" /> 
     <classes> 
     <class name="testNgPackage.TestNGClass"/> 
     </classes> 
    </test> 
    <test name="ChromeTest"> 
     <parameter name="browser" value="Chrome" /> 
     <classes> 
     <class name="testNgPackage.TestNGClass"/> 
     </classes> 
    </test> 
</suite> 

我該怎麼做才能優化我的代碼並完成任務?

+0

你所需要的功能,硒已經包括。你爲什麼要實現自己。 – yong

回答

1

當你使用硒電網啓動瀏覽器,你必須通過電網樞紐URL像http://hubIP:hubPort/wd/hub。無需通過所有節點機器的URLS。

所以,請更換線路,

String nodeMachine1 = "http://xxx/wd/hub"; 

與中心網址如下,

String hubMachine = "http://hubIP:hubPort/wd/hub"; 

例如,集線器URL應該是http://xx.xx.xx.xx:4444/wd/hub。默認情況下,硒電網將與港口4444

啓動,並與

threadLocal.set(new RemoteWebDriver(new URL(hubMachine), capability)); 

同時更換線

threadLocal.set(new RemoteWebDriver(new URL(nodeMachine1), capability)); 

,請確保你已經開始在輪轂和正確地註冊的節點。

您無需在代碼在這裏設置的驅動程序屬性,並通過它,而你註冊節點到集線器一樣

>java -Dwebdriver.chrome.driver=<path to driver> -jar <jarname> -role node -hub <hubURL> 
+0

Murthi,我在這裏設置了Driver屬性,以便我的代碼可以是通用的。我的意思是,它可以在任何PC上運行,因爲我已經將我所創建的文件夾中的所有驅動程序複製到項目的src中。我認爲寫下每個節點的驅動程序對我來說都是一項耗時的任務。 – DG4

+0

驅動程序文件應位於瀏覽器啓動或安裝的機器上。意味着,如果您在硒網格上運行,則應將驅動程序文件複製到節點機器。你的方法很適合在本地機器上執行。 – Murthi

+0

Murthi,我是否需要從代碼中刪除瀏覽器功能,並在啓動節點時將它們包含在命令行中?或者像我在這裏提到的那樣將它們寫入代碼中,然後在命令行中只包含驅動程序的路徑? – DG4

相關問題