prashant-ramcharan / courgette-jvm-appium-ios

Courgette-JVM with Appium (iOS) Example
1 stars 3 forks source link

Courgette JVM Appium iOS not working with PageObjects model #2

Closed mateiQA closed 2 years ago

mateiQA commented 2 years ago

I've adapted your project to provide an alternative that uses the page object model, however, when trying to instantiate the PageObectFactory a couple of exceptions are thrown

I've forked your project here and adapted it if you have any time to look around: https://github.com/mateiQA/courgette-jvm-appium-ios

You can run the project with the same command: ./gradlew clean runIosTestsInParallel

If you remove the page object find by annotation and the constuctor initElements method everything works ok with the in-line elements declared

Page object resource: https://blog.testproject.io/2018/07/31/page-object-model-appium-java-android/

I use a similar approach for the courgette selenium project where I separte

prashant-ramcharan commented 2 years ago

I ran your adapted project and it worked fine for me with the iOSXCUITFindBy annotation.

https://user-images.githubusercontent.com/2563149/155803606-755beb01-2eb0-4c97-a463-ed3bc84b946e.mp4

mateiQA commented 2 years ago

@prashant-ramcharan can you please help me with your java version and gradle versions?

I have no idea why, but every time I run the project I get the following:

./gradlew clean runIosTestsInParallel

> Task :compileTestJava
Note: /Users/matei/courgette-appium/courgette-jvm-appium-ios/src/test/java/pages/BasePage.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

> Task :runIosTestsInParallel
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
dbug Support Found '%s' at '%s'
dbug Support unzip
dbug Support /usr/bin/unzip
[Xcode] 2022-02-25 23:53:45.787101+0200 WebDriverAgentRunner-Runner[25903:4001580] Cannot init screenshots broadcaster service on port 9100. Original error: Error Domain=NSPOSIXErrorDomain Code=48 "Address already in use" UserInfo={NSLocalizedDescription=Address already in use, NSLocalizedFailureReason=Error in bind() function}
[Xcode] 
[Xcode] 2022-02-25 23:53:46.758986+0200 WebDriverAgentRunner-Runner[25903:4001580] Getting the most recent active application (out of 1 total items)
[Xcode] 
[Xcode]     t =     0.98s Find the Application 'io.appium.TestApp'
[Xcode] 
[Xcode]     t =     0.99s     Requesting snapshot of accessibility hierarchy for app with pid 24956
[Xcode] 
Feb 25, 2022 11:53:46 PM io.appium.java_client.remote.AppiumCommandExecutor$1 lambda$0
INFO: Detected dialect: W3C
Feb 25, 2022 11:53:46 PM io.cucumber.core.runtime.Runtime runFeatures
SEVERE: Exception while executing pickle
java.util.concurrent.ExecutionException: io.cucumber.core.exception.CucumberException: Failed to instantiate class steps.MyStepDefinitions
        at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
        at io.cucumber.core.runtime.Runtime.runFeatures(Runtime.java:117)
        at io.cucumber.core.runtime.Runtime.lambda$run$0(Runtime.java:82)
        at io.cucumber.core.runtime.Runtime.execute(Runtime.java:94)
        at io.cucumber.core.runtime.Runtime.run(Runtime.java:80)
        at io.cucumber.core.cli.Main.run(Main.java:87)
        at io.cucumber.core.cli.Main.main(Main.java:30)
Caused by: io.cucumber.core.exception.CucumberException: Failed to instantiate class steps.MyStepDefinitions
        at io.cucumber.core.backend.DefaultObjectFactory.cacheNewInstance(DefaultObjectFactory.java:67)
        at io.cucumber.core.backend.DefaultObjectFactory.getInstance(DefaultObjectFactory.java:45)
        at io.cucumber.java8.Java8Backend.buildWorld(Java8Backend.java:64)
        at io.cucumber.core.runner.Runner.buildBackendWorlds(Runner.java:136)
        at io.cucumber.core.runner.Runner.runPickle(Runner.java:70)
        at io.cucumber.core.runtime.Runtime.lambda$executePickle$6(Runtime.java:128)
        at io.cucumber.core.runtime.CucumberExecutionContext.lambda$runTestCase$3(CucumberExecutionContext.java:110)
        at io.cucumber.core.runtime.RethrowingThrowableCollector.executeAndThrow(RethrowingThrowableCollector.java:23)
        at io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:110)
        at io.cucumber.core.runtime.Runtime.lambda$executePickle$7(Runtime.java:128)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:249)
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
        at io.cucumber.core.runtime.Runtime.lambda$runFeatures$3(Runtime.java:110)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.stream.SliceOps$1$1.accept(SliceOps.java:200)
        at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
        at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
        at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at io.cucumber.core.runtime.Runtime.runFeatures(Runtime.java:111)
        ... 5 more
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at io.cucumber.core.backend.DefaultObjectFactory.cacheNewInstance(DefaultObjectFactory.java:53)
        ... 30 more
Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: jdk.proxy2.$Proxy6.proxyClassLookup()
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.prepareAnnotationMethods(AppiumByBuilder.java:85)
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.getFilledValue(AppiumByBuilder.java:92)
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.createBy(AppiumByBuilder.java:148)
        at io.appium.java_client.pagefactory.DefaultElementByBuilder.getBys(DefaultElementByBuilder.java:133)
        at io.appium.java_client.pagefactory.DefaultElementByBuilder.buildMobileNativeBy(DefaultElementByBuilder.java:175)
        at io.appium.java_client.pagefactory.DefaultElementByBuilder.buildBy(DefaultElementByBuilder.java:204)
        at io.appium.java_client.pagefactory.AppiumElementLocatorFactory.createLocator(AppiumElementLocatorFactory.java:66)
        at io.appium.java_client.pagefactory.AppiumElementLocatorFactory.createLocator(AppiumElementLocatorFactory.java:53)
        at io.appium.java_client.pagefactory.AppiumElementLocatorFactory.createLocator(AppiumElementLocatorFactory.java:1)
        at org.openqa.selenium.support.pagefactory.DefaultFieldDecorator.decorate(DefaultFieldDecorator.java:56)
        at io.appium.java_client.pagefactory.AppiumFieldDecorator.decorate(AppiumFieldDecorator.java:154)
        at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:113)
        at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105)
        at pages.MyPage.<init>(MyPage.java:21)
        at steps.MyStepDefinitions.<init>(MyStepDefinitions.java:7)
        ... 36 more
Caused by: java.lang.NoSuchMethodException: jdk.proxy2.$Proxy6.proxyClassLookup()
        at java.base/java.lang.Class.getMethod(Class.java:2227)
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.prepareAnnotationMethods(AppiumByBuilder.java:83)
        ... 50 more

      io.cucumber.core.exception.CucumberException: Failed to instantiate class steps.MyStepDefinitions
        at io.cucumber.core.backend.DefaultObjectFactory.cacheNewInstance(DefaultObjectFactory.java:67)
        at io.cucumber.core.backend.DefaultObjectFactory.getInstance(DefaultObjectFactory.java:45)
        at io.cucumber.java8.Java8Backend.buildWorld(Java8Backend.java:64)
        at io.cucumber.core.runner.Runner.buildBackendWorlds(Runner.java:136)
        at io.cucumber.core.runner.Runner.runPickle(Runner.java:70)
        at io.cucumber.core.runtime.Runtime.lambda$executePickle$6(Runtime.java:128)
        at io.cucumber.core.runtime.CucumberExecutionContext.lambda$runTestCase$3(CucumberExecutionContext.java:110)
        at io.cucumber.core.runtime.RethrowingThrowableCollector.executeAndThrow(RethrowingThrowableCollector.java:23)
        at io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:110)
        at io.cucumber.core.runtime.Runtime.lambda$executePickle$7(Runtime.java:128)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:249)
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
        at io.cucumber.core.runtime.Runtime.lambda$runFeatures$3(Runtime.java:110)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.stream.SliceOps$1$1.accept(SliceOps.java:200)
        at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
        at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
        at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at io.cucumber.core.runtime.Runtime.runFeatures(Runtime.java:111)
        at io.cucumber.core.runtime.Runtime.lambda$run$0(Runtime.java:82)
        at io.cucumber.core.runtime.Runtime.execute(Runtime.java:94)
        at io.cucumber.core.runtime.Runtime.run(Runtime.java:80)
        at io.cucumber.core.cli.Main.run(Main.java:87)
        at io.cucumber.core.cli.Main.main(Main.java:30)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at io.cucumber.core.backend.DefaultObjectFactory.cacheNewInstance(DefaultObjectFactory.java:53)
        ... 30 more
Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: jdk.proxy2.$Proxy6.proxyClassLookup()
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.prepareAnnotationMethods(AppiumByBuilder.java:85)
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.getFilledValue(AppiumByBuilder.java:92)
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.createBy(AppiumByBuilder.java:148)
        at io.appium.java_client.pagefactory.DefaultElementByBuilder.getBys(DefaultElementByBuilder.java:133)
        at io.appium.java_client.pagefactory.DefaultElementByBuilder.buildMobileNativeBy(DefaultElementByBuilder.java:175)
        at io.appium.java_client.pagefactory.DefaultElementByBuilder.buildBy(DefaultElementByBuilder.java:204)
        at io.appium.java_client.pagefactory.AppiumElementLocatorFactory.createLocator(AppiumElementLocatorFactory.java:66)
        at io.appium.java_client.pagefactory.AppiumElementLocatorFactory.createLocator(AppiumElementLocatorFactory.java:53)
        at io.appium.java_client.pagefactory.AppiumElementLocatorFactory.createLocator(AppiumElementLocatorFactory.java:1)
        at org.openqa.selenium.support.pagefactory.DefaultFieldDecorator.decorate(DefaultFieldDecorator.java:56)
        at io.appium.java_client.pagefactory.AppiumFieldDecorator.decorate(AppiumFieldDecorator.java:154)
        at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:113)
        at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105)
        at pages.MyPage.<init>(MyPage.java:21)
        at steps.MyStepDefinitions.<init>(MyStepDefinitions.java:7)
        ... 36 more
Caused by: java.lang.NoSuchMethodException: jdk.proxy2.$Proxy6.proxyClassLookup()
        at java.base/java.lang.Class.getMethod(Class.java:2227)
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.prepareAnnotationMethods(AppiumByBuilder.java:83)
        ... 50 more

0 Scenarios
0 Steps
0m8.694s

Exception in thread "main" io.cucumber.core.exception.CucumberException: Failed to instantiate class steps.MyStepDefinitions
        at io.cucumber.core.backend.DefaultObjectFactory.cacheNewInstance(DefaultObjectFactory.java:67)
        at io.cucumber.core.backend.DefaultObjectFactory.getInstance(DefaultObjectFactory.java:45)
        at io.cucumber.java8.Java8Backend.buildWorld(Java8Backend.java:64)
        at io.cucumber.core.runner.Runner.buildBackendWorlds(Runner.java:136)
        at io.cucumber.core.runner.Runner.runPickle(Runner.java:70)
        at io.cucumber.core.runtime.Runtime.lambda$executePickle$6(Runtime.java:128)
        at io.cucumber.core.runtime.CucumberExecutionContext.lambda$runTestCase$3(CucumberExecutionContext.java:110)
        at io.cucumber.core.runtime.RethrowingThrowableCollector.executeAndThrow(RethrowingThrowableCollector.java:23)
        at io.cucumber.core.runtime.CucumberExecutionContext.runTestCase(CucumberExecutionContext.java:110)
        at io.cucumber.core.runtime.Runtime.lambda$executePickle$7(Runtime.java:128)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:249)
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
        at io.cucumber.core.runtime.Runtime.lambda$runFeatures$3(Runtime.java:110)
        at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
        at java.base/java.util.stream.SliceOps$1$1.accept(SliceOps.java:200)
        at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
        at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
        at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
        at io.cucumber.core.runtime.Runtime.runFeatures(Runtime.java:111)
        at io.cucumber.core.runtime.Runtime.lambda$run$0(Runtime.java:82)
        at io.cucumber.core.runtime.Runtime.execute(Runtime.java:94)
        at io.cucumber.core.runtime.Runtime.run(Runtime.java:80)
        at io.cucumber.core.cli.Main.run(Main.java:87)
        at io.cucumber.core.cli.Main.main(Main.java:30)
Caused by: java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
        at io.cucumber.core.backend.DefaultObjectFactory.cacheNewInstance(DefaultObjectFactory.java:53)
        ... 30 more
Caused by: java.lang.RuntimeException: java.lang.NoSuchMethodException: jdk.proxy2.$Proxy6.proxyClassLookup()
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.prepareAnnotationMethods(AppiumByBuilder.java:85)
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.getFilledValue(AppiumByBuilder.java:92)
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.createBy(AppiumByBuilder.java:148)
        at io.appium.java_client.pagefactory.DefaultElementByBuilder.getBys(DefaultElementByBuilder.java:133)
        at io.appium.java_client.pagefactory.DefaultElementByBuilder.buildMobileNativeBy(DefaultElementByBuilder.java:175)
        at io.appium.java_client.pagefactory.DefaultElementByBuilder.buildBy(DefaultElementByBuilder.java:204)
        at io.appium.java_client.pagefactory.AppiumElementLocatorFactory.createLocator(AppiumElementLocatorFactory.java:66)
        at io.appium.java_client.pagefactory.AppiumElementLocatorFactory.createLocator(AppiumElementLocatorFactory.java:53)
        at io.appium.java_client.pagefactory.AppiumElementLocatorFactory.createLocator(AppiumElementLocatorFactory.java:1)
        at org.openqa.selenium.support.pagefactory.DefaultFieldDecorator.decorate(DefaultFieldDecorator.java:56)
        at io.appium.java_client.pagefactory.AppiumFieldDecorator.decorate(AppiumFieldDecorator.java:154)
        at org.openqa.selenium.support.PageFactory.proxyFields(PageFactory.java:113)
        at org.openqa.selenium.support.PageFactory.initElements(PageFactory.java:105)
        at pages.MyPage.<init>(MyPage.java:21)
        at steps.MyStepDefinitions.<init>(MyStepDefinitions.java:7)
        ... 36 more
Caused by: java.lang.NoSuchMethodException: jdk.proxy2.$Proxy6.proxyClassLookup()
        at java.base/java.lang.Class.getMethod(Class.java:2227)
        at io.appium.java_client.pagefactory.bys.builder.AppiumByBuilder.prepareAnnotationMethods(AppiumByBuilder.java:83)
        ... 50 more

runners.IosTestRunner > executionError FAILED
    java.util.NoSuchElementException at Optional.java:143

2 tests completed, 1 failed

> Task :runIosTestsInParallel FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':runIosTestsInParallel'.
> There were failing tests. See the report at: file:///Users/matei/courgette-appium/courgette-jvm-appium-ios/build/reports/tests/runIosTestsInParallel/index.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 10s
5 actionable tasks: 5 executed
prashant-ramcharan commented 2 years ago

Java: 1.8.0_312

Gradle: 6.9.1

mateiQA commented 2 years ago

It seems this was related to java 17 which was installed for allure. Reverting to java 8 fixed the issue. Thank you If anyone is interested in a working version, I forked the project here: https://github.com/mateiQA/courgette-jvm-appium-ios