Ошибка при запуске теста организованного согласно Page Object Model (Mobile)

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

Ошибка:

java.lang.NoSuchMethodError: org.openqa.selenium.support.ui.FluentWait.until(Lcom/google/common/base/Function;)Ljava/lang/Object;

at io.appium.java_client.pagefactory.AppiumElementLocator.waitFor(AppiumElementLocator.java:88)
at io.appium.java_client.pagefactory.AppiumElementLocator.findElement(AppiumElementLocator.java:103)
at io.appium.java_client.pagefactory.interceptors.InterceptorOfASingleElement.intercept(InterceptorOfASingleElement.java:57)
at io.appium.java_client.android.AndroidElement$$EnhancerByCGLIB$$c0b591f0.click(<generated>)
at tests.SearchTest.searchTag(SearchTest.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:661)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
at org.testng.TestRunner.privateRun(TestRunner.java:744)
at org.testng.TestRunner.run(TestRunner.java:602)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
at org.testng.TestNG.runSuites(TestNG.java:1144)
at org.testng.TestNG.run(TestNG.java:1115)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:127)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

===============================================
Default Suite
Total tests run: 1, Failures: 1, Skips: 0

Process finished with exit code 0

MAVEN POM file [dependencies]

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.4.0</version>
    </dependency>

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.11</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>io.appium</groupId>
        <artifactId>java-client</artifactId>
        <version>4.1.2</version>
        <scope>test</scope>
    </dependency>

Класс пейджы

package pages;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import io.appium.java_client.pagefactory.AndroidFindBy;
import io.appium.java_client.pagefactory.AppiumFieldDecorator;
import org.openqa.selenium.support.PageFactory;
import java.util.concurrent.TimeUnit;

public class HomePage {

public AndroidDriver driver;

@AndroidFindBy(id = "com.cap.noris:id/mSearchView")
public AndroidElement searchLens;

@AndroidFindBy(id = "com.cap.noris:id/search_src_text")
public  AndroidElement searchField;

public HomePage(AndroidDriver driver){
    this.driver = driver;
    PageFactory.initElements(new AppiumFieldDecorator(driver, 10, TimeUnit.SECONDS), this);
}

}

Класс теста

package tests;

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import pages.HomePage;

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

public class SearchTest {

public AndroidDriver driver;
//HomePage page;

@BeforeMethod
public void setUpAppium() throws MalformedURLException {
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "Nexus5");
    capabilities.setCapability(MobileCapabilityType.PLATFORM_NAME, "Android");
    capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4.4");
    capabilities.setCapability(MobileCapabilityType.APP, "C:\\GitRepo\\Insta\\apk\\com.cap.noris.apk");

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

@Test
public void searchTag(){
    HomePage homepage = new HomePage(driver);
    homepage.searchLens.click();
    homepage.searchField.sendKeys("Summer");
}

}

Может кто видит ошибку, просветите, пожалуйста)

1 лайк

Подозреваю, что “внезапно” начало падать после обновления версии Selenium со 2й на 3ю? :slight_smile:
Если интересует техническая часть вопроса, то ответ кроется тут:

Для тех, кому лень читать по линкам…

Исторически Selenium зависим от Guava. В старых версиях библиотеки использовались свои функциональные велосипеды. Начиная с 21й произошла миграция на Java 8. Ключевые интерфейсы стали расширять Java 8 аналоги. Соответственно новые версии Selenium’а также требуют Java 8 и Guava 21. В частности, метод until начал принимать стандартный Java 8 Function, вместо гуавовского. Из-за этого естественно старые велосипеды с кастомными ExpectedConditions массово поломались.

Это все прелюдия к вашей проблеме. Selenium вы то обновили, а Appium java-client почему-то не посчитали нужным проапдейтить до 5й версии. А ведь именно начиная с 1й беты обновился и Selenium, и все зависимые функциональные интерфейсы.

Т.е. по факту вы столкнулись с популярной проблемой maven’а - dependency hell’ом, когда проект зависим от нескольких версий одной и той же библиотеки, но используется более новая (в вашем случае). В итоге Appium крэшится от того, что не может найти гуавовский com/google/common/base/Function в качестве аргумента метода until. Так что вам необходимо определиться: либо делать downgrade Selenium до той версии, что поддерживалась на момент релиза java-client 4.1.2, либо апдейтить клиент до 5й версии.

П.С. Пока дописывал, уже выше указали на проблему. :slight_smile:

3 лайка

@vmaximv
Удивительно, сработало именно на BETA8 (9)
На 5.0.0 выбрасывает ошибку
org.openqa.selenium.SessionNotCreatedException: A new session could not be created

Это мне урок, что все же читать ченджлоги на гитхабе является очень полезным занятием)

@ArtOfLife
Огромное спасибо за развернутый ответ, подробный разбор проблемы многого стоит. Есть над чем подумать)