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

相关问题