Как написать автоматические тесты для действия, отличного от первого действия, в Android Studio для java с использованием Appium

Я собираюсь написать автоматические тесты для своего приложения для Android, используя Appium в Ubuntu Linux, используя Android Studio IDE.

Appium устанавливается и настраивается с помощью Android Studio. У меня есть MainActivity, которая решает, вошел ли пользователь в систему. Переведите пользователя на главный экран, иначе переведите пользователя на WelcomeActivity, в котором есть параметры входа в систему.

Я написал тесты для WelcomeActivity только для нажатия кнопок, и все работает нормально, и тесты проходят после запуска приложения на эмуляторе Appium и Sellinium. Вот код для тестов пользовательского интерфейса WelcomeActivity

public class WelcomeActivityUITests {
WebDriver driver;

@Before
public void setUp() throws MalformedURLException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("deviceName", "Emulator Nexus_4_API_22 Android 5.1.1, API 22");
    capabilities.setCapability(CapabilityType.PLATFORM, "Android");
    capabilities.setCapability(CapabilityType.VERSION, "5.1.1");
    capabilities.setCapability("platformName", "Android");
    capabilities.setCapability("appPackage", "com.my.app");
    capabilities.setCapability("appActivity", ".activities.WelcomeActivity");

    driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}

@Test
public void testEmailLoginButton() {
    By loginButtonId = By.id(Constant.APP_PACKAGE + "email_signin_button");
    RemoteWebElement loginButton = (RemoteWebElement) driver.findElement(loginButtonId);
    loginButton.click();
    driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
}

@After
public void End() {
    driver.quit();
}
}

Этот тестовый класс отлично работает, когда я запускаю из студии Android и тестирую.


Теперь я хочу написать тесты для другой деятельности. Это имя AnotherActivity, и оно появляется после входа в систему.

Код для тестов этого класса:

public class AnotherActivityUITests {
WebDriver driver;

@Before
public void setUp() throws MalformedURLException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("deviceName", "Emulator Nexus_4_API_22 Android 5.1.1, API 22");
    capabilities.setCapability(CapabilityType.PLATFORM, "Android");
    capabilities.setCapability(CapabilityType.VERSION, "5.1.1");
    capabilities.setCapability("platformName", "Android");
    capabilities.setCapability("appPackage", "com.my.app");
    capabilities.setCapability("appActivity", ".activities.AnotherActivity");

    driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}

@Test
public void test() {
    System.out.println("driver.getPageSource(): " + driver.getPageSource());

    driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
}

@After
public void End() {
    driver.quit();
}
}

Теперь, когда я запускаю этот тестовый класс. Выдает ошибку:

org.openqa.selenium.WebDriverException: при обработке команды произошла неизвестная ошибка на стороне сервера. Исходная ошибка: не удается запустить приложение com.my.app. Исходная ошибка: имя действия «.activities.AnotherActivity:», используемое для запуска приложения, не существует или не может быть запущено! Убедитесь, что он существует и является запускаемой активностью (ВНИМАНИЕ: сервер не предоставил никакой информации о трассировке стека)

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

Пожалуйста, помогите мне, как этого добиться. Где я ошибаюсь.


person Sajid Zeb    schedule 19.07.2018    source источник


Ответы (1)


Вместо использования appActivity для каждого действия вы можете использовать MainActivity в качестве appActivity. Затем вам нужно проверить, в какой активности находится приложение, например, welcomeActivity или AnotherActivity.

@Before
public void setUp() throws MalformedURLException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("deviceName", "Emulator Nexus_4_API_22 Android 5.1.1, API 22");
    capabilities.setCapability(CapabilityType.PLATFORM, "Android");
    capabilities.setCapability(CapabilityType.VERSION, "5.1.1");
    capabilities.setCapability("platformName", "Android");
    capabilities.setCapability("appPackage", "com.my.app");

    //put your main activity below-----------------------------------//
    capabilities.setCapability("appActivity", "Your main activity here");
    //---------------------------------------------------------------//

    driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}

затем вы можете проверить, какое действие оно будет выполнять, проверив элемент вашего welcomeActivity или AnotherActivity.

By loginButtonId = By.id(Constant.APP_PACKAGE + "email_signin_button");
RemoteWebElement loginButton = (RemoteWebElement) driver.findElement(loginButtonId);
try{
    if(loginButton.isDisplayed()){
      //your test for welcomePage
    }
}catch(Exception e){
    //your test for Another Activity
}
person Suban Dhyako    schedule 25.07.2018
comment
Спасибо @Suban за ваше время. Я действительно сделал то же самое, что вы просили. Это был единственный способ, которым я думал неделю назад, и я тестирую свой код таким образом. Но для каждого экрана после входа в систему мне нужно проверить. Я делаю одно и то же копирование кода в каждый тестовый файл активности. Есть ли способ, которым мы можем его где-нибудь смодулировать, чтобы получить логин из модуля. или мы можем справиться с этим каким-либо другим способом, иначе нам придется делать одно и то же снова и снова, чтобы проверить что-либо после входа в систему. Спасибо еще раз - person Sajid Zeb; 27.07.2018
comment
вам не нужно каждый раз инициализировать драйвер. Вы можете инициализировать драйвер только один раз и использовать его для каждого экрана. Если вы хотите спроектировать фреймворк appium, изучите Appium Design Framework< /а> . Если вы хотите научиться тестированию на основе данных, изучите на основе данных Appium. тестирование - person Suban Dhyako; 30.07.2018