2016-02-18 16 views
3

我想要一些移动自动化测试运行与app和硒网格。一旦我完成所有配置的东西,并添加网格节点,我如何在两个设备中并行运行我的测试?运行自动化测试与app和硒网格只运行在一个设备

这里是我的setUp()

desired_caps = {} 
    desired_caps['platformName'] = 'Android' 
    desired_caps['platformVersion'] = '5.1' 
    desired_caps['deviceName'] = '' 
    desired_caps['app'] = os.path.abspath(os.path.join(os.path.dirname(__file__), 'C:/Users/XXXXX/Desktop/workspace/XXXX/apps/XXXXX.apk')) 
    desired_caps['appPackage'] = 'XXXXXXXX' 
    desired_caps['appActivity'] = '.MainActivity' 
    desired_caps['noReset'] = False 
    self.driver = webdriver.Remote('http://localhost:4444/wd/hub', desired_caps) 
    self.driver.implicitly_wait(15) 

什么它应该是在这种情况下deviceName

如果我留空,这里就是我的了:

C:\Users\XXXXX\Desktop\workspace\XXXXX>java -jar selenium-server-standalone-2.44.0.jar -role hub 

19:16:58.691 INFO - Launching a selenium grid server 

2016-02-18 19:16:59.937:INFO:osjs.Server:jetty-7.x.y-SNAPSHOT 

2016-02-18 19:16:59.968:INFO:osjsh.ContextHandler:startedo.s.j.s.ServletContextHandler{/,null}2016-02-18 19:16:59.995:INFO:osjs.AbstractConnector:[email protected]:4444 

19:49:48.183 INFO - Got a request to create a new session: Capabilities[{app=C:\Users\XXXXX\Desktop\workspace\XXXXX\apps\XXXXX.apk, appPackage=XXXXXXX, appActivity=.MainActivity, noReset=true, platformVersion=5.1, platformName=Android, deviceName=}] 

19:49:48.183 INFO - Available nodes: [host :http://127.0.0.1:4723, host :http://127.0.0.1:4733] 

19:49:48.183 INFO - Trying to create a new session on node host :http://127.0.0.1:4723 

19:49:48.183 INFO - Trying to create a new session on test slot {newCommandTimeout=30, browserName=Android, maxInstances=1, version=5.1,deviceName=0429058934,deviceReadyTimeout=5, platform=ANDROID} 

我只能够运行一个注册节点的网格。我甚至试图用two setup()创建一个脚本,每个设备都有一个脚本,但即使如此,测试只能在同一个设备上运行一个设备。

这里是我的网格控制台:

enter image description here

+0

deviceName是必需的,但是对于Android是任意的(对于iOS,它决定了iOS设备的启动类型)。不过,我注意到你没有设置“avd”功能。您是否启用了启用USB调试的真实设备? – econoMichael

+0

@econoMichael是的,我有两个启用了USB调试的物理电话。 – andrepm

回答

2
I did try to run tests using Grid with Appium server in java, same logic you can adopt for your own language. Here is the explanation: 

    1. This is the same content of node.json file on two node machines: 

    { 
    "capabilities": 
     [ 
      { 
      "version":"4.4.2", 
      "maxInstances": 3, 
      "platformName":"ANDROID" 
      } 
     ], 
    "configuration": 
    { 
     "cleanUpCycle":2000, 
     "timeout":30000, 
     "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", 
     "url":"http://WHERE_APPIUM_RUNNNING:4723/wd/hub", 
     "host": "WHERE_APPIUM_RUNNNING_IP", 
     "port": 4723, 
     "maxSession": 6, 
     "register": true, 
     "registerCycle": 5000, 
     "hubPort": 4444, 
     "hubHost": "WHERE_HUB_RUNNNING_IP" 
    } 
    } 

    2. Downloaded selenium-server-standalone-2.52.0.jar and started as hub on one machine like: 
    java -jar ~/Downloads/selenium-server-standalone-2.52.0.jar -role hub maxInstances=2 maxSessions=2 

    3. Started ONLY appium server on node machines and registered with hub using command as: appium --nodeconfig ~/Desktop/node.json 

    4. Now declare all the common capability in GridTest.java and only deviceName was passed from testNG.xml in order to avoid any hardcoding in code and keeping node.config as generic for all node machines, sample testNG.xml is like: 

    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
    <suite name="Automation" parallel="tests"> 

     <test name="Test1"> 
     <parameter name="deviceName" value="XYZZZZZ" /> 
      <classes> 
       <class name="poc.grid.GridTest" /> 
      </classes> 
     </test> 

     <test name="Test2"> 
     <parameter name="deviceName" value="ZYXXXXX" /> 
      <classes> 
       <class name="poc.grid.GridTest" /> 
      </classes> 
     </test> 

    </suite> 

    5. And I wrote a GridTest.java class like: 

    package poc.grid; 
    import java.net.MalformedURLException; 
    import java.net.URL; 
    import java.util.concurrent.TimeUnit; 

    import org.openqa.selenium.WebDriver; 
    import org.openqa.selenium.remote.DesiredCapabilities; 
    import org.openqa.selenium.remote.RemoteWebDriver; 
    import org.testng.annotations.Parameters; 
    import org.testng.annotations.Test; 


    public class GridTest { 

     @Parameters({"deviceName"}) 
     @Test 
     public void test (String deviceName) throws MalformedURLException, InterruptedException 
     { 
      appium_driver(deviceName); 
     } 

     public void appium_driver(String deviceName) 
     { 
      try 
      { 
       DesiredCapabilities capabilities = new DesiredCapabilities(); 
       capabilities.setCapability("deviceName", deviceName); 
       capabilities.setCapability("platformName", "Android"); 

       if(deviceName.equalsIgnoreCase("4d0025b440ca90d5")){ 
        capabilities.setCapability("app", "/XXXXXX/chocolate.apk"); 
       }else{ 
        capabilities.setCapability("app", "/XXXXXX/chocolate.apk"); 
       } 

       capabilities.setCapability("newCommandTimeout", "120"); 
       WebDriver driver = new RemoteWebDriver(new URL("http://WHERE_HUB_RUNNNING_IP:4444/wd/hub"), capabilities); 

       driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
      } 
      catch(Exception e) 
      { 
       System.out.println(e.getMessage()); 
       e.printStackTrace(); 
      } 
     } 
    } 


6. If you are using eclipse, then Right Click on testNG.xml and select Run As --> TestNg Suite. 

7. Now you can see I've kept a condition only for apk file location because the node machines have different directory, if possible you should choose a similar location which exists in all node machines, else you may have to live with if - else. Hope This Helps !! 
+0

我已经尝试过了,但是谢谢 – andrepm

+0

Heheheh,没有。我的意思是说,在我问这里之前,我尝试了几乎所有的方法:/ – andrepm

1

从我所收集你试图同时运行测试,对不对?

如果是这样,我没有在帖子中看到线程的任何内容,并且没有线程,您的测试将连续运行。

Selenium Grid不对相同类型的资源进行循环连接。它只是分配第一台可用的机器。 I.E.如果测试'A'请求特定的浏览器/平台/设备配置并运行到完成,那么如果测试'B'出现并要求相同的配置,它将得到与测试A相同的机器。合理?

如果你想并行化你的测试,我会建议你检查一下pytest &的xdist插件。这将为你处理所有线程/多进程的东西。有趣的是,即使你写了所有使用unittest的东西,你也不需要重写所有的东西来使用pytest;只需在您现有的代码上点pytest即可。

+0

Huuum,好的。但我怎么说我想运行在两个浏览器/平台/设备上运行?一旦我的测试在第一台可用机器上完成,硒应该在下一台机器上进行我的测试。但是这没有发生。 – andrepm

+0

你的两台机器是否相同?从你的文章中的图片我不能告诉。如果它们相同,则必须将测试分为两个不同的套件。如果你的两台机器不相同,你需要两个不同的测试套件,你需要不同的'desired_capabilities'。 *假设你正在使用pytest和xdist插件。 – willnx

+0

你的意思是像一个跑步者?在几部手机上只能运行一个测试脚本是可能的? – andrepm