在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
}
并且假设我们想要访问两个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">
注意:这不是一项任务或类似的事情,我只是搞乱它,所以没有任何成功。欢迎所有的例子,无论是我的还是你的。
答案 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();
}
}
}
}