Я работаю над проектом, который в основном делает что-то вроде веб-сканера для особой работы, на самом деле больше для бота. Итак, я делал это раньше на 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);
}
}
}