【问题标题】:Accessing elements from WebView in JavaFX在 JavaFX 中从 WebView 访问元素
【发布时间】:2016-05-09 17:07:16
【问题描述】:

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 来自动填写表单。

这是我在检查用户名文本字段后得到的:

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

这是密码文本字段:

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

注意:这不是任务或类似的东西,我只是在搞砸它,所以没有任何成功。欢迎所有示例,无论是我的还是你的。

【问题讨论】:

    标签: java javafx webview


    【解决方案1】:

    你想使用WebEngine的Document property

    要访问您的输入字段:

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

    对于类似 Stack Overflow 的搜索表单,您可以使用 XPath 来查找元素:

    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();
                }
            }
        }
    }
    

    【讨论】:

    • 您能否举一个小例子,如何在网页加载时填写字段?我真的很感激。
    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2016-05-04
    • 2018-12-26
    • 1970-01-01
    相关资源
    最近更新 更多