Параллельное выполнение Appium на двух устройствах - PullRequest
0 голосов
/ 14 марта 2019

Здравствуйте, у меня очень странная проблема с параллельным выполнением Appium для 2 устройств

Что у меня есть:

  1. android device1
  2. android device2
  3. Два узла сетки селена с разными серверами Appium (и я пытаюсь сделать то же самое, но с одним сервером Appium, но с двумя разными системными портами)

Каждый раз, когда я запускаю тесты параллельно, запускаются 2 потокаодно и то же устройство (вместо двух) и мой тест вылетает.

мой код:

testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="BDD Test Suite" verbose="1" parallel="tests" thread-count="2">
    <test name="Honor 8">
        <parameter name="platformName" value="Android"/>
        <parameter name="deviceName" value="HUAWEI1"/>
        <parameter name="platformVersion" value="7"/>
        <parameter name="udid" value="value1"/>
        <parameter name="port" value="4740"/>
        <parameter name="systemPort" value="8201"/>
        <classes>
            <class name="global.APP.starter.TestExample"/>
        </classes>
    </test>
    <test name="Honor 10">
        <parameter name="platformName" value="Android"/>
        <parameter name="deviceName" value="HUAWEI2"/>
        <parameter name="platformVersion" value="9"/>
        <parameter name="udid" value="value2"/>
        <parameter name="port" value="4750"/>
        <parameter name="systemPort" value="8200"/>
        <classes>
            <class name="global.APP.starter.TestExample"/>
        </classes>
    </test>
</suite>

TestExample:

package global.APP.starter;

import global.Drivers;
import org.testng.annotations.*;

public class TestExample {

    public Drivers drv = new Drivers();
    @Parameters({"platformName","deviceName","platformVersion","udid","port","systemPort"})

    @Test
    public void testLoginAndLogout(String platformName, String deviceName, String platformVersion, String udid, String port, String systemPort) throws Exception{
        drv.MultipleDriver(platformName, deviceName, platformVersion, udid, port, systemPort);
    }
    @AfterMethod
    public void treadDown(){
       drv.closeDriver();
    }
}

Drivers.java

import com.codeborne.selenide.WebDriverRunner;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.ios.IOSDriver;
import io.appium.java_client.remote.AndroidMobileCapabilityType;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.Assert;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

public class Drivers {

    public static AppiumDriver<WebElement> driver;
    public static DesiredCapabilities cap;

    public AppiumDriver MultipleDriver(String platformName, String deviceName, 
                                       String platformVersion, String udid, 
                                       String port, String systemPort) throws MalformedURLException {
        cap = new DesiredCapabilities();
        if (platformName.equals("iOS")) {
            cap.setCapability("platformVersion", platformVersion);
            cap.setCapability("bundleId", "com.app.app");
            cap.setCapability("platformName",platformName);
            cap.setCapability("deviceName", deviceName);
            cap.setCapability("udid", udid);
        }
        if (platformName.equals("Android")) {
            cap.setCapability("app", "/Users/usr/Desktop/app/app.apk");
            cap.setCapability("platformName",platformName);
            cap.setCapability("deviceName", deviceName);
            cap.setCapability("udid", udid);
            cap.setCapability(AndroidMobileCapabilityType.SYSTEM_PORT, systemPort);
            cap.setCapability("automationName", "UiAutomator2");
        }


        cap.setCapability("noReset", true);
        cap.setCapability("fullReset", false);
        if (platformName.equals("iOS"))
            driver = new IOSDriver<WebElement>(new URL("http://0.0.0.0:" + port + "/wd/hub"), cap);
        else if(platformName.equals("Android"))
            driver = new AndroidDriver<WebElement>(new URL("http://0.0.0.0:" + port + "/wd/hub"), cap);
        Assert.assertNotNull(driver);

        WebDriverRunner.setWebDriver(driver);

        return driver;
    }

    public static AppiumDriver getDriver() {
        return driver;
    }

    public void closeDriver(){
        driver.quit();
    }
}

Пожалуйста, дайте мне знать, что неправильно делается в моем коде.

Ответы [ 2 ]

1 голос
/ 16 марта 2019

Проблема в вашем Drivers.java классе.

у вас есть следующее

public static AppiumDriver<WebElement> driver;
public static DesiredCapabilities cap;

Таким образом, когда вы выполняете два теста в двух потоках, оба теста пытаются создать экземпляр объекта driver и установить для него один и тот же статический экземпляр. Вот почему оба ваших теста нацелены на одно и то же устройство.

Чтобы это исправить, объявите driver и cap как переменные экземпляра в Drivers.java (т.е. удалите ключевое слово static из их объявления), чтобы они выглядели так

public AppiumDriver<WebElement> driver;
public DesiredCapabilities cap;
0 голосов
/ 19 марта 2019

Параллельное выполнение с Appium Studio проще, чем собственный подход appium. Они также поддерживают облачные устройства. Проверьте эту документацию для параллельного выполнения.

...