t.me/atinfo_chat Telegram группа по автоматизации тестирования

testNG Не удается запустить следующий тест

appium
java
testng
mobile
Теги: #<Tag:0x00007f9c4ca41560> #<Tag:0x00007f9c4ca41420> #<Tag:0x00007f9c4ca412b8> #<Tag:0x00007f9c4ca41178>

(Олег) #1

Всем привет. Не так давно начал осваивать автотестирование. Использую apium+testNG+real device

У меня есть два зачатка теста. Запускаю их через testNG.xml.

Столкнулся с такой проблемой:

  • проходит один тест,
  • драйвер закрывается и второй тест заваливается с ошибкой
    java.lang.IllegalArgumentException: Can not set io.appium.java_client.MobileElement field com.XXX.tests.pageObjects.DemoPage.demoMode to
    org.openqa.selenium.remote.RemoteWebElement$$EnhancerByCGLIB$$d27c0df4.
  • По отдельности тесты работают корректно. Приоритеты что-то прям совсем не работают…или они только внутри класса работают?

Подскажите пожалуйста, что я делаю не так?

Это мой базовый тест


public class BaseTest {
    private static final String APPIUM_SERVER_URL = "http://localhost:4723/wd/hub";
    public AndroidDriver<org.openqa.selenium.WebElement> driver;

    @BeforeTest
    public void setUp() throws MalformedURLException {
        DesiredCapabilities capabilities = new DesiredCapabilities();
МОИ КАПАБИЛИТИЗ
        driver = new AndroidDriver<>(new URL(APPIUM_SERVER_URL), capabilities);
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
}

    @Test
    public void Start() {
        System.out.println("start");
    }

    @AfterTest
    public void teardown() {
        driver.quit();
    }
}

Первый тест

public class LoginTest extends BaseTest {

    @Test(priority = 2)

    public void Login() {
        LoginPage login = new LoginPage(driver);
        login.clickStartUsing();
        driver.navigate().back();
    }
}

Второй тест

public class DemoHouseTest extends BaseTest {

    @Test(priority = 1)

    public void DemoTest() {
        DemoPage demo = new DemoPage(driver);
        demo.clickDemo();
        driver.navigate().back();
    }
}

И вот что у меня в PO

public class DemoPage {

    public DemoPage(AppiumDriver<WebElement> driver) {
        PageFactory.initElements(new AppiumFieldDecorator(driver), this);
    }

    @AndroidFindBy(id = "com.XXX.client:id/btn_demo")
    private MobileElement demoMode;

    public void clickDemo() {
        demoMode.click();
    }
}

(Vasiliy Rakshin) #2

Вроде как надо заменить на this.driver. + добавить к странице:
private AppiumDriver<MobileElement> driver;


(Степан Корчевский) #3

приоритеты устанавливают порядок запуска тестовых методов внутри класса, а у вас по одному тестовому методу в классе - то есть они бесполезны.


(Степан Корчевский) #4

а hub поддерживает 2 и более нод? хотелось бы увидеть testNG.xml


(Олег) #5
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Regression Test Suite">
    <test name="Regression Tests">
        <classes>
            <class name="com.XXX.tests.tests.LoginTest" />
            <class name="com.XXX.tests.tests.DemoHouseTest" />
        </classes>
    </test>
</suite>


(Олег) #6

я чуть поправлюсь с описанием проблемы… тест второй падает на этапе запуска первого теста,а конкретно на этапе инициализации драйвера


(Vladislav Sobol) #7

Попробуйте поменять на @BeforeClass.

(Олег) #8

Спасибо помогло! Я пробовал этот вариант и не получалось, потому что у меня еще тест был написан насколько помню в BaseTest.

А можно сделать так, чтобы драйвер не закрывался пока все тесты не пройдут? Перед каждым тестом прилично времени сжирается на инициализацию драйвера(

У меня получилось только таким образом

public class LoginTest {

       LoginTest(AndroidDriver<WebElement> driver) {
       LoginPage login = new LoginPage(driver);

и в BaseTest добавил

    @Test()
    public void LoginTest() {
        new LoginTest(driver);
    }

Но так не совсем удобно… Через testNg.xml все же проще будет выбирать тесты необходимые для запуска.


(Vladislav Sobol) #9

Честно говоря незнаю насколько это хорошая практика, все тесты гонять с одним инстансом драйвера и закрывать его аж после всех тестов. У нас на проекте мы драйвер стартуем перед каждым тестом, после каждого теста соответственно закрываем. Чтобы он стартовал побыстрее нужно правильно задать капабилитис, как минимум убрать фулл ресет. Ну или если все же если есть желание, так сказать, извратиться то задайте драйвер в @BeforeSuite и закрывайте в @AfterSuite, ну и наверное его тогда static прийдется сделать чтобы так работало, что тоже не есть гуд т.к static не дружит с параллельностью.