Невозможно открыть и закрыть панель уведомлений с фермой устройств AWS

В моем тесте нужно открыть и закрыть панель уведомлений и вернуться к приложению с устройства Android (Moto G4 Android 7 — ферма устройств AWS). Итак, я вызываю следующий метод в своем тесте

androidActivity.openAndCloseNotifications();

куда

public void openAndCloseNotifications() throws InterruptedException{ 
    TimeUnit.SECONDS.sleep(3);
    driver.openNotifications();
    TimeUnit.SECONDS.sleep(3);
    driver.pressKeyCode(AndroidKeyCode.BACK);          
} 

Тест проходит локально с устройством, но когда я запускаю его на ферме устройств AWS, я вижу, что панель уведомлений никогда не открывается, поэтому тест не проходит. На данный момент ферма устройств AWS позволяет взаимодействовать с панелью уведомлений? если нет, то как я могу с этим справиться? Потому что это было бы проблемой для большинства наших тестов. Заранее спасибо!

Это тест, в котором он терпит неудачу, терпит неудачу в строке androidActivity.openAndCloseNotifications();:

    public boolean run() throws Exception {
    MainActivity mainActivity = new MainActivity(driver);
    AndroidActivity androidActivity = new AndroidActivity(driver);
    LoginActivity loginActivity = new LoginActivity(driver);



    try {
    if(device.getCapability("manufacturer")=="Huawei")
    { 
        driver.closeApp();
        driver.launchApp();
        loginActivity.registerApp("whateverhere");
        androidActivity.openAndCloseNotifications();
        mainActivity.verifyAppIsReady();
        assertTrue(mainActivity.check());
        return true;

    }

    else {

        driver.closeApp();
        driver.launchApp();
        loginActivity.registerApp("whateverhere");
        androidActivity.openAndCloseNotifications();
        mainActivity.verifyAppIsReady();
        System.out.println("Verified Stop button is displayed");
        assertTrue(mainActivity.check());
        System.out.println("Verified title is displayed");
        return true;
        }
    }

    catch(Exception e) {
        System.out.println(e);
        return false;
    }

}

Журналы из фермы устройств AWS (локально сбоев нет) .testng.Assert.failNotEquals(Assert.java:494)\n\tat org.testng.Assert.assertTrue(Assert.java:42)\n\tat org.testng.Assert.assertTrue(Assert.java:52)\ n\tat com.OneMeter.Robirdo.TestSequence1.test1(TestSequence1.java:48)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java: 62)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.lang.reflect.Method.invoke(Method.java:498)\n\tat org.testng.internal. MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)\n\tat org.testng.internal.Invoker.invokeMethod(Invoker.java:714)\n\tat org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) \n\tat org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)\n\tat org.tes tng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)\n\tat org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)\n\tat org.testng.TestRunner.privateRun(TestRunner.java: 767)\n\tat org.testng.TestRunner.run(TestRunner.java:617)\n\tat org.testng.SuiteRunner.runTest(SuiteRunner.java:348)\n\tat org.testng.SuiteRunner.runSequentially( SuiteRunner.java:343)\n\tat org.testng.SuiteRunner.privateRun(SuiteRunner.java:305)\n\tat org.testng.SuiteRunner.run(SuiteRunner.java:254)\n\tat org.testng. SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)\n\tat org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)\n\tat org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)\n\tat org.testng.TestNG.runSuitesLocally(TestNG.java:1149)\n\tat org.testng.TestNG.run(TestNG.java:1057)\n\tat org.testng.TestNG.privateMain(TestNG.java:1364) \n\tat org.testng.TestNG.main(TestNG.java:1333)\n\n


person Laura    schedule 04.05.2018    source источник
comment
Не могли бы вы предоставить журналы сервера appium и выходные данные тестов из исходного кода страницы?   -  person jmp    schedule 04.05.2018
comment
Я добавил все, что вы просили. Локально все нормально.   -  person Laura    schedule 04.05.2018
comment
Также должен быть выходной журнал сервера appum из фермы устройств. Не могли бы вы также обновить это с помощью этого журнала? Он покажет, что именно происходит при вызове метода openNotifications.   -  person jmp    schedule 04.05.2018


Ответы (2)


Протестировал это локально с OnePlus 3T, и все прошло успешно.

Возможности:

capabilities.setCapability("app", "C:\\Users\\james\\Desktop\\stackoverflow\\question_50172058_unable-to-open-and-close-notifications-panel-with-aws-device-farm\\testofopenNotifications\\app-debug.apk");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("deviceName", "OnePlus");

Версия Appium: 1.7.1

Вывод сервера Appium:

[info] [HTTP] --> POST /wd/hub/session/51cf9f0e-2106-4e34-b0d5-7df3caebc223/appium/device/open_notifications {}
[debug] [MJSONWP] Calling AppiumDriver.openNotifications() with args: ["51cf9f0e-2106-4e34-b0d5-7df3caebc223"]
[debug] [AndroidBootstrap] Sending command to android: {"cmd":"action","action":"openNotification","params":{}}[debug] [AndroidBootstrap] Received command result from bootstrap
[debug] [MJSONWP] Responding to client with driver.openNotifications() result: true
[info] [HTTP] <-- POST /wd/hub/session/51cf9f0e-2106-4e34-b0d5-7df3caebc223/appium/device/open_notifications 200 328 ms - 76 

После упаковки тестов с помощью сборки и pom из пример тестов с использованием команды mvn clean package -DskipTests=true это результат фермы устройств с использованием Moto G4 Android 7:

Версия сервера Appium: 1.7.1 Использовался пустой объект желаемых возможностей, как описано здесь

успешно и открывает уведомления. Посмотреть видео

Журналы сервера Appium:

2018-05-05 16:55:06:839 - [HTTP] --> POST /wd/hub/session/c70b3b24-b7d6-4c6b-a7e2-d4ff5e91aa22/appium/device/open_notifications {}
2018-05-05 16:55:06:868 - [debug] [MJSONWP] Calling AppiumDriver.openNotifications() with args: ["c70b3b24-b7d6-4c6b-a7e2-d4ff5e91aa22"]
2018-05-05 16:55:06:872 - [debug] [AndroidBootstrap] Sending command to android: {"cmd":"action","action":"openNotification","params":{}}
2018-05-05 16:55:06:888 - [debug] [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got data from client: {"cmd":"action","action":"openNotification","params":{}}
2018-05-05 16:55:06:889 - [debug] [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command of type ACTION
2018-05-05 16:55:06:890 - [debug] [AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command action: openNotification
2018-05-05 16:55:06:891 - [debug] [AndroidBootstrap] Received command result from bootstrap
2018-05-05 16:55:06:893 - [debug] [MJSONWP] Responding to client with driver.openNotifications() result: true
2018-05-05 16:55:06:907 - [HTTP] <-- POST /wd/hub/session/c70b3b24-b7d6-4c6b-a7e2-d4ff5e91aa22/appium/device/open_notifications 200 55 ms - 76 

Вот метод тестирования, который я выполнил:

@Test public void testOpenNotifications(){
        //docs: https://github.com/appium/appium/blob/62700d3b1dc0edd985502cc1279747a782f3ee74/docs/en/commands/device/system/open-notifications.md
        driver.openNotifications();
    }

Я думал, что код, вызывающий сон, может вызывать проблему, но, похоже, он тоже работает. см. видео

код:

@Test public void testOpenNotificationsWithSleep() throws InterruptedException{
        TimeUnit.SECONDS.sleep(3);
        driver.openNotifications();
        TimeUnit.SECONDS.sleep(3);
    }

Не могли бы вы поделиться журналами вашего сервера appium от выполнения в Device Farm? Он покажет ответ от UIAutomator или UIAutomator2, и мы можем перейти оттуда.

Вот мой полный тестовый класс для сравнения:

package Tests;

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

import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;

import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;

public class OpenNotificationsTest{

     /**
     * Make the driver static. This allows it to be created only once
     * and used across all of the test classes.
     */
    public static AndroidDriver<MobileElement> driver;

    /**
     * This method runs before any other method.
     *
     * Appium follows a client - server model:
     * We are setting up our appium client in order to connect to Device Farm's appium server.
     *
     * We do not need to and SHOULD NOT set our own DesiredCapabilities
     * Device Farm creates custom settings at the server level. Setting your own DesiredCapabilities
     * will result in unexpected results and failures.
     *
     * @throws MalformedURLException An exception that occurs when the URL is wrong
     */
    @BeforeSuite
    public void setUpAppium() throws MalformedURLException {

        final String URL_STRING = "http://127.0.0.1:4723/wd/hub";

        URL url = new URL(URL_STRING);

        //Use a empty DesiredCapabilities object fro device farm
        DesiredCapabilities capabilities = new DesiredCapabilities();

        //local capabilities
        capabilities.setCapability("app", "C:\\Users\\james\\Desktop\\stackoverflow\\question_50172058_unable-to-open-and-close-notifications-panel-with-aws-device-farm\\testofopenNotifications\\app-debug.apk");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("deviceName", "OnePlus");

        driver = new AndroidDriver<MobileElement>(url, capabilities);

        //Use a higher value if your mobile elements take time to show up
        driver.manage().timeouts().implicitlyWait(35, TimeUnit.SECONDS);
    }

    @Test public void testOpenNotifications(){
        //docs: https://github.com/appium/appium/blob/62700d3b1dc0edd985502cc1279747a782f3ee74/docs/en/commands/device/system/open-notifications.md
        driver.openNotifications();
    }

    @Test public void testOpenNotificationsWithSleep() throws InterruptedException{
        TimeUnit.SECONDS.sleep(3);
        driver.openNotifications();
        TimeUnit.SECONDS.sleep(3);
    }

    /**
     * Always remember to quit
     */
    @AfterSuite
    public void tearDownAppium() {
        driver.quit();
    }

    /**
     * Restart the app after every test class to go back to the main
     * screen and to reset the behavior
     */
    @AfterClass
    public void restartApp() {
        driver.resetApp();
    }
}

Надеемся услышать от вас скоро.

-Джеймс

person jmp    schedule 05.05.2018
comment
Я только что ответил на ваш пост, все еще немного потерявшись в stackoverflow. - person Laura; 07.05.2018

Кажется, что в ферме устройств нет журналов сервера appium для driver.openNotifications(); (все равно буду их прикреплять).

Используя appium 1.7.2, не уверен, что это проблема, я немного изменил свой код в соответствии с вашим примером, и я все еще могу воспроизвести ту же проблему, никакие уведомления не открываются.

Найдите мой код ниже (обратите внимание, что есть 2 теста, и они выполняются таким образом, чтобы заставить AWS запускать их последовательно, поскольку он игнорирует некоторые аннотации testNG)

public class TestSequence1 {
public int global1;
public DesiredCapabilities capabilities;
public static AndroidDriver<MobileElement> driver;
private Factory1 testfactory;

@BeforeSuite
public void setUp() throws MalformedURLException {
    capabilities = new DesiredCapabilities();
    global1 = 0;
    URL appiumURL = new URL("http://127.0.0.1:4723/wd/hub");
    capabilities.setCapability("appPackage", "MyAppPackage");
    capabilities.setCapability("appActivity", "MyAppActivity");
    capabilities.setCapability("platformName", "Android");
    capabilities.setCapability("deviceName", "MotoG4");
    //capabilities.setCapability("manufacturer", manufacturer);
    //capabilities.setCapability("noReset", true);
    driver = new AndroidDriver<MobileElement>(appiumURL, capabilities);
    testfactory = new Factory1(capabilities, driver);

}

@Test
public void test1() throws Exception {

    Tests.Test test=testfactory.getNextTest();
    boolean returnvalue = test.run();
    assertTrue(returnvalue);

}

@Test
public void test2() throws Exception {

    Tests.Test test=testfactory.getNextTest();
    boolean returnvalue = test.run();
    assertTrue(returnvalue);

}



@AfterSuite
public void tearDown() {
    driver.quit();
}

@AfterClass
public void restartApp() {
    driver.resetApp();
}

куда:

public Factory1(DesiredCapabilities Capabilities, AndroidDriver<MobileElement> Driver) {

    device = Capabilities;
    driver =Driver;
    testNumber=0;

}

public Factory1() {
    // TODO Auto-generated constructor stub
}

public Tests.Test getNextTest() {

    if(testNumber==0)
    {
        test = new BasicTest1(device, driver);
    }
    else if(testNumber==1)
    {
        test = new BasicTest2(device, driver);
    }

    testNumber++;
    return test;
}

и тест, который терпит неудачу, следующий:

public class BasicTest2 extends Tests.Test{
public DesiredCapabilities device;
public AndroidDriver<MobileElement> driver;



public BasicTest2(DesiredCapabilities capabilities, AndroidDriver<MobileElement> driver) {
    device = capabilities;
    this.driver = driver;

}

public boolean run() throws Exception {
    MainActivity mainActivity = new MainActivity(driver);
    AndroidActivity androidActivity = new AndroidActivity(driver);
    LoginActivity loginActivity = new LoginActivity(driver); 

 try{   driver.closeApp();
        driver.launchApp();
        loginActivity.registerApp("password");
        androidActivity.openAndCloseNotifications();
        mainActivity.verifyAppIsReady();
        System.out.println("Verified Stop button is displayed");
        assertTrue(mainActivity.check());
        System.out.println("Verified title is displayed");
        return true;

    }

    catch(Exception e) {
        System.out.println(e);
        return false;
    }

}`

введите здесь описание изображения

Я действительно не знаю, что происходит, поскольку тест проходит локально на нескольких устройствах с разными версиями Android. Спасибо за помощь, Джеймс :)

person Laura    schedule 07.05.2018
comment
Если вы прокрутите страницу вниз, там должна быть ссылка на журналы сервера appium. Если можно, прикрепите их. - person jmp; 07.05.2018