从JavaFX中的WebView访问元素

时间:2016-05-09 17:07:16

标签: java javafx webview

WebView中访问网页元素的最简单,最直接的方法是什么?我还可以在检查浏览器中的元素时,通过其名称访问我们知道的元素,例如stackoverflow之上的搜索表单吗?

我阅读了一些类似的问题和答案,内容来自jewelseaJames_D以及其他一些贡献者的自动填充文字字段,但至少它们看起来都很复杂。

我会在我创建WebView的地方包含简短的代码,如果有人能够以简单易懂的方式完成此任务,那就太好了。

邮件类

public class Mail extends Region{
    final WebView webView = new WebView();
    final WebEngine webEngine = webView.getEngine();

    public Mail() {
        webEngine.load("https://mail.metropolitan.ac.rs/?client=advanced#1");
        getChildren().add(webView);
    }

    @Override
    protected void layoutChildren() {
        double w = getWidth();
        double h = getHeight();
        layoutInArea(mail, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER);
    }

mail添加到StackPane

的方法
public class Controller implements Initializable {
private Mail mail;

// Unrelated code

@FXML
    private void selectMail() {
                mail = new Mail();
                stackPane.getChildren().add(mail);
            }
    }

// Unrelated code

}

并且假设我们想要访问两个TextField来自动填充表单。

这是我在检查用户名TextField后得到的:

<input name="username" class="zLoginField" id="username" type="text" size="40" maxlength="1024" value="" autocorrect="off" autocapitalize="off">

这适用于Password TextField:

<input name="password" class="zLoginField" id="password" type="password" size="40" maxlength="1024" value="" autocomplete="off">

注意:这不是一项任务或类似的事情,我只是搞乱它,所以没有任何成功。欢迎所有的例子,无论是我的还是你的。

1 个答案:

答案 0 :(得分:2)

您想使用WebEngine的Document property

访问输入字段:

Element inputField = webEngine.getDocument().getElementById("username");
inputField.setAttribute("value", "New Text");

对于Stack Overflow搜索表单,您可以使用XPath查找Element:

Element inputField = (Element)
    XPathFactory.newInstance().newXPath().evaluate(
        "//*[@id='search']//*[@name='q']",
        webEngine.getDocument(),
        XPathConstants.NODE);
inputField.setAttribute("value", "New Text");

根据评论进行更新:要在页面仍在加载时设置字段,您可以尝试将其设置为WebEngine更新其loadWorker:

public class HtmlInputSetter
extends Application {
    private static final String NEW_TEXT = "NullPointerException";

    private WebView webView;

    private boolean fieldsHaveBeenSet;

    @Override
    public void start(Stage stage) {
        webView = new WebView();
        webView.getEngine().getLoadWorker().progressProperty().addListener(
            (o, old, progress) -> updateFields());

        fieldsHaveBeenSet = false;
        webView.getEngine().load("http://stackoverflow.com");

        BorderPane pane = new BorderPane(webView);
        pane.setPrefWidth(1200);

        stage.setScene(new Scene(pane));
        stage.setTitle("HTML Input Setter");
        stage.show();
    }

    private void updateFields()
    {
        Document doc = webView.getEngine().getDocument();
        if (doc != null && !fieldsHaveBeenSet) {
            try {
                Element inputField = (Element)
                    XPathFactory.newInstance().newXPath().evaluate(
                        "//*[@id='search']//*[@name='q']",
                        doc, XPathConstants.NODE);
                if (inputField != null) {
                    inputField.setAttribute("value", NEW_TEXT);
                    fieldsHaveBeenSet = true;
                }
            } catch (XPathException e) {
                e.printStackTrace();
            }
        }
    }
}