TestNG问题(Selenium Grid)有并行测试吗?

时间:2015-11-02 10:26:44

标签: testng appium selenium-grid

当我在appium(Android)中使用Selenium网格运行并行测试脚本时,我遇到了错误。

默认套件 总测试运行:6,失败:0,跳过:3 配置失败:1,跳过:0

堆栈跟踪消息: org.openqa.selenium.SessionNotCreatedException:无法创建新会话。 (原始错误:请求新会话,但其中一个正在进行中)  我的TestNG xml文件:

<suite name="Default suite" thread-count="4" parallel="tests">
<test name="Nexus">
<Parameters>
<parameter name="platform" value="Nexus"/>
<parameter name="browsername" value="Android"/>
<parameter name="remoteurl" value="http://0.0.0.0:4723/wd/hub"/>
</Parameters>
<classes>
<class name="AppiumTest">
<methods>
<include name="Test1"/>
<include name="Test2"/>
<include name="Test3"/>
</methods>
</class>
</classes>
</test>
<test name="Moto E">
<Parameters>
<parameter name="platform" value="Moto E"/>
<parameter name="browsername" value="Android"/>
<parameter name="remoteurl" value="http://0.0.0.0:4726/wd/hub"/>
</Parameters>
<classes>
<class name="AppiumTest">
<methods>
<include name="Test1"/>
<include name="Test2"/>
<include name="Test3"/>
</methods>
</class>
</classes></suite>

Config.Json文件:

{
"capabilities":
[
{
"browserName":"Nexus",
"version":"5.1.1",
"maxInstances": 1,
"platform":"ANDROID"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://0.0.0.0:4723/wd/hub",
"host":"192.168.50.114",
"port": 4723,
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": 4448,
"hubHost": "192.168.50.114"
}
}

selenium节点的命令: appium --nodeconfig path / to / json file。

测试脚本:

公共类AppiumTest {     //静态RemoteWebDriver驱动程序;

@SuppressWarnings("rawtypes")
public static AndroidDriver driver;


@SuppressWarnings("rawtypes")
@org.testng.annotations.BeforeTest

public static void setUp() throws MalformedURLException{

    DesiredCapabilities capabilities=new DesiredCapabilities();
    capabilities.setCapability("deviceName","Nexus");
    capabilities.setCapability("platformName","Android");

    capabilities.setCapability("appPackage","club.apptu.basic.callrecorder");
    capabilities.setCapability("appActivity","MainActivity");
    driver=new AndroidDriver(new URL("http://0.0.0.0:4723/wd/hub"),capabilities);

    driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);

}

@org.testng.annotations.Test
public void Test1(){
  turnonoff();
  turnonoff();

  //longclick();

 // important();
 // delete();
//  deleterecord();
//  scroll();
//  languagechange();

}
@org.testng.annotations.Test
public void Test2(){

      drawer();
      drawer();

}


@org.testng.annotations.Test
public void Test3(){
  clickonitem();
  play();
  pause();

}

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:3)

所以我用于同样目的的设置是:

  • 2个设备的TestNG.xml文件:

    <?xml version="1.0" encoding="UTF-8"?>
        <suite name="Suite" parallel="tests" thread-count="2">
            <test name="Nexus 7">
                <parameter name="udid"  value="XXXX" />
                <classes>
                    <class name="testNG.TestOne"/>
                </classes>
            </test> <!-- Test -->
            <test name="HTC">
                <parameter name="udid"  value="XXXX" />
                <classes>
                    <class name="testNG.TestOne"/>
                </classes>
            </test> <!-- Test -->
       </suite> <!-- Suite -->
    

这里我传入了每个设备的UDID,没有必要传递任何其他东西,你传递的URL我认为是一个错误,因为你应该将所有AndroidDrivers传递给Selenium Grid Hub URL并使用Hub应将测试分配给正确的设备的功能。

  • 使用以下方法的DriverSetup类:

    public static AndroidDriver getDriver(String udid) throws MalformedURLException{
    
    String SELENIUM_HUB_URL = "XXXX";
    ThreadLocal<AndroidDriver> driver = null;  
    
    DesiredCapabilities capabilities = new DesiredCapabilities();       
    capabilities.setCapability("device", udid);
    capabilities.setCapability("deviceName", udid);
    capabilities.setCapability("udid", udid);
    capabilities.setPlatform(Platform.ANDROID);
    capabilities.setCapability("browserName", "Chrome");    
    
    try {
        driver = new ThreadLocal<AndroidDriver>();
        driver.set(new AndroidDriver(new URL(SELENIUM_HUB_URL),
                capabilities));
    } catch (MalformedURLException e) {
        System.out.println("Tackle Issue with RemoteDriverSetup");
    }
    driver.get().manage().timeouts()
            .pageLoadTimeout(20L, TimeUnit.SECONDS);
    driver.get().manage().timeouts()
            .implicitlyWait(20L, TimeUnit.SECONDS);
    
    return driver.get();
    }
    

您需要更改适合您项目的功能,但我建议您使用UDID作为功能,因为它意味着测试 可以在某个设备上运行。

通过在控制台中键入adb devices找到设备的UDID。

需要在初始化AndroidDriver时使用Selenium Grid Hub URL,如果绕过Hub并将测试直接发送到节点,则会丢失Grid的功能以运行测试平行。

  • 我的TestOne类中的BeforeClass方法:

    @Parameters({"udid"})
    @BeforeClass
    
    public void beforeClass(String udid) throws UnsupportedEncodingException, MalformedURLException, InterruptedException{
    System.out.println("Run started for " + udid);
    driver = DriverSetup.getDriver(udid);
    }
    
  • JSON配置文件

    {
    "capabilities":
    [
    {
    "browserName": "Chrome",
    "deviceName": "XXXX",
    "device": "XXXX",
    "udid":"XXXX",
    "version":"4.2",
    "maxInstances": 5,
    "platform":"ANDROID",
    "platformName": "Android"
    }
    ],
    "configuration":
    {
    "cleanUpCycle":2000,
    "timeout":10000,
    "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", 
    "url":"http://0.0.0.0:4723/wd/hub",
    "maxSession": 5,
    "port": 4723,
    "host": "0.0.0.0",
    "register": true,
    "registerCycle": 5000,
    "hubPort": 4444,
    "hubHost": "localhost"
    }
    }
    

我希望这有助于您解决问题。

答案 1 :(得分:0)

我一直在使用Selenium Grid和Appium并遇到了同样的错误。当设备断开连接时会出现问题,如果您使用真实设备,请尝试断开连接并重新连接USB并重新启动节点。

你可以运行

adb devices 

如果它们被列出,则不应该出现该错误。

如需任何进一步的帮助,请发布测试脚本和网格的JSON配置文件。

希望这有帮助。