Как получить элементы из Webview Javafx - PullRequest
0 голосов
/ 22 января 2020

У меня есть приложение, в котором я передаю значения на веб-сайт по ссылке, а затем приложение показывает мне карту и др aws ломаную линию между данными значениями. Итак, что мне сейчас нужно, так это то, что мне нужно извлечь указанные c значения из Webview, поэтому в этом посте Как получить значение переменной Java в javascript в JavaFX webView? , которую они используют getDocument, но я не понял код, и поэтому я не мог использовать его очень хорошо для меня. Может кто-нибудь может мне помочь?

код для отображения карты:

@FXML
void openHtmlfile(ActionEvent event) {
    WebEngine webEngine = webView.getEngine();
    webEngine.javaScriptEnabledProperty().set(true);
    webEngine.load("https://www.luftlinie.org/"+ fromTextField.getText() +"/"+ toTextField.getText());
    ;
}

Метод для получения значений из полей texfill и их заполнения

void fillFields(ActionEvent event) {

    String startAirport = null;
    String targetAirport = null;
    String startCountry = null;
    String targetCountry = null;

    Statement airport;
    try {
        airport = connection.createStatement();
        ResultSet MyRsAirport = airport.executeQuery("select * from fluglinie where ID =\""
                + idFlightRoute.getValue() + "\" AND fluggesellschaft =\"" + fluggesellschaft + "\"");
        while (MyRsAirport.next()) {

            startAirport = MyRsAirport.getString("startFlughafen");

            targetAirport = MyRsAirport.getString("zielFlughafen");

        }
        Statement country;
        country = connection.createStatement();
        ResultSet MyRsCountry = country.executeQuery("select * from flughaefen");
        while (MyRsCountry.next()) {

            if (MyRsCountry.getString("name").equals(startAirport)) {
                startCountry = MyRsCountry.getString("country");
            } else if (MyRsCountry.getString("name").equals(targetAirport)) {
                targetCountry = MyRsCountry.getString("country");
            }

        }

        fromTextField.setText(startAirport + ", " + startCountry); 
        toTextField.setText(targetAirport + ", " + targetCountry); 

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

и что я хочу сделать сейчас, например, есть расстояние, рассчитанное между этими двумя точками, и я хочу извлечь его. Я знаю, что должен использовать идентификатор указанного элемента c html, но как мне показать его в java?

1 Ответ

2 голосов
/ 23 января 2020

Всегда помните, что официальная документация - ваш друг.

Во-первых, вам нужно дождаться полной загрузки страницы. Вы делаете это, наблюдая за загрузчиком WebEngine, который по окончании будет иметь состояние SUCCEEDED . Этот подход подробно описан в документации WebEngine .

webEngine.getLoadWorker().stateProperty().addListener(
    (o, oldState, newState) -> {
        if (newState == Worker.State.SUCCEEDED) {
            // ...
        }
    });
webEngine.load("https://www.luftlinie.org/"+ fromTextField.getText() +"/"+ toTextField.getText());

Важное замечание: Необходимо добавить прослушиватель loadWorker до загрузки страницы .

После успешного завершения загрузки работника вы можете безопасно получить доступ к документу WebEngine, который содержит загруженную страницу. Вы можете искать элемент с определенным идентификатором, используя удобный метод getElementById :

webEngine.getDocument().getElementById("some-page-specific-ID")

То, какую строку вы должны передать, будет зависеть от страницы. Вы должны изучить источник страницы и обнаружить id элемента, содержимое которого вы хотите.

Если элемент не имеет атрибута id, вам придется полагаться на документ структурируйте и используйте XPath , чтобы найти интересующий элемент HTML. Изучение использования XPath сделало бы этот ответ слишком большим, но вы можете узнать об этом самостоятельно, прочитав спецификацию . Чтение этого требует практического знания XML.

После того, как вы нашли элемент, извлечение информации из него будет зависеть от того, какой это элемент. Если это просто текст, вы можете использовать метод элемента getTextContent () .

Итак, весь код будет выглядеть примерно так:

webEngine.getLoadWorker().stateProperty().addListener(
    (o, oldState, newState) -> {
        if (newState == Worker.State.SUCCEEDED) {
            Document doc = webEngine.getDocument();
            Element element = doc.getElementById("some-page-specific-ID");
            String value = element.getTextContent();

            // Display value ...
        }
    });
webEngine.load("https://www.luftlinie.org/"+ fromTextField.getText() +"/"+ toTextField.getText());
...