Как вызвать состояние свойства ChangeListener на двухкадровой странице в JavaFX WebView? - PullRequest
0 голосов
/ 16 сентября 2018

Я работаю над проектом, который в основном делает что-то вроде веб-сканера для особой работы, на самом деле больше для бота. Итак, я делал это раньше на C #, но при некоторых обстоятельствах я должен реализовать это на JavaFX. Проблема состоит в том, что веб-сайт имеет два раздела, и эти два раздела фактически являются двумя фреймами. Когда я щелкнул ссылку во фрейме 1, требуемая страница загружается во фрейм 2. И я попытался прослушать эту операцию загрузки с помощью свойства состояния WebEngine ChangeListener, но оно не сработало. Что я должен сделать, чтобы сделать такую ​​вещь?

Я написал свой код ниже:

private void ClickLinkOnFrame1() {
    Document document = engine.getDocument();
    NodeList frames = document.getElementsByTagName("frame");
    HTMLFrameElement menuFrame = (HTMLFrameElement) document.getElementsByTagName("frame").item(0);

    NodeList anchors = menuFrame.getContentDocument().getElementsByTagName("a");
    for (int i = 0; i < anchors.getLength(); i++) {
        HTMLAnchorElement anchor = (HTMLAnchorElement) anchors.item(i);
        if(anchor.getTextContent().equals("blabla")){
            engine.executeScript("frames[1].document.getElementsByTagName('a')[" + i + "].click()");                

            // So when I clicked the link the page has loaded on second frame,
            // which on chrome also changes load state of entire page
            engine.getLoadWorker().stateProperty().addListener(new ContinueOnSecondFrame());
        }
    }
}

А код для класса ContinueOnSecondFrame:

class ContinueOnSecondFrame implements ChangeListener<Worker.State> {

    @Override
    public void changed(ObservableValue<? extends Worker.State> observable, Worker.State oldValue, Worker.State newValue) {
        System.out.println("ContinueOnSecondFrame: " + oldValue + " -> " + newValue); 
        // Check if this class has been reached or not?(Not reached!!!)
        if(newValue == Worker.State.SUCCEEDED){
            // Do Something...
            engine.getLoadWorker().stateProperty().removeListener(this);
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...