gpt4 book ai didi

java - 在 JavaFX 中从 WebView 访问元素

转载 作者:行者123 更新时间:2023-11-30 07:23:43 25 4
gpt4 key购买 nike

访问 WebView 中网页元素的最简单、最优雅的方式是什么? ?我们还可以访问我们知道的元素,例如 stackoverflow 顶部的搜索表单在浏览器中检查元素时按其名称?

我从 jewelsea 阅读了一些有关自动填充文本字段的类似问题和答案, James_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

}

假设我们想要访问两个 TextFields 来自动填写表单。

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

<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">

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

最佳答案

您想要使用Document property WebEngine 的。

访问您的输入字段:

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

关于java - 在 JavaFX 中从 WebView 访问元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37121581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com