Coder Social home page Coder Social logo

jetbrains / intellij-ui-test-robot Goto Github PK

View Code? Open in Web Editor NEW
105.0 17.0 29.0 1.15 MB

The library allows you to write and execute UI tests among IntelliJ IDEA. You can test your Plugin.

Home Page: https://jetbrains-platform.slack.com/archives/C026SVA9MMM

License: Apache License 2.0

Kotlin 83.77% TypeScript 9.62% JavaScript 2.68% CSS 0.26% Java 3.67%
idea-plugin ide test-automation intellij java intellij-plugin kotlin

intellij-ui-test-robot's Introduction

official JetBrains project

This library allows you to write and execute UI tests in IntelliJ IDEA. You can use it to test your plugin.

If you have any questions, feel free to post them in our Slack Channel.

Quick Start

The first thing we need to do is to launch the IDE. Because the runIdeForUiTests task is blocking, we can run it as an asynchronous process:

./gradlew ui-test-example:clean ui-test-example:runIdeForUiTests &

Next, we can start the tests. Since they run locally, you need to make sure that the Welcome Frame is visible on the screen:

./gradlew ui-test-example:test

Alternatively, you can run all tasks at once with the following command:

./gradlew ui-test-example:clean ui-test-example:runIdeForUiTests & ./gradlew ui-test-example:test

Remote-Robot

The Remote-Robot library is inspired by Selenium WebDriver. It supports IntelliJ IDEA since version 2019.2.

It consists of a remote-robot client and a robot-server plugin:

  • remote-robot - is a client (test) side library that is used to send commands to the robot-server plugin
  • robot-server - is an IDEA plugin that must be run with the plugin you are developing

The easiest way to start the test system is to execute the runIdeForUiTests task (refer to the Quick Start section above). When IDEA is initialized, the robot-server plugin starts listening for commands from the UI test client.

The remote-robot library communicates with the robot-server plugin via an HTTP protocol. This connection means you can launch IDEA on remote machines or in Docker containers to check your plugin within different test environments.

Setup

The last version of the Remote-Robot is 0.11.23.

In the test project:

repositories {
    maven { url = "https://packages.jetbrains.team/maven/p/ij/intellij-dependencies" }
}
dependencies {
    testImplementation("com.intellij.remoterobot:remote-robot:REMOTE-ROBOT_VERSION")
}

In the plugin project:

runIdeForUiTests {
    systemProperty "robot-server.port", "8082" // default port 8580
}

downloadRobotServerPlugin {
    version = REMOTE-ROBOT_VERSION
}

By default, the port is set to local, so it cannot be reached from another host. In case you need to make it public, you can add the robot-server.host.public system property to the runIdeForUiTests task:

runIdeForUiTests {
    // ......
    systemProperty "robot-server.host.public", "true" // port is public
}

Of course, you can write UI tests in the plugin project.

Launching

There are two ways of launching IDEA and UI tests:

First, we need to launch the IDE. Because the runIdeForUiTests task is blocking, we can run it as an asynchronous process:

./gradlew ui-test-example:clean ui-test-example:runIdeForUiTests &

Next, we can start the tests. Since they run locally, you need to make sure that the Welcome Frame is visible on the screen:

./gradlew ui-test-example:test

Alternatively, you can run all tasks at once with the following command:

./gradlew ui-test-example:clean ui-test-example:runIdeForUiTests & ./gradlew ui-test-example:test

Check this project as an example.

Using ide-launcher

The ide-launcher library allows us to launch IDEA directly from the test. To use it, we need to add a dependency to our project:

dependencies {
    testImplementation("com.intellij.remoterobot:ide-launcher:REMOTE-ROBOT_VERSION")
}

Next, we can use IdeLauncher to start IDEA:

final OkHttpClient client=new OkHttpClient();
final IdeDownloader ideDownloader=new IdeDownloader(client);
     ideaProcess = IdeLauncher.INSTANCE.launchIde(
     ideDownloader.downloadAndExtract(Ide.IDEA_COMMUNITY, tmpDir),
     Map.of("robot-server.port",8082),
     List.of(),
     List.of(ideDownloader.downloadRobotPlugin(tmpDir), pathToOurPlugin),
     tmpDir
);

Check Java and Kotlin examples.

Useful launch properties

Property Value Description
jb.consents.confirmation.enabled false Disable the consent dialog.
eap.require.license true The EAP version requires license the same way as the Release version. This property helps to avoid EAP login on CI.
ide.mac.message.dialogs.as.sheets false Disable the Sheet dialogs on Mac, they are not recognized by Java Robot.
ide.mac.file.chooser.native false Disable the Mac native file chooser, it is not recognized by Java Robot.
jbScreenMenuBar.enabled + apple.laf.useScreenMenuBar false + false Disable the Mac native menu, it is not recognized by Java Robot.
idea.trust.all.projects true Disable the Trust Project dialog that appears when the project is opened.
ide.show.tips.on.startup.default.value false Disable the Tips Of the Day dialog on startup.

Create RemoteRobot

In the UI test project:

RemoteRobot remoteRobot = new RemoteRobot("http://127.0.0.1:8082");

Searching Components

We use the XPath query language to find components. Once IDEA with robot-server has started, you can open the http://ROBOT-SERVER:PORT link. The page shows the IDEA UI components hierarchy in HTML format. You can find the component of interest and write an XPath to it, similar to Selenium WebDriver. There is also a simple XPath generator that can help you write and test your XPaths.

For example:

  • Define a locator
Locator loginToGitHubLocator = byXpath("//div[@class='MainButton' and @text='Log in to GitHub...']");
  • Find one component
ComponentFixture loginToGitHub = remoteRobot.find(ComponentFixture.class,loginToGitHubLocator);
  • Find many components
List<ContainterFixture> dialogs = remoteRobot.findAll(
    ComponentFixture.class,
    byXpath("//div[@class='MyDialog']")
);

Fixtures

Fixtures support the PageObject pattern. There are two basic fixtures:

  • ComponentFixture is the simplest representation of any real component with basic methods
  • ContainerFixture extends ComponentFixture and allows searching other components within it

You can create your own fixtures:

@DefaultXpath(by = "FlatWelcomeFrame type", xpath = "//div[@class='FlatWelcomeFrame']")
@FixtureName(name = "Welcome Frame")
public class WelcomeFrameFixture extends ContainerFixture {
    public WelcomeFrameFixture(@NotNull RemoteRobot remoteRobot, @NotNull RemoteComponent remoteComponent) {
        super(remoteRobot, remoteComponent);
    }

    // Create New Project 
    public ComponentFixture createNewProjectLink() {
        return find(ComponentFixture.class, byXpath("//div[@text='Create New Project' and @class='ActionLink']"));
    }

    // Import Project
    public ComponentFixture importProjectLink() {
        return find(ComponentFixture.class, byXpath("//div[@text='Import Project' and @class='ActionLink']"));
    }
}
// find the custom fixture by its default XPath
WelcomeFrameFixture welcomeFrame=remoteRobot.find(WelcomeFrameFixture.class);
welcomeFrame.createNewProjectLink().click();

Remote-Fixtures

We have prepared some basic fixtures:

dependencies {
    testImplementation("com.intellij.remoterobot:remote-fixtures:REMOTE-ROBOT_VERSION")
}

The library contains fixtures for most basic UI components. Please check this package to learn more. In case you want to add missing basic fixtures, you are welcome to PR or create an issue.

Getting Data From a Real Component

We use the JavaScript rhino engine to work with components on the IDEA side.

For example, retrieving text from the ActionLink component:

public class ActionLinkFixture extends ComponentFixture {
    public ActionLinkFixture(@NotNull RemoteRobot remoteRobot, @NotNull RemoteComponent remoteComponent) {
        super(remoteRobot, remoteComponent);
    }

    public String text() {
        return callJs("component.getText();");
    }
}

We can retrieve data using RemoteRobot with the callJs method. In this case, there is a robot var in the context of JavaScript execution. The robot is an instance of extending the org.assertj.swing.core.Robot class.

When you use the callJs() method of a fixture object, the component argument represents the actual UI component found (see Searching Components) and used to initialize the ComponentFixture.

The runJs method works the same way without any return value:

public void click() {
    runJs("const offset = component.getHeight()/2;"+
        "robot.click("+
        "component, "+
        "new Point(offset, offset), "+
        "MouseButton.LEFT_BUTTON, 1);"
    );
}

We import some packages to the context before the script is executed:

 java.awt
 org.assertj.swing.core
 org.assertj.swing.fixture

You can add other packages or classes with js methods:

importClass(java.io.File);
importPackage(java.io);

Alternatively, you can just use the full path:

Boolean isDumbMode=ideaFtame.callJs(
    "com.intellij.openapi.project.DumbService.isDumb(component.project);"
);

Store data between runJs/callJs requests

There are global and local Map<String, Object> variables available in the js context:

  • global is a single map for the whole IDE
  • local map is defined on a per-fixture basis

Please check GlobalAndLocalMapExamples for additional information.

In case you made robot-server-plugin port public, you may want to enable encryption for JavaScript code:

runIdeForUiTests {
    systemProperty "robot.encryption.enabled", "true"
    systemProperty "robot.encryption.password", "secret"
}

test {
    systemProperty "robot.encryption.password", "secret"
}

Text

Sometimes, you may not want to dig through the whole component to determine which field contains the text you need to reach. If you need to check whether some text is present on the component or you need to click the text, you can use fixture methods:

welcomeFrame.findText("Create New Project").click();
assert(welcomeFrame.hasText(startsWith("Version 20")));
List<String> renderedText=welcomeFrame.findAllText()
    .stream()
    .map(RemoteText::getText)
    .collect(Collectors.toList());

Instead of looking for the text inside the component structure, we render it on a fake Graphics to collect text data and its points.

Screenshots

There are two ways to get a screenshot.

  1. Get a screenshot of the whole screen (method of RemoteRobot object).
remoteRobot.getScreenshot()
  1. Get component screenshot (method of Fixture object).
    The isPaintingMode parameter allows you to return a new render of the component (set to false by default).
    This might be helpful when you don't have a complete set of desktop environments or when any other component covers the component of your interest.
someFixture.getScreenshot();
someFixture.getScreenshot(true);

In both cases, you will get the BufferedImage object specified as .png.

Kotlin

If you are familiar with Kotlin, please take a look at the kotlin example. You may find it easier to read and use.

Steps Logging

We use the step wrapper method to make test logs easy to read. The StepLogger example shows how useful it can be. For instance, by implementing your own StepProcessor, you can extend the steps workflow and connect to the allure report framework.

FAQ

FAQ

intellij-ui-test-robot's People

Contributors

alexpl292 avatar arunsathiya avatar damien-urruty-sonarsource avatar dantimashov avatar dependabot[bot] avatar fxnm avatar hsz avatar infiniteregrets avatar jonatha1983 avatar karpavichus avatar matthewmichihara avatar mkfl3x avatar nizienko avatar olkornii avatar rwx788 avatar shishovv avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

intellij-ui-test-robot's Issues

Could not update Remote-Robot version from 0.10.3 to 0.11.2 (dependency could not be resolved)

> Task :downloadRobotServerPlugin FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':downloadRobotServerPlugin'.
> Could not resolve all files for configuration ':detachedConfiguration6'.
   > Could not resolve org.jetbrains.test:robot-server-plugin:0.11.2.
     Required by:
         project :
      > Could not resolve org.jetbrains.test:robot-server-plugin:0.11.2.
         > Could not get resource 'https://jetbrains.bintray.com/intellij-third-party-dependencies/org/jetbrains/test/robot-server-plugin/0.11.2/robot-server-plugin-0.11.2.pom'.
            > Could not GET 'https://jetbrains.bintray.com/intellij-third-party-dependencies/org/jetbrains/test/robot-server-plugin/0.11.2/robot-server-plugin-0.11.2.pom'. Received status code 403 from server: Forbidden
      > Could not resolve org.jetbrains.test:robot-server-plugin:0.11.2.
         > Could not get resource 'https://jetbrains.bintray.com/intellij-third-party-dependencies/org/jetbrains/test/robot-server-plugin/0.11.2/robot-server-plugin-0.11.2.pom'.
            > Could not GET 'https://jetbrains.bintray.com/intellij-third-party-dependencies/org/jetbrains/test/robot-server-plugin/0.11.2/robot-server-plugin-0.11.2.pom'. Received status code 403 from server: Forbidden

The findAll() method does not accept Duration.ofSeconds() as a parameter (such as the find() method do)

  • in the past I did not care about the missing option, because I did not need it, but not I come to some issues:
    • when I want to find all the element by Xpath in the popup window (IMG 2), the findAll method returns 0 of them
    • when I put there a Thread.sleep(1000) (which is not a good practice) before the invocation of findAll(), the findAll method returns all the 2 elements which it should return
    • POSSIBLE REASONS WHY THE FINDALL() METHOD FAILS:
      • the popup shows with an animation, which takes time to finish - probably not the reason because when I try use find() to find the whole popup element (JDialog; shown below on IMG1), it works, when I call findAll() after that it still does not work (see CODE 1 below)
      • The structure of element is too big, too complex, too much nested elements, it may take too much time and the findAll() method did not manage to finish the process all the elements before the inner default timeout run out of time

IMG 1: Structure of the popup:

Snímek obrazovky 2021-02-05 v 23 12 45

CODE 1: The JDialog could be found, the 2 JEditorPane not (=the jEditorPanes.size() = 0):

ContainerFixture jDialog = remoteRobot.find(ContainerFixture.class, byXpath("//div[@class='JDialog']"));
List<ComponentFixture> jEditorPanes = jDialog.findAll(ComponentFixture.class, byXpath("//div[@class='JEditorPane']"));

IMG 2: Image of a popup on OS X which contains 2 JEditorPane elements I want to get using the findAll():

popup

StepLogger does not generate any output

I have integrated the StepLogger and it seems it does not produce any outcome.

I have registered it before running any test
StepWorker.registerProcessor(new StepLogger());

I have added the steps into my code
step("abcd....", () -> {............});

Selecting comboBox items with quotation marks results in a parsing exception

If you try to select a combo box containing quotation marks you will receive a javascript parsing exception because those quotation marks are not escaped.

Even if the input for comboBox.selectItem is escaped the resulting JS script is unescaped again.

Reproducer:

actionMenu(remoteRobot, "File").click();
actionMenuItem(remoteRobot, "Project Structure...").click();

var comboBox = remoteRobot.find(ComboBoxFixture.class, byXpath("//div[@class='JdkComboBox']"), Duration.ofSeconds(2));
comboBox.selectItem("18  java version \"18\"");
//comboBox.selectItemContains("java version");

Result which get sent:

ctx.get('fixture').selectItem("18  java version "18"")

Wait for smart mode flaky with null project exception

Hi,

We follow the examples in this repo to wait for smart mode in our tests, this function times out sometimes in our integration tests.

fun dumbAware(timeout: Duration = Duration.ofMinutes(5), function: () -> Unit) {
step("Wait for smart mode") {
waitFor(duration = timeout, interval = Duration.ofSeconds(5)) {
runCatching { isDumbMode().not() }.getOrDefault(false)
}
function()
step("..wait for smart mode again") {
waitFor(duration = timeout, interval = Duration.ofSeconds(5)) {
isDumbMode().not()
}
}
}
}

When we checked the log, it shows that project is null in this call

return callJs("com.intellij.openapi. project.DumbService.isDumb(component.project);", true)

2022-04-28 07:47:33,888 [  89163]   WARN - ctionSystem.impl.ActionUpdater - 566 ms to grab EDT for #update (com.intellij.codeInsight.actions.ReaderModeActionProvider$createAction$1) 
2022-04-28 07:47:33,889 [  89164]   WARN - ctionSystem.impl.ActionUpdater - 566 ms to grab EDT for CWMTelephonyGroup#update (com.jetbrains.rd.platform.codeWithMe.telephony.CWMTelephonyGroup) 
org.mozilla.javascript.WrappedException: Wrapped java.lang.IllegalArgumentException: Argument for @NotNull parameter 'project' of com/intellij/openapi/project/DumbService.isDumb must not be null (js#8)
	at org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1825)
	at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:227)
	at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:211)
	at org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:35)
	at org.mozilla.javascript.gen.js_12._c_script_0(js:8)
	at org.mozilla.javascript.gen.js_12.call(js)
	at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:380)
	at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3868)
	at org.mozilla.javascript.gen.js_12.call(js)
	at org.mozilla.javascript.gen.js_12.exec(js)
	at com.intellij.remoterobot.services.js.RhinoJavaScriptExecutor.executeWithContext(RhinoJavaScriptExecutor.kt:44)
	at com.intellij.remoterobot.services.js.RhinoJavaScriptExecutor.execute(RhinoJavaScriptExecutor.kt:12)
	at com.intellij.remoterobot.services.IdeRobot$retrieveAny$4$1.executeInEDT(IdeRobot.kt:358)
	at com.intellij.remoterobot.services.IdeRobot$retrieveAny$4$1.executeInEDT(IdeRobot.kt:356)
	at org.assertj.swing.edt.GuiQuery.run(GuiQuery.java:42)
	at java.desktop/java.awt.event.InvocationEvent.dispatch([InvocationEvent.java:313](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/event/InvocationEvent.java:313))
	at java.desktop/java.awt.EventQueue.dispatchEventImpl([EventQueue.java:776](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventQueue.java:776))
	at java.desktop/java.awt.EventQueue$4.run([EventQueue.java:727](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventQueue.java:727))
	at java.desktop/java.awt.EventQueue$4.run([EventQueue.java:721](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventQueue.java:721))
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege([ProtectionDomain.java:85](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/security/ProtectionDomain.java:85))
	at java.desktop/java.awt.EventQueue.dispatchEvent([EventQueue.java:746](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventQueue.java:746))
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:891)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:760)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:447)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:818)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:446)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:805)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:498)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters([EventDispatchThread.java:203](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventDispatchThread.java:203))
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter([EventDispatchThread.java:124](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventDispatchThread.java:124))
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy([EventDispatchThread.java:113](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventDispatchThread.java:113))
	at java.desktop/java.awt.EventDispatchThread.pumpEvents([EventDispatchThread.java:109](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventDispatchThread.java:109))
	at java.desktop/java.awt.EventDispatchThread.pumpEvents([EventDispatchThread.java:101](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventDispatchThread.java:101))
	at java.desktop/java.awt.EventDispatchThread.run([EventDispatchThread.java:90](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/awt/EventDispatchThread.java:90))
Caused by: java.lang.IllegalArgumentException: Argument for @NotNull parameter 'project' of com/intellij/openapi/project/DumbService.isDumb must not be null
	at com.intellij.openapi.project.DumbService.$$$reportNull$$$0(DumbService.java)
	at com.intellij.openapi.project.DumbService.isDumb(DumbService.java)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke([Method.java:566](https://cs.corp.google.com/#search/&sq=package:%5Epiper$%20project:openjdk&q=java/lang/reflect/Method.java:566))
	at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:206)
	... 33 more

We also checked the video, the project opens and waits for 5 minutes until this test failed with timeout error.

Can someone please help us understand why component.project is null and how we can make this function more stable?

Thanks!

MyDialog child components have duplicates in the tree in 0.10.1

In 0.10.1, dialogs classes are returning the same child components multiple times in the hierarchy:

DOM View:
Screen Shot 2020-12-23 at 10 31 25 AM

UI Inspector:
Screen Shot 2020-12-23 at 10 32 03 AM

Debugger View:

remoteRobot.findAll<JTextFieldFixture>(byXpath("//div[@accessiblename='Bucket Name:' and @class='JTextField']"))

result = {ArrayList@8072}  size = 3
 0 = {JTextFieldFixture@8074} 
  data$delegate = {SynchronizedLazyImpl@8078} "Lazy value not initialized yet."
  remoteRobot = {RemoteRobot@7020} 
  remoteComponent = {RemoteComponent@8079} 
   id = "6475acea-e311-477c-bba5-f507961384f4"
   className = "javax.swing.JTextField"
   name = null
   x = 98
   y = 0
   width = 400
   height = 30
 1 = {JTextFieldFixture@8075} 
  data$delegate = {SynchronizedLazyImpl@8082} "Lazy value not initialized yet."
  remoteRobot = {RemoteRobot@7020} 
  remoteComponent = {RemoteComponent@8083} 
   id = "a6256dda-9cce-4431-a466-a055bf922d0d"
   className = "javax.swing.JTextField"
   name = null
   x = 98
   y = 0
   width = 400
   height = 30
 2 = {JTextFieldFixture@8076} 
  data$delegate = {SynchronizedLazyImpl@8086} "Lazy value not initialized yet."
  remoteRobot = {RemoteRobot@7020} 
  remoteComponent = {RemoteComponent@8087} 
   id = "4caa1430-cb59-47ca-9f44-ac337513df45"
   className = "javax.swing.JTextField"
   name = null
   x = 98
   y = 0
   width = 400
   height = 30

Note: If I use the root remoteRobot, it finds 3. If I use findAll scoped to the IdeFrame, it only finds 2.


In 0.9.35:
DOM View:
Screen Shot 2020-12-23 at 10 27 15 AM

UI Inspector:
Screen Shot 2020-12-23 at 10 26 08 AM

Debugger View:
Screen Shot 2020-12-23 at 10 25 12 AM

Functions isPathExists(), clickPath() from JTreeFixture stop working with update to 0.11.14 (PathNotFoundException)

  • Issue appear after update to Remote-Robot 0.11.14, version 0.11.13 and earlier are working without issues
  • I have some tests working with the Project Explorer (left panel in IntelliJ, there are project files, folder, whole structure)
  • No issue when creating JTreeFixture fixture, no issue when expanding the tree using this fixture -> means fixture + some functions are without issue
  • Functions isPathExists() and clickPath() -> PathNotFoundException even when path only one item - the root folder - in my case pe_java_project

Snímek obrazovky 2022-06-27 v 10 38 39

actionButton(byTooltipText("xx")) doesn't work anymore

Hi,

val remoteRobotVersion = "0.11.2"
val fixturesVersion = "1.1.18"

Not sure how to investigate, but I'm pretty sure it was working at some point. I updated multiple parts of our UI tests (like remote robot dependency), and now
actionButton(byTooltipText("XXX"))
doesn't work anymore.
To investigate, I tried to display:
findAll(ActionButtonFixture::class.java, byXpath("//div[@class='ActionButton']")).forEach {println(it.tooltipText)}
but it says "no tool tip" for all buttons. Looking at the robot "HTML tree" I can see that the buttons don't have a tooltipText attribute anymore:
image

My workaround it to use:
find(ActionButtonFixture::class.java, byXpath("//div[@tooltiptext='XXX' and @class='ActionButton']"))

Failed to find 'JPopupMenuFixture' when used for 'Project SDK' dropdown menu

  • the WaitForConditionTimeoutException is thrown when the RR framework fails to find 'JPopupMenuFixture'
  • this exception appear only sometime (on macOS Catalina 10.15 and on macOS Big Sur 11 - in both cases on github actions) other platforms are ok

This code causes sometimes WaitForConditionTimeoutException:
JPopupMenuFixture projectSdkList = find(JPopupMenuFixture.class, JPopupMenuFixture.Companion.byType(), Duration.ofSeconds(10));

This code works without issue:
ComponentFixture projectSdkList = find(ComponentFixture.class, byXpath("//div[@class='HeavyWeightWindow']"), Duration.ofSeconds(10));

130352872-50b5fa7e-b6e3-45da-8e4f-d6b07faa2f95

Exception occurs on 2021.2

Exception in thread "main" com.intellij.remoterobot.client.IdeaSideException
	at com.intellij.remoterobot.client.IdeRobotClient.processFindResponse(IdeRobotClient.kt:98)
	at com.intellij.remoterobot.client.IdeRobotClient.findAllByXpath(IdeRobotClient.kt:39)
	at com.intellij.remoterobot.search.Finder.findMany(Finder.kt:43)
	at com.intellij.remoterobot.SearchContext$findAll$1.invoke(SearchContext.kt:77)
	at com.intellij.remoterobot.SearchContext$findAll$1.invoke(SearchContext.kt:17)
	at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:23)
	at com.intellij.remoterobot.SearchContext$DefaultImpls.findAll(SearchContext.kt:76)
	at com.intellij.remoterobot.RemoteRobot.findAll(RemoteRobot.kt:32)
    <removed for brevity>
Caused by: java.lang.Throwable
	at java.base/java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:719)
	at java.base/java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:741)
	at com.intellij.remoterobot.fixtures.dataExtractor.server.TextToKeyCache.findKey(TextToKeyCache.kt:43)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.fillElement(XpathDataModelCreator.kt:123)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.createElement(XpathDataModelCreator.kt:56)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.addComponent(XpathDataModelCreator.kt:31)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.addComponent(XpathDataModelCreator.kt:48)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.addComponent(XpathDataModelCreator.kt:48)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.addComponent(XpathDataModelCreator.kt:48)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.addComponent(XpathDataModelCreator.kt:48)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.addComponent(XpathDataModelCreator.kt:48)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.addComponent(XpathDataModelCreator.kt:48)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.addComponent(XpathDataModelCreator.kt:48)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.addComponent(XpathDataModelCreator.kt:48)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.access$addComponent(XpathDataModelCreator.kt:23)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$create$1.executeInEDT(XpathDataModelCreator.kt:266)
	at org.assertj.swing.edt.GuiTask.run(GuiTask.java:36)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:740)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:885)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:754)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:441)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:825)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:440)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:794)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:492)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
	at org.assertj.swing.edt.GuiActionRunner.execute(GuiActionRunner.java:146)
	at com.intellij.remoterobot.services.xpath.XpathDataModelCreator.create(XpathDataModelCreator.kt:255)
	at com.intellij.remoterobot.services.xpath.XpathSearcher.findComponents(XpathSearcher.kt:26)
	at com.intellij.remoterobot.services.IdeRobot$findAllByXpath$1.invoke(IdeRobot.kt:134)
	at com.intellij.remoterobot.services.IdeRobot$findAllByXpath$1.invoke(IdeRobot.kt:26)
	at com.intellij.remoterobot.services.IdeRobot.getResult(IdeRobot.kt:386)
	at com.intellij.remoterobot.services.IdeRobot.findAllByXpath(IdeRobot.kt:133)
	at com.intellij.remoterobot.RobotServerImpl$startServer$2$2$8$1.invoke(RobotServerImpl.kt:131)
	at com.intellij.remoterobot.RobotServerImpl$startServer$2$2$8$1.invoke(RobotServerImpl.kt:30)
	at com.intellij.remoterobot.RobotServerImpl$Companion.dataResultRequest(RobotServerImpl.kt:342)
	at com.intellij.remoterobot.RobotServerImpl$startServer$2$2$8.invokeSuspend(RobotServerImpl.kt:130)
	at com.intellij.remoterobot.RobotServerImpl$startServer$2$2$8.invoke(RobotServerImpl.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113)
	at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133)
	at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77)
	at io.ktor.routing.Routing.executeResult(Routing.kt:148)
	at io.ktor.routing.Routing.interceptor(Routing.kt:35)
	at io.ktor.routing.Routing$Feature$install$1.invokeSuspend(Routing.kt:100)
	at io.ktor.routing.Routing$Feature$install$1.invoke(Routing.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113)
	at io.ktor.features.ContentNegotiation$Feature$install$1.invokeSuspend(ContentNegotiation.kt:113)
	at io.ktor.features.ContentNegotiation$Feature$install$1.invoke(ContentNegotiation.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113)
	at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133)
	at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77)
	at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invokeSuspend(DefaultEnginePipeline.kt:121)
	at io.ktor.server.engine.DefaultEnginePipelineKt$defaultEnginePipeline$2.invoke(DefaultEnginePipeline.kt)
	at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:243)
	at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:113)
	at io.ktor.util.pipeline.SuspendFunctionGun.execute(SuspendFunctionGun.kt:133)
	at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77)
	at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invokeSuspend(NettyApplicationCallHandler.kt:54)
	at io.ktor.server.netty.NettyApplicationCallHandler$handleRequest$1.invoke(NettyApplicationCallHandler.kt)
	at kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:55)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.startCoroutineImpl(Builders.common.kt:182)
	at kotlinx.coroutines.BuildersKt.startCoroutineImpl(Unknown Source)
	at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:145)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:54)
	at kotlinx.coroutines.BuildersKt.launch(Unknown Source)
	at io.ktor.server.netty.NettyApplicationCallHandler.handleRequest(NettyApplicationCallHandler.kt:37)
	at io.ktor.server.netty.NettyApplicationCallHandler.channelRead(NettyApplicationCallHandler.kt:29)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:61)
	at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:370)
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:834)

ActionLinkFixture.click points at a wrong location

Hello,

I didn't find a better place to report this issue since I don't know where the sources of the remote-fixtures lib are hosted (maybe privately?). I am using 1.1.18.

I noticed an issue with ActionLinkFixture.click(). When looking at the test running, the click was done at a wrong position. When decompiling the code in IntelliJ, we have:

override fun click() {
    step("..click") {
        runJs("""
            const offset = component.height / 2
            robot.click(component, new Point(offset, offset), MouseButton.LEFT_BUTTON, 1)
        """);
    }
}

My use case is that the ActionLink is inside a HorizontalLayout, so it fills the whole height, and its height is bigger than the width. The same offset being used for x and y in the point, it goes too far at the right of the component.

I worked around the issue by not using ActionLinkFixture but directly JLabelFixture.click(), which works correctly.

comboBox() from CommonContainerFixture does not work with @class='ComboBox'

I have used the comboBox() successfully several times for "JComboBox" - comboBox(byXpath("//div[@class='JComboBox']"), Duration.ofSeconds(10));

When trying to implement it for custom pages in New Project wizard for "ComboBox", it does not work:
comboBox(byXpath("//div[@class='ComboBox']"), Duration.ofSeconds(10)).selectItemContains(...........);

I have trie to change it, does not work too:
comboBox(byXpath("//div[@class='JComboBox']"), Duration.ofSeconds(10)).selectItemContains(...........);

16:22:14 INFO : Search 'New Project Dialog' by 'MyDialog type'
16:22:14 INFO : Search 'Combobox' by '//div[@class='ComboBox']'
16:22:15 INFO : Select 'Maven'
16:22:15 INFO :     Select 'Maven'
16:22:45 WARN :         Failed on step: Select 'Maven' (StepWorker.kt_step)
16:22:45 WARN :     Failed on step: Select 'Maven' (StepWorker.kt_step)

Snímek obrazovky 2021-10-21 v 16 14 09

Module system errors with IntelliJ IDEA 2022.2

Using remote-robot version 0.11.15 with IntelliJ IDEA 2022.2 is failing with many errors from the Java module system on the IDE side. Note that IDEA 2022.2 now uses Java 17 as its internal JVM.

Full log including stack trace is attached. This includes the following error:

Unable to make field private java.awt.Color javax.swing.text.JTextComponent.selectedTextColor accessible: module java.desktop does not "opens javax.swing.text" to unnamed module @f8f1074

I attempted to fix this by adding an --add-opens argument to the launcher as follows:

    ideProcess = IdeLauncher.INSTANCE.launchIde(
        ideaPath,
        systemProperties,
        List.of("--add-opens=java.desktop/javax.swing.text=ALL-UNNAMED"),
        List.of(findRobotPluginPath(), pluginUnderTestPath),
        sandboxPath);
  }

However this did not have any effect.

Trying to get SayHelloJavaTest to work... can't find ActionButton

Using Window10 with IntelliJ 2021.2 EAP (212.4037.50) as the testIDE...

When cloning and trying to run the first tests, It seemed the test could not find the 'more actions' element...

in kotlin/org/intellij/examples/simple/plugin/pages/WelcomeFrame.kt
I changed the code to

    val moreActions
        get() = button(byXpath("More Actions", "//div[@accessiblename='More Actions' and @class='DropDownLink']"))

from the original

 val moreActions
        get() = button(byXpath("More Action", "//div[@accessiblename='More Actions' and @class='ActionButton']"))

and it seemed to work...
!

p.s. is there any chance of getting the latest 0.14 versions published to your repository?

https://packages.jetbrains.team/maven/p/ij/intellij-dependencies/org/jetbrains/test/robot-server-plugin/

only shows up to version 0.10

Thank you!

Example tests fail

Example tests fail

This project looks fantastic and I'm really interested in using it. However, whenever I run the sample tests, they fail at the second step. It would appear that non of the .click()s are actually opening dialog windows. Is there any tips for debugging problems like this, or anything else I might be doing wrong?

Thanks in advance!

Here's the output of running the tests.

./gradlew ui-test-example:clean ui-test-example:runIdeForUiTests & ./gradlew ui-test-example:test --stacktrace 
[5] 81794
<===----------> 25% CONFIGURING [358ms]
> :remote-robot > Resolve dependencies of :remote-robot:classpath
Starting a Gradle Daemon, 2 busy and 4 stopped Daemons could not be reused, use --status for details
<-------------> 0% EXECUTING [1s]

> Task :ui-test-example:test

SayHelloJavaTest > checkSayHello() FAILED
    com.intellij.remoterobot.utils.WaitForConditionTimeoutException at SayHelloJavaTest.java:35

CreateCommandLineJavaTest > createCommandLineProject() FAILED
    com.intellij.remoterobot.utils.WaitForConditionTimeoutException at CreateCommandLineJavaTest.java:48

SayHelloKotlinTest > checkHelloMessage() FAILED
    com.intellij.remoterobot.utils.WaitForConditionTimeoutException at SayHelloKotlinTest.kt:23

CreateCommandLineKotlinTest > createCommandLineApp() FAILED
    com.intellij.remoterobot.utils.WaitForConditionTimeoutException at CreateCommandLineKotlinTest.kt:37

4 tests completed, 4 failed

> Task :ui-test-example:test FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':ui-test-example:test'.
> There were failing tests. See the report at: file:///Users/fsladkey/Downloads/intellij-ui-test-robot/ui-test-example/build/reports/tests/test/index.html

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

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':ui-test-example:test'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:207)
        at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:263)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:205)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
Caused by: org.gradle.api.GradleException: There were failing tests. See the report at: file:///Users/fsladkey/Downloads/intellij-ui-test-robot/ui-test-example/build/reports/tests/test/index.html
        at org.gradle.api.tasks.testing.AbstractTestTask.handleTestFailures(AbstractTestTask.java:628)
        at org.gradle.api.tasks.testing.AbstractTestTask.executeTests(AbstractTestTask.java:499)
        at org.gradle.api.tasks.testing.Test.executeTests(Test.java:646)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:726)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:693)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:569)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:84)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:554)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:537)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:108)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:278)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:267)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:194)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:186)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:114)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:356)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)


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

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.5.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 1m 27s
15 actionable tasks: 10 executed, 5 up-to-date

and the output of checkSayHello

com.intellij.remoterobot.utils.WaitForConditionTimeoutException: Exceeded timeout (PT2S) for condition function (Failed to find 'HelloWorldDialog' by 'title Hello' in 2s) 
	at com.intellij.remoterobot.utils.RepeatUtilsKt.waitFor(RepeatUtils.kt:38)
	at com.intellij.remoterobot.utils.RepeatUtilsKt.waitFor$default(RepeatUtils.kt:33)
	at com.intellij.remoterobot.SearchContext$find$1.invoke(SearchContext.kt:51)
	at com.intellij.remoterobot.SearchContext$find$1.invoke(SearchContext.kt:15)
	at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:21)
	at com.intellij.remoterobot.SearchContext$DefaultImpls.find(SearchContext.kt:49)
	at com.intellij.remoterobot.RemoteRobot.find(RemoteRobot.kt:28)
	at com.intellij.remoterobot.SearchContext$DefaultImpls.find(SearchContext.kt:32)
	at com.intellij.remoterobot.RemoteRobot.find(RemoteRobot.kt:28)
	at com.intellij.remoterobot.SearchContext$DefaultImpls.find(SearchContext.kt:26)
	at com.intellij.remoterobot.RemoteRobot.find(RemoteRobot.kt:28)
	at org.intellij.examples.simple.plugin.SayHelloJavaTest.checkSayHello(SayHelloJavaTest.java:35)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:515)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:171)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:167)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:114)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:59)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:105)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248)
	at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211)
	at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:132)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy2.stop(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:834)

Discussion: Development and usage under macOs (maybe Linux, Win)

Hi, I have a question regarding the usability of this plugin on small screen during test/debug.

I am developing on macOs, where the cursor is controlled by the test robot. Maybe the other OS have similar behavior.

Here's a few issues I noted.

  1. When the tests are starting, the robot borrows the mouse pointer which prevents the usage of the mouse for other matters while a test suite is running otherwise tests may break. Moreover the tests can be very long this makes the machine unusable for a while.
  2. Regularly the Main window gets behind another window/app – a browser or another IntelliJ window – if this is the case the pointer will trigger actions on the said window/app.
  3. When debugging some components like menu, heavy weight window, etc. looses focus, and in the next step of the debug they are not anymore visible via the robot Dom, this makes the debug clunky, even tedious.
  4. The window can move screens which breaks tests, eg closing the project can bring the welcome frame but on a different frame, which breaks the follow-up actions because the mouse pointer didn't move.

Non exhaustive list.

How are you working around those?


Version : 0.11.7
macOs : 11.6

Output of IDE is spammed with `DEBUG io.netty` logs on Linux

Logs
./gradlew runIdeForUiTests

> Task :frontend:actions:compileJava
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

> Task :runIdeForUiTests
2022-06-13 23:17:12,503 [   2319]   WARN - #c.i.i.DebugAttachDetector - Unable to start DebugAttachDetector, please add `--add-exports java.base/jdk.internal.vm=ALL-UNNAMED` to VM options
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/plipski/git-machete-intellij-plugin/build/idea-sandbox/plugins-uiTest/robot-server-plugin/lib/logback-classic-1.2.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/plipski/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIC/2022.1.1/d76b09018041a7782a5a3fdc412339cef2c51887/ideaIC-2022.1.1/lib/3rd-party-rt.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
23:17:13.372 [JobScheduler FJ pool 4/7] INFO ktor.application - No ktor.deployment.watch patterns specified, automatic reload is not active
23:17:13.691 [JobScheduler FJ pool 4/7] INFO ktor.application - Responding at http://127.0.0.1:8580
23:17:13.704 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.logging.InternalLoggerFactory - Using SLF4J as the default logging framework
23:17:13.747 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false
23:17:13.748 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent0 - Java version: 11
23:17:13.750 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available
23:17:13.752 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available
23:17:13.753 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Buffer.address: available
23:17:13.758 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent0 - direct buffer constructor: unavailable
java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled
        at io.netty.util.internal.ReflectionUtil.trySetAccessible(ReflectionUtil.java:31)
        at io.netty.util.internal.PlatformDependent0$4.run(PlatformDependent0.java:233)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:227)
        at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:289)
        at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:92)
        at io.netty.channel.epoll.Native.loadNativeLibrary(Native.java:247)
        at io.netty.channel.epoll.Native.<clinit>(Native.java:69)
        at io.netty.channel.epoll.Epoll.<clinit>(Epoll.java:39)
        at io.ktor.server.netty.EventLoopGroupProxy$Companion.create(NettyApplicationEngine.kt:212)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:78)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getConnectionEventGroup(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.access$getConnectionEventGroup$p(NettyApplicationEngine.kt:26)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:119)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getBootstraps(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.start(NettyApplicationEngine.kt:148)
        at com.intellij.remoterobot.RobotServerImpl.startServer(RobotServerImpl.kt:320)
        at com.intellij.remoterobot.RobotServerStarter.componentsInitialized(RobotServerStarter.kt:21)
        at com.intellij.idea.ApplicationLoader$callAppInitialized$1$1.run(ApplicationLoader.kt:476)
        at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1407)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:396)
        at java.base/java.util.concurrent.ForkJoinTask.invokeAll(ForkJoinTask.java:853)
        at com.intellij.idea.ApplicationLoader$prepareStart$4$future$1.run(ApplicationLoader.kt:223)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1728)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
23:17:13.790 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.Bits.unaligned: available, true
23:17:13.792 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent0 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable
java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0$6 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @5ff7d534
        at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
        at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
        at java.base/java.lang.reflect.Method.invoke(Method.java:558)
        at io.netty.util.internal.PlatformDependent0$6.run(PlatformDependent0.java:347)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:338)
        at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:289)
        at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:92)
        at io.netty.channel.epoll.Native.loadNativeLibrary(Native.java:247)
        at io.netty.channel.epoll.Native.<clinit>(Native.java:69)
        at io.netty.channel.epoll.Epoll.<clinit>(Epoll.java:39)
        at io.ktor.server.netty.EventLoopGroupProxy$Companion.create(NettyApplicationEngine.kt:212)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:78)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getConnectionEventGroup(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.access$getConnectionEventGroup$p(NettyApplicationEngine.kt:26)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:119)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getBootstraps(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.start(NettyApplicationEngine.kt:148)
        at com.intellij.remoterobot.RobotServerImpl.startServer(RobotServerImpl.kt:320)
        at com.intellij.remoterobot.RobotServerStarter.componentsInitialized(RobotServerStarter.kt:21)
        at com.intellij.idea.ApplicationLoader$callAppInitialized$1$1.run(ApplicationLoader.kt:476)
        at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1407)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:396)
        at java.base/java.util.concurrent.ForkJoinTask.invokeAll(ForkJoinTask.java:853)
        at com.intellij.idea.ApplicationLoader$prepareStart$4$future$1.run(ApplicationLoader.kt:223)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1728)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
23:17:13.826 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent0 - java.nio.DirectByteBuffer.<init>(long, int): unavailable
23:17:13.826 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent - sun.misc.Unsafe: available
23:17:13.828 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent - maxDirectMemory: 536870912 bytes (maybe)
23:17:13.829 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.tmpdir: /tmp (java.io.tmpdir)
23:17:13.830 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.bitMode: 64 (sun.arch.data.model)
23:17:13.832 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.maxDirectMemory: -1 bytes
23:17:13.833 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.uninitializedArrayAllocationThreshold: -1
23:17:13.836 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.CleanerJava9 - java.nio.ByteBuffer.cleaner(): available
23:17:13.837 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent - -Dio.netty.noPreferDirect: false
23:17:13.844 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.NativeLibraryLoader - -Dio.netty.native.workdir: /tmp (io.netty.tmpdir)
23:17:13.845 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.NativeLibraryLoader - -Dio.netty.native.deleteLibAfterLoading: true
23:17:13.847 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.NativeLibraryLoader - -Dio.netty.native.tryPatchShadedId: true
23:17:13.851 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.NativeLibraryLoader - Unable to load the library 'netty_transport_native_epoll_x86_64', trying other loading mechanism.
java.lang.UnsatisfiedLinkError: null
        at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:384)
        at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:341)
        at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:136)
        at io.netty.channel.epoll.Native.loadNativeLibrary(Native.java:250)
        at io.netty.channel.epoll.Native.<clinit>(Native.java:69)
        at io.netty.channel.epoll.Epoll.<clinit>(Epoll.java:39)
        at io.ktor.server.netty.EventLoopGroupProxy$Companion.create(NettyApplicationEngine.kt:212)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:78)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getConnectionEventGroup(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.access$getConnectionEventGroup$p(NettyApplicationEngine.kt:26)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:119)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getBootstraps(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.start(NettyApplicationEngine.kt:148)
        at com.intellij.remoterobot.RobotServerImpl.startServer(RobotServerImpl.kt:320)
        at com.intellij.remoterobot.RobotServerStarter.componentsInitialized(RobotServerStarter.kt:21)
        at com.intellij.idea.ApplicationLoader$callAppInitialized$1$1.run(ApplicationLoader.kt:476)
        at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1407)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:396)
        at java.base/java.util.concurrent.ForkJoinTask.invokeAll(ForkJoinTask.java:853)
        at com.intellij.idea.ApplicationLoader$prepareStart$4$future$1.run(ApplicationLoader.kt:223)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1728)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
Caused by: java.lang.reflect.InvocationTargetException: null
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:371)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:363)
        ... 31 common frames omitted
Caused by: java.lang.NoSuchMethodError: Method io.netty.channel.epoll.NativeStaticallyReferencedJniMethods.tcpFastopenMode()I not found
        at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
        at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2442)
        at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2498)
        at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2694)
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2659)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
        at java.base/java.lang.System.loadLibrary(System.java:1873)
        at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38)
        ... 38 common frames omitted
23:17:13.903 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.NativeLibraryLoader - netty_transport_native_epoll_x86_64 cannot be loaded from java.library.path, now trying export to -Dio.netty.native.workdir: /tmp
java.lang.NoSuchMethodError: Method io.netty.channel.epoll.NativeStaticallyReferencedJniMethods.tcpFastopenMode()I not found
        at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
        at java.base/java.lang.ClassLoader$NativeLibrary.load(ClassLoader.java:2442)
        at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(ClassLoader.java:2498)
        at java.base/java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2694)
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2659)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
        at java.base/java.lang.System.loadLibrary(System.java:1873)
        at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38)
        at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:351)
        at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:136)
        at io.netty.channel.epoll.Native.loadNativeLibrary(Native.java:250)
        at io.netty.channel.epoll.Native.<clinit>(Native.java:69)
        at io.netty.channel.epoll.Epoll.<clinit>(Epoll.java:39)
        at io.ktor.server.netty.EventLoopGroupProxy$Companion.create(NettyApplicationEngine.kt:212)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:78)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getConnectionEventGroup(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.access$getConnectionEventGroup$p(NettyApplicationEngine.kt:26)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:119)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getBootstraps(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.start(NettyApplicationEngine.kt:148)
        at com.intellij.remoterobot.RobotServerImpl.startServer(RobotServerImpl.kt:320)
        at com.intellij.remoterobot.RobotServerStarter.componentsInitialized(RobotServerStarter.kt:21)
        at com.intellij.idea.ApplicationLoader$callAppInitialized$1$1.run(ApplicationLoader.kt:476)
        at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1407)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:396)
        at java.base/java.util.concurrent.ForkJoinTask.invokeAll(ForkJoinTask.java:853)
        at com.intellij.idea.ApplicationLoader$prepareStart$4$future$1.run(ApplicationLoader.kt:223)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1728)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
23:17:13.925 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.NativeLibraryLoader - Unable to load the library 'netty_transport_native_epoll', trying other loading mechanism.
java.lang.UnsatisfiedLinkError: no netty_transport_native_epoll in java.library.path: [/usr/java/packages/lib, /usr/lib64, /lib64, /lib, /usr/lib]
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2670)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
        at java.base/java.lang.System.loadLibrary(System.java:1873)
        at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:371)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:363)
        at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:341)
        at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:136)
        at io.netty.channel.epoll.Native.loadNativeLibrary(Native.java:253)
        at io.netty.channel.epoll.Native.<clinit>(Native.java:69)
        at io.netty.channel.epoll.Epoll.<clinit>(Epoll.java:39)
        at io.ktor.server.netty.EventLoopGroupProxy$Companion.create(NettyApplicationEngine.kt:212)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:78)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getConnectionEventGroup(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.access$getConnectionEventGroup$p(NettyApplicationEngine.kt:26)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:119)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getBootstraps(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.start(NettyApplicationEngine.kt:148)
        at com.intellij.remoterobot.RobotServerImpl.startServer(RobotServerImpl.kt:320)
        at com.intellij.remoterobot.RobotServerStarter.componentsInitialized(RobotServerStarter.kt:21)
        at com.intellij.idea.ApplicationLoader$callAppInitialized$1$1.run(ApplicationLoader.kt:476)
        at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1407)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:396)
        at java.base/java.util.concurrent.ForkJoinTask.invokeAll(ForkJoinTask.java:853)
        at com.intellij.idea.ApplicationLoader$prepareStart$4$future$1.run(ApplicationLoader.kt:223)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1728)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
23:17:13.945 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.NativeLibraryLoader - netty_transport_native_epoll cannot be loaded from java.library.path, now trying export to -Dio.netty.native.workdir: /tmp
java.lang.UnsatisfiedLinkError: no netty_transport_native_epoll in java.library.path: [/usr/java/packages/lib, /usr/lib64, /lib64, /lib, /usr/lib]
        at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2670)
        at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
        at java.base/java.lang.System.loadLibrary(System.java:1873)
        at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38)
        at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:351)
        at io.netty.util.internal.NativeLibraryLoader.load(NativeLibraryLoader.java:136)
        at io.netty.channel.epoll.Native.loadNativeLibrary(Native.java:253)
        at io.netty.channel.epoll.Native.<clinit>(Native.java:69)
        at io.netty.channel.epoll.Epoll.<clinit>(Epoll.java:39)
        at io.ktor.server.netty.EventLoopGroupProxy$Companion.create(NettyApplicationEngine.kt:212)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:78)
        at io.ktor.server.netty.NettyApplicationEngine$connectionEventGroup$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getConnectionEventGroup(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.access$getConnectionEventGroup$p(NettyApplicationEngine.kt:26)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:119)
        at io.ktor.server.netty.NettyApplicationEngine$bootstraps$2.invoke(NettyApplicationEngine.kt:26)
        at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
        at io.ktor.server.netty.NettyApplicationEngine.getBootstraps(NettyApplicationEngine.kt)
        at io.ktor.server.netty.NettyApplicationEngine.start(NettyApplicationEngine.kt:148)
        at com.intellij.remoterobot.RobotServerImpl.startServer(RobotServerImpl.kt:320)
        at com.intellij.remoterobot.RobotServerStarter.componentsInitialized(RobotServerStarter.kt:21)
        at com.intellij.idea.ApplicationLoader$callAppInitialized$1$1.run(ApplicationLoader.kt:476)
        at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1407)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:396)
        at java.base/java.util.concurrent.ForkJoinTask.invokeAll(ForkJoinTask.java:853)
        at com.intellij.idea.ApplicationLoader$prepareStart$4$future$1.run(ApplicationLoader.kt:223)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
        at java.base/java.util.concurrent.CompletableFuture$AsyncRun.exec(CompletableFuture.java:1728)
        at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
        at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
        at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
        at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
        at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
        Suppressed: java.lang.UnsatisfiedLinkError: no netty_transport_native_epoll in java.library.path: [/usr/java/packages/lib, /usr/lib64, /lib64, /lib, /usr/lib]
                at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2670)
                at java.base/java.lang.Runtime.loadLibrary0(Runtime.java:830)
                at java.base/java.lang.System.loadLibrary(System.java:1873)
                at io.netty.util.internal.NativeLibraryUtil.loadLibrary(NativeLibraryUtil.java:38)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.base/java.lang.reflect.Method.invoke(Method.java:566)
                at io.netty.util.internal.NativeLibraryLoader$1.run(NativeLibraryLoader.java:371)
                at java.base/java.security.AccessController.doPrivileged(Native Method)
                at io.netty.util.internal.NativeLibraryLoader.loadLibraryByHelper(NativeLibraryLoader.java:363)
                at io.netty.util.internal.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:341)
                ... 30 common frames omitted
23:17:14.005 [JobScheduler FJ pool 4/7] DEBUG io.netty.channel.MultithreadEventLoopGroup - -Dio.netty.eventLoopThreads: 16
23:17:14.036 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.initialSize: 1024
23:17:14.037 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.maxSize: 4096
23:17:14.051 [JobScheduler FJ pool 4/7] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.noKeySetOptimization: false
23:17:14.052 [JobScheduler FJ pool 4/7] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.selectorAutoRebuildThreshold: 512
23:17:14.067 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.internal.PlatformDependent - org.jctools-core.MpscChunkedArrayQueue: available
23:17:14.109 [JobScheduler FJ pool 4/7] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.processId: 22830 (user-set)
23:17:14.111 [JobScheduler FJ pool 4/7] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.machineId: 28:f0:76:ff:fe:16:65:0e (user-set)
23:17:14.132 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.level: simple
23:17:14.133 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.targetRecords: 4
23:17:14.185 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numHeapArenas: 1
23:17:14.186 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numDirectArenas: 1
23:17:14.186 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.pageSize: 8192
23:17:14.188 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxOrder: 11
23:17:14.189 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.chunkSize: 16777216
23:17:14.190 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.tinyCacheSize: 512
23:17:14.190 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.smallCacheSize: 256
23:17:14.191 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.normalCacheSize: 64
23:17:14.197 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedBufferCapacity: 32768
23:17:14.198 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimInterval: 8192
23:17:14.199 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimIntervalMillis: 600000
23:17:14.200 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.useCacheForAllThreads: false
23:17:14.201 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedByteBuffersPerChunk: 1023
23:17:14.224 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.allocator.type: pooled
23:17:14.225 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.threadLocalDirectBufferSize: 0
23:17:14.226 [JobScheduler FJ pool 4/7] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.maxThreadLocalCharBufferSize: 16384
23:17:14.230 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.NetUtil - -Djava.net.preferIPv4Stack: false
23:17:14.230 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.NetUtil - -Djava.net.preferIPv6Addresses: false
23:17:14.232 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.NetUtil - Loopback interface: lo (lo, 0:0:0:0:0:0:0:1%lo)
23:17:14.234 [JobScheduler FJ pool 4/7] DEBUG io.netty.util.NetUtil - /proc/sys/net/core/somaxconn: 4096

These logs come from Netty (via RobotServerImpl and Ktor) and don't seem particularly important... I thought it's the problem with logback config in robot-server-plugin, but AFAICS in https://github.com/JetBrains/intellij-ui-test-robot/blob/master/robot-server-plugin/src/main/logback.xml#L13, level for io.netty is INFO 🤔

ExtractedData has surprising behavior

  1. hasText has some interesting behavior due to it caches the data and only refreshes in negative conditions.

The code:

waitFor { comp.hasText("loading...") == false }

will run forever since it will only refresh the data if it can't be found.

Meaning using it against an AsyncTreeModel will run the risk of an infinitive loop even after the tree has been loaded.

You instead have to do findAll().any(), which is fine but not obvious without reading the actual source.

This is made worse by Fixture sometimes using this method depending on its hasText signature:

  fun hasText(txt: String): Boolean = data.hasText(txt)
  fun hasText(filter: (TextData) -> Boolean): Boolean = data.getMany(filter).isNotEmpty()
  fun hasText(textPredicate: Predicate<TextData>): Boolean = data.getMany { textPredicate.test(it) }.isNotEmpty()
  1. getAll and getOne will never refresh the data, instead you need to call getMany. getMany is what Fixture delegates to though, so that is less of an issue but still confusing.

IdeaSideException/TimeoutException while working with the gradle tasks tree (JTreeFixture) on OS X

  • issue appear only on OS X

  • issue reported and described here (there is a workaround - use the button for expanding the gradle tasks tree) - redhat-developer/intellij-common-ui-test-library#126

  • The following method call caused IdeaSideException/TimeoutException while working with the gradle task tree:
    gradleTaskTree().expandAll();

  • gradleTaskTree() is JTreeFixture for the gradle tasks tree:
    find(JTreeFixture.class, JTreeFixture.Companion.byType(), Duration.ofSeconds(10));

  • LINK TO THE CODE WHERE EXCEPTION APPERS

  • if it is an issue in the Remote-Robot it should be fixed

Stacktrace:

com.intellij.remoterobot.client.IdeaSideException: Wrapped java.util.concurrent.TimeoutException
	at com.intellij.remoterobot.client.IdeRobotClient.throwIdeaSideError(IdeRobotClient.kt:142)
	at com.intellij.remoterobot.client.IdeRobotClient.processExecuteResponse(IdeRobotClient.kt:109)
	at com.intellij.remoterobot.client.IdeRobotClient.execute(IdeRobotClient.kt:63)
	at com.intellij.remoterobot.JavaScriptApi$DefaultImpls.runJs(JavaScriptApi.kt:57)
	at com.intellij.remoterobot.RemoteRobot.runJs(RemoteRobot.kt:32)
	at com.intellij.remoterobot.fixtures.Fixture.runJs(Fixture.kt:92)
	at com.intellij.remoterobot.fixtures.Fixture.runJs$default(Fixture.kt:85)
	at com.intellij.remoterobot.fixtures.JTreeFixture$expandAll$1.invoke(JTreeFixture.kt:132)
	at com.intellij.remoterobot.fixtures.JTreeFixture$expandAll$1.invoke(JTreeFixture.kt:131)
	at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:23)
	at com.intellij.remoterobot.fixtures.JTreeFixture.expandAll(JTreeFixture.kt:131)
	at com.redhat.devtools.intellij.commonuitest.fixtures.mainidewindow.toolwindowspane.buildtoolpane.GradleBuildToolPane.buildProject(GradleBuildToolPane.java:76)

IdeaSideException when clicking on items in HeavyWeightWindow

  • Remote-Robot version 0.11.2 (not sure if not fixed in newer version)
  • Despite the exception, clicking on items works without any issue, just catching the exception is a workaround that works for me (see the Workaround that works for me section below containing the code with try catch block I am talking about)

Exception appears when clicking on Project SDK items in HeavyWeightWindow:

Snímek obrazovky 2021-08-22 v 12 58 14

Code:

final ComponentFixture projectSdkList = remoteRobot.find(ComponentFixture.class, byXpath("//div[@class='HeavyWeightWindow']"), Duration.ofSeconds(10));
List<RemoteText> sdkItems = projectSdkList.findAllText();
for (RemoteText sdkItem : sdkItems) {
    if (sdkItem.getText().contains(targetSdkName)) {
        sdkItem.click();
    }
}

Workaround that works for me:

final ComponentFixture projectSdkList = remoteRobot.find(ComponentFixture.class, byXpath("//div[@class='HeavyWeightWindow']"), Duration.ofSeconds(10));
List<RemoteText> sdkItems = projectSdkList.findAllText();
for (RemoteText sdkItem : sdkItems) {
    if (sdkItem.getText().contains(targetSdkName)) {
        try {
            sdkItem.click();
        } catch (Exception e) {
            break;
        }
    }
}

Stacktrace:

Exceeded timeout (PT5S) for condition function  
com.intellij.remoterobot.client.IdeaSideException: Exceeded timeout (PT5S) for condition function  
	at com.intellij.remoterobot.client.IdeRobotClient.throwIdeaSideError(IdeRobotClient.kt:142)
	at com.intellij.remoterobot.client.IdeRobotClient.processExecuteResponse(IdeRobotClient.kt:109)
	at com.intellij.remoterobot.client.IdeRobotClient.execute(IdeRobotClient.kt:55)
	at com.intellij.remoterobot.LambdaApi$DefaultImpls.execute(LambdaApi.kt:24)
	at com.intellij.remoterobot.RemoteRobot.execute(RemoteRobot.kt:32)
	at com.intellij.remoterobot.LambdaApi$DefaultImpls.execute$default(LambdaApi.kt:23)
	at com.intellij.remoterobot.fixtures.dataExtractor.RemoteText$click$1.invoke(RemoteText.kt:21)
	at com.intellij.remoterobot.fixtures.dataExtractor.RemoteText$click$1.invoke(RemoteText.kt:10)
	at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:23)
	at com.intellij.remoterobot.fixtures.dataExtractor.RemoteText.click(RemoteText.kt:17)
	at com.intellij.remoterobot.fixtures.dataExtractor.RemoteText.click(RemoteText.kt:28)
	at com.intellij.remoterobot.fixtures.dataExtractor.RemoteText.click$default(RemoteText.kt:27)
	at com.intellij.remoterobot.fixtures.dataExtractor.RemoteText.click(RemoteText.kt)
	at com.redhat.devtools.intellij.commonUiTestLibrary.fixtures.dialogs.projectManipulation.NewProjectDialog.setProjectSdkIfAvailable(NewProjectDialog.java:81)
	at com.redhat.devtools.intellij.commonUiTestLibrary.LibraryTestBase.prepareGradleJavaProject(LibraryTestBase.java:89)
	at com.redhat.devtools.intellij.commonUiTestLibrary.fixturesTest.mainIdeWindow.toolWindowsPane.ToolWindowsPaneTest.toolWindowsPaneGradleTest(ToolWindowsPaneTest.java:50)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:210)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy2.stop(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:135)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:834)
	Suppressed: com.intellij.remoterobot.utils.WaitForConditionTimeoutException: Exceeded timeout (PT2S) for condition function (Failed to find 'ComponentFixture' by '//div[@class='IdeFrameImpl']' in 2s) 
		at com.intellij.remoterobot.utils.RepeatUtilsKt.waitFor(RepeatUtils.kt:40)
		at com.intellij.remoterobot.utils.RepeatUtilsKt.waitFor$default(RepeatUtils.kt:35)
		at com.intellij.remoterobot.SearchContext$find$1.invoke(SearchContext.kt:53)
		at com.intellij.remoterobot.SearchContext$find$1.invoke(SearchContext.kt:17)
		at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:23)
		at com.intellij.remoterobot.SearchContext$DefaultImpls.find(SearchContext.kt:51)
		at com.intellij.remoterobot.RemoteRobot.find(RemoteRobot.kt:32)
		at com.intellij.remoterobot.SearchContext$DefaultImpls.find(SearchContext.kt:45)
		at com.intellij.remoterobot.RemoteRobot.find(RemoteRobot.kt:32)
		at com.redhat.devtools.intellij.commonUiTestLibrary.fixtures.mainIdeWindow.MainIdeWindow.lambda$closeProject$1(MainIdeWindow.java:59)
		at com.intellij.remoterobot.stepsProcessing.StepWorkerKt$step$1.invoke(StepWorker.kt:16)
		at com.intellij.remoterobot.stepsProcessing.StepWorkerKt$step$1.invoke(StepWorker.kt)
		at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:23)
		at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:15)
		at com.redhat.devtools.intellij.commonUiTestLibrary.fixtures.mainIdeWindow.MainIdeWindow.closeProject(MainIdeWindow.java:58)
		at com.redhat.devtools.intellij.commonUiTestLibrary.fixturesTest.mainIdeWindow.toolWindowsPane.ToolWindowsPaneTest.closeTheProject(ToolWindowsPaneTest.java:37)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
		at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
		at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
		at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
		at org.junit.jupiter.engine.extension.TimeoutExtension.interceptLifecycleMethod(TimeoutExtension.java:126)
		at org.junit.jupiter.engine.extension.TimeoutExtension.interceptAfterEachMethod(TimeoutExtension.java:108)
		at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
		at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
		at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
		at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
		at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
		at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
		at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
		at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
		at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeMethodInExtensionContext(ClassBasedTestDescriptor.java:490)
		at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$synthesizeAfterEachMethodAdapter$20(ClassBasedTestDescriptor.java:480)
		at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAfterEachMethods$9(TestMethodTestDescriptor.java:236)
		at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAllAfterMethodsOrCallbacks$12(TestMethodTestDescriptor.java:269)
		at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
		at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeAllAfterMethodsOrCallbacks$13(TestMethodTestDescriptor.java:269)
		at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
		at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeAllAfterMethodsOrCallbacks(TestMethodTestDescriptor.java:268)
		at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeAfterEachMethods(TestMethodTestDescriptor.java:234)
		at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)
		... 68 more
Caused by: java.lang.Throwable: Exceeded timeout (PT5S) for condition function  

No matching variant of org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.2.1 was found

Right after the clone I tried to run "./gradlew ui-test-example:clean ui-test-example:runIdeForUiTests & ./gradlew ui-test-example:test" but got errors:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project 'intellij-ui-test-robot'.
> Could not resolve all artifacts for configuration ':classpath'.
   > Could not resolve org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.2.1.
     Required by:
         project : > org.jetbrains.intellij:org.jetbrains.intellij.gradle.plugin:1.2.1
      > No matching variant of org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.2.1 was found. The consumer was configured to find a runtime of a library compatible with Java 8, packaged as a jar, and its dependencies declared externally but:
          - Variant 'apiElements' capability org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.2.1 declares a library, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares an API of a component compatible with Java 11 and the consumer needed a runtime of a component compatible with Java 8
          - Variant 'runtimeElements' capability org.jetbrains.intellij.plugins:gradle-intellij-plugin:1.2.1 declares a runtime of a library, packaged as a jar, and its dependencies declared externally:
              - Incompatible because this component declares a component compatible with Java 11 and the consumer needed a component compatible with Java 8

* 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 519ms

[4]+  Stopped                 ./gradlew ui-test-example:clean ui-test-example:runIdeForUiTests

Env: macOS Big Sur 11.6

Error running with headless Android Studio

I'm trying to run this robot with AS in an AWS EC2 instance, loosely following the headless example given in the Github Actions workflow, but I'm running into an error starting the IDE with runIdeForUiTests.

com.intellij.diagnostic.PluginException: Fatal error initializing 'com.intellij.ide.ui.LafManager' [Plugin: com.intellij]

This seems like it stems from using the wrong java runtime, but I am using the runtime bundled with the IDE:

* What went wrong:
Execution failed for task ':runIdeForUiTests'.
> Process 'command '/usr/local/AI-202.7660.26.42.7322048-android-studio/jre/bin/java'' finished with non-zero exit value 3

OS info:

NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

Any idea what is going wrong here, and what I can do to get it working?

Is it possible for switch the classloader in Rhino code?

AFAICS Rhino executed via com.intellij.remoterobot.RemoteRobot#callJs(java.lang.String, boolean) (or runJs) is executed with PluginClassLoader for Robot server as context classloader. Attempt to setContextClassLoader to the PluginClassLoader of the tested plugin's don't seem to work:

Rhino code:

  const pluginId = PluginId.getId('com.virtuslab.git-machete');
  const pluginClassLoader = PluginManagerCore.getPlugin(pluginId).getPluginClassLoader();
  Thread.currentThread().setContextClassLoader(pluginClassLoader);
  const providerClass = Class.forName('com.virtuslab.gitmachete.frontend.ui.providerservice.SelectedGitRepositoryProvider'); // some class from my plugin

results in:

        java.lang.Throwable: Wrapped java.lang.ClassNotFoundException: com.virtuslab.gitmachete.frontend.ui.providerservice.SelectedGitRepositoryProvider
 PluginClassLoader(plugin=PluginDescriptor(name=Robot server, id=com.jetbrains.test.robot-server-plugin, 
descriptorPath=plugin.xml, path=/tmp/ide-probe/instances/intellij-instance-2022.1--QLOZN9sdT3iaH2Vwk9Djew/plugins/robot-server-plugin, 
version=0.11.13, package=null, isBundled=true), packagePrefix=null, instanceId=20, state=active)

So it seems that Rhino uses Robot server's PluginClassLoader, no matter what setContextClassLoader points to. Is there any way around that?

Click seems to not working

Hi

I tried to use this plugin on my mac - but it looks like the click is not working properly.

com.intellij.remoterobot.utils.WaitForConditionTimeoutException: Exceeded timeout (PT5S) for condition function (Failed to find 'Button' by 'text 'Finish'' in 5s) 
	at com.intellij.remoterobot.utils.RepeatUtilsKt.waitFor(RepeatUtils.kt:38)
	at com.intellij.remoterobot.utils.RepeatUtilsKt.waitFor$default(RepeatUtils.kt:33)
	at com.intellij.remoterobot.SearchContext$find$1.invoke(SearchContext.kt:51)
	at com.intellij.remoterobot.SearchContext$find$1.invoke(SearchContext.kt:15)
	at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:21)
	at com.intellij.remoterobot.SearchContext$DefaultImpls.find(SearchContext.kt:49)
	at com.intellij.remoterobot.fixtures.ContainerFixture.find(ContainerFixture.kt:11)
	at com.intellij.remoterobot.fixtures.CommonContainerFixture.button(CommonContainerFixture.kt:180)

I am using:

IntelliJ IDEA 2020.3 (Ultimate Edition)
Build #IU-203.5981.155, built on December 1, 2020
Licensed to Jonathan / Jonathan Gafner
Subscription is active until January 11, 2021
Runtime version: 11.0.9+11-b1145.21 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 10.16
GC: ParNew, ConcurrentMarkSweep
Memory: 6099M
Cores: 8
Registry: analyze.exceptions.on.the.fly=true
Non-Bundled Plugins: com.gafner.giv, com.dmarcotte.handlebars, org.jetbrains.kotlin, com.jetbrains.edu, com.google.gct.core, com.intellij.plugins.html.instantEditing, com.jetbrains.php

The find operation looks ending ok.

16:52:59 INFO : Search 'Welcome Frame' by 'type'
16:52:59 INFO : Search 'Action link' by 'New Project'
16:52:59 INFO : ..click
16:53:01 INFO : Search for dialog with title New Project
16:53:01 INFO :     Search 'Dialog' by 'title New Project'
16:53:22 WARN :         Failed on step: Search 'Dialog' by 'title New Project' (StepWorker.kt_step)
16:53:22 WARN :     Failed on step: Search for dialog with title New Project (StepWorker.kt_step)
16:53:22 INFO : Search 'Idea frame' by 'IdeFrameImpl type'

If I click on the "New Project" it failed on the next click:

16:54:03 INFO : Search 'Welcome Frame' by 'type'
16:54:03 INFO : Search 'Action link' by 'New Project'
16:54:03 INFO : ..click
16:54:05 INFO : Search for dialog with title New Project
16:54:05 INFO :     Search 'Dialog' by 'title New Project'
16:54:09 INFO :     ..click at 'Java'
16:54:11 INFO :     Search 'ComponentFixture' by '//div[@class='FrameworksTree']'
16:54:11 INFO :     ..click at 'Kotlin/JVM'
16:54:13 INFO :     Search 'Button' by 'text 'Next''
16:54:13 INFO :     ..click
16:54:14 INFO :     Search 'Button' by 'text 'Finish''
16:54:20 WARN :         Failed on step: Search 'Button' by 'text 'Finish'' (StepWorker.kt_step)
16:54:20 WARN :     Failed on step: Search for dialog with title New Project (StepWorker.kt_step)
16:54:20 INFO : Search 'Idea frame' by 'IdeFrameImpl type'

The robot thinks the click went ok but it did not.

ReferenceError: "local" is not defined. (js#9)

When the next code runs, I got the next error.
Code:
find<TextEditorFixture>(EditorFixture.locator)
Error:

ReferenceError: "local" is not defined. (js#9)
com.intellij.remoterobot.client.IdeaSideException: ReferenceError: "local" is not defined. (js#9)
	at com.intellij.remoterobot.client.IdeRobotClient.throwIdeaSideError(IdeRobotClient.kt:142)
	at com.intellij.remoterobot.client.IdeRobotClient.processExecuteResponse(IdeRobotClient.kt:109)
	at com.intellij.remoterobot.client.IdeRobotClient.execute(IdeRobotClient.kt:63)
	at com.intellij.remoterobot.JavaScriptApi$DefaultImpls.runJs(JavaScriptApi.kt:57)
	at com.intellij.remoterobot.RemoteRobot.runJs(RemoteRobot.kt:32)
	at com.intellij.remoterobot.fixtures.Fixture.runJs(Fixture.kt:92)
	at com.intellij.remoterobot.fixtures.Fixture.runJs$default(Fixture.kt:85)
	at com.intellij.remoterobot.fixtures.EditorFixture.<init>(TextEditorFixture.kt:109)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
	at com.intellij.remoterobot.SearchContext$find$1.invoke(SearchContext.kt:69)
	at com.intellij.remoterobot.SearchContext$find$1.invoke(SearchContext.kt:51)
	at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:23)
	at com.intellij.remoterobot.SearchContext$DefaultImpls.find(SearchContext.kt:51)
	at com.intellij.remoterobot.fixtures.ContainerFixture.find(ContainerFixture.kt:12)

How can I avoid this error?

NoClassDefFoundError: org/slf4j/LoggerFactory exception while trying to start tests

  • I am getting this exception when trying to start tests after update from Remote-Robot 0.11.13 to 0.11.15 (I did not test 0.11.14)
org/slf4j/LoggerFactory
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
	at com.intellij.remoterobot.stepsProcessing.LogKt.<clinit>(Log.kt:8)
	at com.intellij.remoterobot.stepsProcessing.StepLogger.doBeforeStep(StepLogger.kt:18)
	at com.intellij.remoterobot.stepsProcessing.StepWorkerKt.step(StepWorker.kt:21)
	at com.redhat.devtools.intellij.commonuitest.UITestRunner.runIde(UITestRunner.java:70)
	at org.jboss.tools.intellij.quarkus.tests.AbstractQuarkusTest.startIntelliJ(AbstractQuarkusTest.java:36)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:515)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.lambda$invokeBeforeAllMethods$8(ClassTestDescriptor.java:373)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.invokeBeforeAllMethods(ClassTestDescriptor.java:372)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.before(ClassTestDescriptor.java:201)
	at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.before(ClassTestDescriptor.java:74)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:102)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:108)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67)
	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:96)
	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:75)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:99)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:79)
	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:75)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
	at com.sun.proxy.$Proxy5.stop(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:133)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 65 more

JetBrains Tree causes NPE when rendering for XPath

I do not see this error in 0.9.35 and I do not have the source for that revision to help triage:

It looks to be the clipping rectangle is not set which Tree always expects in its paint method.

java.lang.NullPointerException
at com.intellij.ui.treeStructure.Tree.paint(Tree.java:219)
at com.intellij.remoterobot.services.dataExtractor.TextParser.parseData(TextParser.kt:36)
at com.intellij.remoterobot.services.dataExtractor.TextParser.parseComponent(TextParser.kt:22)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$Companion.fillElement(XpathDataModelCreator.kt:137)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$Companion.createElement(XpathDataModelCreator.kt:57)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$Companion.addComponent(XpathDataModelCreator.kt:32)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$Companion.addComponent(XpathDataModelCreator.kt:49)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$Companion.addComponent(XpathDataModelCreator.kt:49)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$Companion.addComponent(XpathDataModelCreator.kt:49)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$Companion.addComponent(XpathDataModelCreator.kt:49)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$Companion.addComponent(XpathDataModelCreator.kt:49)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$Companion.access$addComponent(XpathDataModelCreator.kt:24)
at com.intellij.remoterobot.services.xpath.XpathDataModelCreator$create$1.executeInEDT(XpathDataModelCreator.kt:260)
at org.assertj.swing.edt.GuiTask.run(GuiTask.java:36)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:974)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:847)
at com.intellij.ide.IdeEventQueue.lambda$null$8(IdeEventQueue.java:449)
at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:739)
at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$9(IdeEventQueue.java:448)
at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:831)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:502)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
java.lang.IllegalStateException: Text parsing error. Can't do paint on Tree
at com.intellij.remoterobot.services.dataExtractor.TextParser$parseData$1.executeInEDT(TextParser.kt:43)
at org.assertj.swing.edt.GuiTask.run(GuiTask.java:36)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivile

logback (or any SLF4J impl, for that matter) shouldn't probably be shipped with robot-server-plugin

Note that IntelliJ has its own implementation SLF4J bundled, and hence running IntelliJ with the plugin leads to a SLF4J warning:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/plipski/intellij-ui-test-robot/robot-server-plugin/build/idea-sandbox/plugins/robot-server-plugin/lib/logback-classic-1.2.11.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/plipski/.gradle/caches/modules-2/files-2.1/com.jetbrains.intellij.idea/ideaIC/LATEST-EAP-SNAPSHOT/1d1379e000cefa3de748ead2a1b3702ef1798bf4/ideaIC-LATEST-EAP-SNAPSHOT/lib/3rd-party-rt.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

Would it make sense to remove the dependency on logback from robot-server-plugin/build.gradle.kts + also remove logback.xml in this module? The exclusion of slf4j-api is still a good idea, can in fact be done globally (and not on a per-dependency mode) as in e.g. this plugin of ours.

As a bonus, removing logback dependency automatically solves #190, as I've just checked.

Logs from Ktor/Netty can still be controlled via IntelliJ's centralized Debug Log Settings if absolutely needed.

Create function for closing/quitting the IDE

  • function for complete quitting the IntelliJ IDEA after all the the UI tests has been performed would be really useful, something like:
    remoteRobot.quitIde();

  • this function would close the IDE and completely kill/destroy the whole process in which the IDE run for the UI tests

ComponentLookupException while trying to access ComboBox using build in fixture

Code that throws ComponentLookupException:
ComponentFixture projectJdkComboBox = comboBox(byXpath("//div[@accessiblename='Project SDK:' and @class='JPanel']"), Duration.ofSeconds(10));

Code that also throws the same ComponentLookupException:
ComboBoxFixture projectJdkComboBox = findAll(ComboBoxFixture.class, byXpath("//div[@accessiblename='Project SDK:' and @class='JPanel']")).get(0);

Code that works:
ComponentFixture projectJdkComboBox = findAll(ComponentFixture.class, byXpath("//div[@accessiblename='Project SDK:' and @class='JPanel']")).get(0);

Error msg details:
Wrapped org.assertj.swing.exception.ComponentLookupException: Unable to find component using matcher org.assertj.swing.core.NameMatcher[name='javax.swing.JPanel[,91,5,491x30,layout=java.awt.GridBagLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]', type=javax.swing.JComboBox, requireShowing=true].

Snímek obrazovky 2021-10-02 v 19 43 47

More functionality to TextEditorFixture.kt

I want to ask about EditorFixture, is it possible to expand functionality of editor?
I mean some default functions as "select text", "copy", "paste", "insert text".
If it is possible, I could try to implement it. If not, do you plan to add this functions? If not, I can implement it in my project by myself.

https://github.com/JetBrains/intellij-ui-test-robot/blob/master/remote-fixtures/src/main/kotlin/com/intellij/remoterobot/fixtures/TextEditorFixture.kt

Duplicate `JPopupMenuFixture`, macOs, v0.11.7

Hey I came across, what I think is a bug when rewriting a query to access a menu form the main menu bar.

In order to be able to use script the menu bar I had to pass this system property (apple.laf.useScreenMenuBar=false) as mentioned in my comment #17 (comment)

I wrote this code

robot.find(byXpath("//div[@text='${path[0]}']//div[@text='${path[1]}']"))

And when replacing it with JPopupMenuFixture, the find method failed because two fixtures of the same menu showed up.

To workaround this I replaced find by findAll and taking the first item.

attempt(tries = 3) {
    menuBar.select(path[0])
}

return robot.findAll<JPopupMenuFixture>(JPopupMenuFixture.byContainsItem(path[1]))
    .map { it.menuItem(path[1]) }
    .firstOrNull() // select the first item

Do not show hidden components in Hierarchy

The component can have correct bounds and be visible but one of parents has some 'zero' bounds. You can see that ActionToolbarImpl has -1 height and TwoSideComponent 0 x -1 size. Therefore they are invisible for a user.

Exception when starting IntelliJ 2022.1 for UI tests

Unable to start IntelliJ 2022.1, exception appears (2021.3 and older starts without issue)

Cmd run in src/test-project folder in shared library project (and also in projects to that are this library connected):
https://github.com/redhat-developer/intellij-common-ui-test-library/tree/main/src/test-project

Command:
./gradlew runIdeForUiTests -PideaVersion=IC-2022.1

Exception:

!bootstrap.error.message.internal.error.please.refer.to.0!https://jb.gg/ide/critical-startup-errors!

java.lang.NoClassDefFoundError: com/intellij/openapi/util/SystemInfoRt
    at com.intellij.openapi.application.PathManager.getBinDirectories(PathManager.java:166)
    at com.intellij.openapi.application.PathManager.isIdeaHome(PathManager.java:154)
    at com.intellij.openapi.application.PathManager.getHomePathFor(PathManager.java:149)
    at com.intellij.openapi.application.PathManager.getHomePath(PathManager.java:94)
    at com.intellij.openapi.application.PathManager.loadProperties(PathManager.java:522)
    at com.intellij.idea.Main.bootstrap(Main.java:89)
    at com.intellij.idea.Main.main(Main.java:79)
Caused by: java.lang.ClassNotFoundException: com.intellij.openapi.util.SystemInfoRt
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 7 more

-----
!bootstrap.error.message.jre.details!11.0.14.1+1-b2043.25 x86_64 (JetBrains s.r.o.)
/Users/zcervink/.gradle/caches/modules-2/files-2.1/com.jetbrains/jbre/jbr_jcef-11_0_14_1-osx-x64-b2043.25/extracted/jbr/Contents/Home!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.