iOS - параллельное выполнение продолжается только на одном из двух устройств через некоторое время - PullRequest
1 голос
/ 26 марта 2019

Я хочу выполнить мои тестовые примеры appium параллельно на двух разных устройствах iOS. Проблема, с которой я сталкиваюсь, заключается в том, что после того, как несколько тестовых примеров выполняются параллельно, через некоторое время одно устройство зависает, и только другое устройство продолжает выполнять тестовые наборы, предназначенные как для этого устройства, так и для другого, и продолжает давать сбой.

Я создаю 2 экземпляра сервера appium и передаю параметры устройства через файл testng.xml.

Любая помощь будет оценена.

Testng.xml

`
       <?xml version="1.0" encoding="UTF-8"?>
       <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
       <suite name="Default Suite" verbose="3" parallel="tests" thread- 
        count="2">
       <test name="Rapporter-1" preserve-order="true">
       <!--<parameter name="testEnv" value="iOS Test Env"/>-->
       <parameter name="platform" value="iOS 12.1.3"/>
       <parameter name="udid" value="deviceudid"/>
       <parameter name="deviceName" value="iPhone 8 Plus"/>
       <parameter name="wdaLocalPort" value="8100"/>
       <parameter name="url" value="http://0.0.0.0:4723/wd/hub"/>
       <classes>
           <!--Test classes with single login credentials-->
           <class name="com.rapporter.test.AddEditDeleteCommentTest"/>
           <!--other classes listed-->
       </classes>
       </test>
       <test name="Rapporter-2" preserve-order="true">
       <parameter name="platform" value="iOS 12.1.2"/>
       <parameter name="udid" value="device2udid"/>
       <parameter name="deviceName" value="iPhone XS Max"/>
       <parameter name="wdaLocalPort" value="8101"/>
       <parameter name="url" value="http://0.0.0.0:4734/wd/hub"/>
       <classes>
               <class name="com.rapporter.test.SearchTest"/>
               <!--other classes listed-->
           </classes>
       </test>
       <!-- Rapporter -->
       </suite> <!-- Default Suite -->
`

Первые две функции, общие для всех тестируемых классов

`
       @BeforeTest(alwaysRun = true)
       @Parameters({"platform", "udid", "deviceName", 
       "wdaLocalPort","url"})
       public void setup1(String platform, String udid, String 
       deviceName, 
       String wdaLocalPort,String url) throws Exception {

       File file = new File("./app/App1.ipa");
       String absolutePath = file.getAbsolutePath();
       String[] platformInfo = platform.split(" ");
       DesiredCapabilities capabilities = new DesiredCapabilities();
       capabilities.setCapability(MobileCapabilityType.AUTOMATION_NAME, 
       "XCUITest");
       capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, 
       platformInfo[0]);
       capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, 
       platformInfo[1]);
       capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, 
       deviceName);
       capabilities.setCapability(MobileCapabilityType.UDID, udid);
       capabilities.setCapability("wdaLocalPort", wdaLocalPort);
       capabilities.setCapability("app", absolutePath);
       capabilities.setCapability("url",url);
       capabilities.setCapability(MobileCapabilityType.ORIENTATION, 
       "PORTRAIT");
       capabilities.setCapability(MobileCapabilityType.NO_RESET, false);
       try {
           driver = new IOSDriver(new URL(url),capabilities);
       } catch (Exception e) {
           System.out.println("Failed to setup Appium server");
       }
       }


    @Parameters({"platform", "udid", "deviceName", "wdaLocalPort","url"})
    @Test(priority = 1,
           description = "GIVEN I am a Dubber app user <br/>"
                   + "WHEN I launch the app and enter my login 
    credentials <br/> "
                   + "THEN I should be successfully logged in and should 
    be navigated to Home screen")

    public void loginWithValidCredentials(String platform, String udid, 
    String deviceName, String wdaLocalPort,String url) throws 
    InterruptedException, ParseException, java.text.ParseException, 
    IOException
    {
        String username = "appium" + apiMethods.randomCharacters(5) + 
    "@playback.com";
       String firstname = apiMethods.randomCharacters(6);
       apiMethods.postUserTrial(username, 
    firstname,platform,udid,deviceName,wdaLocalPort,url); //This goes to 
    Chrome browser and creates a new user
       UtilityClass.loginWithValidCredentialsTrial(username, 
    Constants.Env.PASSWORD,platform,udid,deviceName,wdaLocalPort,url);
    }
`

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

Следующие коды используются для проверки различных элементов пользовательского интерфейса. Например:

`
       driver.findElementByAccessibilityId(LoginPage.appIcon);
       driver.findElementByAccessibilityId(uname).clear();
       driver.findElementByAccessibilityId(uname).sendKeys(username);
       driver.findElementByAccessibilityId(psswd).clear();
       driver.findElementByAccessibilityId(psswd).sendKeys(password);
       driver.findElementByAccessibilityId(login).click();
       Thread.sleep(5000);
       if (AppiumSupportLibrary.isElementExists(driver, skipButton, 3, 
       2000)) {
       AppiumSupportLibrary.tap(driver, skipButton, 5, 2000);
       }
       else
       System.out.println("TouchId setup screen not found");
       Thread.sleep(5000);
       if (AppiumSupportLibrary.isElementExists(driver, skipButton, 3, 
        2000)) {
       AppiumSupportLibrary.tap(driver, skipButton, 5, 2000);
       }
       else
       System.out.println("OnboardScreen Tutorial not found");
`

1 Ответ

0 голосов
/ 04 апреля 2019

Я решил проблему, с которой столкнулся. Драйвер, на который я ссылался во фрагменте кода

`
       driver.findElementByAccessibilityId(LoginPage.appIcon);
       driver.findElementByAccessibilityId(uname).clear();
       driver.findElementByAccessibilityId(uname).sendKeys(username);
       driver.findElementByAccessibilityId(psswd).clear();
       driver.findElementByAccessibilityId(psswd).sendKeys(password);
       driver.findElementByAccessibilityId(login).click();
       Thread.sleep(5000);
       if (AppiumSupportLibrary.isElementExists(driver, skipButton, 3, 
       2000)) {
       AppiumSupportLibrary.tap(driver, skipButton, 5, 2000);
       }
       else
       System.out.println("TouchId setup screen not found");
       Thread.sleep(5000);
       if (AppiumSupportLibrary.isElementExists(driver, skipButton, 3, 
        2000)) {
       AppiumSupportLibrary.tap(driver, skipButton, 5, 2000);
       }
       else
       System.out.println("OnboardScreen Tutorial not found");
`

был объявлен статическим, поэтому я столкнулся с проблемой параллельного выполнения контрольных примеров на двух устройствах. Объявление драйвера глобально и получение его экземпляра перед тестом работало нормально.

`
@BeforeTest(alwaysRun = true)
@Parameters({"platform", "udid", "deviceName", "wdaLocalPort","url"})
public void setup1(String platform, String udid, String deviceName, String wdaLocalPort,String url) throws Exception {

driver = GetDTrial.getInstance1().setDriverTrial(platform, udid, deviceName, wdaLocalPort, url);
    homePage = new HomePage(driver);

}
`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...