HtmlUnit - über alle Elemente laufen - alle Clickables bestimmen


#1

Hallo, ich bin schon langsam am Verzweifeln, und hab überall im Netz gesucht. Es soll eine Seite aufgerufen werden, und alle Elemente, auf welche “man klicken kann”, sollen bestimmt werden.

ClickableElement (HtmlUnit 2.1 API) - diese Klasse gibt es gar nicht mehr,
https://sourceforge.net/p/htmlunit/mailman/message/24461005/ - irgendetwas mit Prüfen, ob ein Listener “registriert ist”.

Also:

        HtmlPage hp = wc.getPage("http://www.ebay.de/"); // Beispiel
        ArrayList<DomNode> clickables; /* hier die Clickables ... */
        ArrayList<DomNode> list = new ArrayList<>();
        for (DomNode domNode : hp.getChildren()) {
            list.add(domNode);
        }
        while (!list.isEmpty()) {
            DomNode node = list.remove(0);
            for (DomNode domNode : node.getChildren()) {
                list.add(domNode);
            }
            if (!node.hasChildNodes() && node.handles(new MouseEvent())) { /* ??? */
                System.out.println(node.asText() + " : " + node.asXml());
            }
        }```

Ich hab auch schon versucht, die WebConnection zu setzen (Fake), und empty-String zu returnen (Fake), um einfach zu testen, ob bei "click" eine Exception auftritt (erfolglos):

```        wc.setWebConnection(new WebConnection() {
            @Override
            public WebResponse getResponse(WebRequest request) throws IOException {
                return new StringWebResponse("", request.getUrl());
            }

            @Override
            public void close() throws Exception {
            }
        });```

Kann mir bitte jemand weiter helfen, weiß jemand Rat? Ich bedanke mich schon jetzt für jeden Rat...

Wie angedeutet, im Netz, auf StackOverflow und bei sourceforge finde ich dazu nix.

#2

Update: Bin schon näher ran:

node.handles(new MouseEvent()) - jeder Node handlet MouseEvent…

            @Override
            public WebResponse getResponse(WebRequest request) throws IOException {
                return new StringWebResponse("", request.getUrl());
            }

            @Override
            public void close() throws Exception {
            }
        });

// ...

            if (!node.hasChildNodes()) {
                if (node instanceof HtmlElement) {
                    try {
                        ((HtmlElement) node).click();
                        System.out.println(node.asText() + " : " + node.asXml());
                    } catch (IOException iOException) {
                        System.out.println("Nein");
                    }
                }
            }```

- das gibt einfach niemals Nein aus...

```            if (!node.hasChildNodes()) {
                if (node instanceof HtmlElement) {
                    if (((HtmlElement) node).hasEventHandlers("onclick")) {
                        System.out.println(node.asText() + " : " + node.asXml());
                    } else {
                        System.out.println("Nein");
                    }
                }
            }```

- das gibt 1000x Nein aus und 3x findet er etwas...

Außerdem:


>     hasEventHandlers

>     public final boolean hasEventHandlers(String eventName)

>     INTERNAL API - SUBJECT TO CHANGE AT ANY TIME - USE AT YOUR OWN RISK.
>     Returns true if this element has any JavaScript functions that need to be executed when the specified event occurs.

>     Parameters:
>         eventName - the name of the event, such as "onclick" or "onblur", etc
>     Returns:
>         true if an event handler has been defined otherwise false


Was mach ich jetzt? Ich versteh das gerade nicht, wieso ich nicht "herausfinden" kann, ob eine neue Seite/Dokument geladen wird, wenn ich `#click()` auf einem Element aufrufe.

Edit: Suche nach: htmlunit test if a element is clickable - liefert (u. A. [an element, i know...]):
[How to check if an element is clickable or not using Selenium WebDriver - Stack Overflow](http://stackoverflow.com/questions/30826671/how-to-check-if-an-element-is-clickable-or-not-using-selenium-webdriver) :

`#isDisplayed()` - gibt es,
`#isEnabled()` - gibt es nicht...