在Java中自动填充WebView字段
这就是我的问题。我正在swing中使用JavaFX中的WebView类。我想做的事情是,我希望webview中加载的字段自动填充存储在数组中的信息。可能吗?在Java中自动填充WebView字段,java,swing,webview,javafx,field,Java,Swing,Webview,Javafx,Field,这就是我的问题。我正在swing中使用JavaFX中的WebView类。我想做的事情是,我希望webview中加载的字段自动填充存储在数组中的信息。可能吗? 提前感谢这里是一个用于WebView的自动表单填写示例JavaFX应用程序 值(登录凭据)输入屏幕黄色部分的JavaFX字段,然后在登录页面出现时(使用w3c dom api)自动发布到WebView(屏幕白色部分) import javafx.application.Application; import javafx.beans.pro
提前感谢这里是一个用于WebView的自动表单填写示例JavaFX应用程序 值(登录凭据)输入屏幕黄色部分的JavaFX字段,然后在登录页面出现时(使用w3c dom api)自动发布到WebView(屏幕白色部分)
import javafx.application.Application;
import javafx.beans.property.*;
import javafx.beans.value.*;
import javafx.event.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.web.*;
import javafx.stage.Stage;
import org.w3c.dom.*;
import org.w3c.dom.html.*;
public class WebViewFormPost extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
final TextField fxUsername = new TextField();
fxUsername.setPrefColumnCount(20);
final TextField fxPassword = new PasswordField();
final BooleanProperty loginAttempted = new SimpleBooleanProperty(false);
final WebView webView = new WebView();
webView.setPrefWidth(1000);
final WebEngine engine = webView.getEngine();
engine.documentProperty().addListener(new ChangeListener<Document>() {
@Override
public void changed(ObservableValue<? extends Document> ov, Document oldDoc, Document doc) {
if (doc != null && !loginAttempted.get()) {
if (doc.getElementsByTagName("form").getLength() > 0) {
HTMLFormElement form = (HTMLFormElement) doc.getElementsByTagName("form").item(0);
if ("/oam/server/sso/auth_cred_submit".equals(form.getAttribute("action"))) {
HTMLInputElement username = null;
HTMLInputElement password = null;
NodeList nodes = form.getElementsByTagName("input");
for (int i = 0; i < nodes.getLength(); i++) {
HTMLInputElement input = (HTMLInputElement) nodes.item(i);
switch (input.getName()) {
case "ssousername":
username = input;
break;
case "password":
password = input;
break;
}
}
if (username != null && password != null) {
loginAttempted.set(true);
username.setValue(fxUsername.getText());
password.setValue(fxPassword.getText());
form.submit();
}
}
}
}
}
});
engine.getLoadWorker().exceptionProperty().addListener(new ChangeListener<Throwable>() {
@Override
public void changed(ObservableValue<? extends Throwable> ov, Throwable oldException, Throwable exception) {
System.out.println("Load Exception: " + exception);
}
});
GridPane inputGrid = new GridPane();
inputGrid.setHgap(10);
inputGrid.setVgap(10);
inputGrid.addRow(0, new Label("Username: "), fxUsername);
inputGrid.addRow(0, new Label("Password: "), fxPassword);
Button fxLoginButton = new Button("Login to Oracle Forums");
fxLoginButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
if (notEmpty(fxPassword.getText()) && notEmpty(fxPassword.getText())) {
loginAttempted.set(false);
engine.load("https://forums.oracle.com/community/developer/english/java/javafx/login.jspa");
}
}
});
fxLoginButton.setDefaultButton(true);
ProgressIndicator fxLoadProgress = new ProgressIndicator(0);
fxLoadProgress.progressProperty().bind(webView.getEngine().getLoadWorker().progressProperty());
fxLoadProgress.visibleProperty().bind(webView.getEngine().getLoadWorker().runningProperty());
HBox loginPane = new HBox(10);
loginPane.getChildren().setAll(
fxLoginButton,
fxLoadProgress
);
final VBox layout = new VBox(10);
layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;");
layout.getChildren().addAll(
new Label("Enter your Oracle Web Account credentials"),
inputGrid,
loginPane,
webView
);
VBox.setVgrow(webView, Priority.ALWAYS);
stage.setScene(new Scene(layout));
stage.show();
fxUsername.requestFocus();
}
private boolean notEmpty(String s) {
return s != null && !"".equals(s);
}
}
导入javafx.application.application;
导入javafx.beans.property.*;
导入javafx.beans.value.*;
导入javafx.event.*;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.*;
导入javafx.scene.web.*;
导入javafx.stage.stage;
导入org.w3c.dom.*;
导入org.w3c.dom.html.*;
公共类WebViewFormPost扩展了应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公众假期开始(阶段){
final TextField fxUsername=new TextField();
fxUsername.setPrefColumnCount(20);
final TextField fxPassword=新密码字段();
final BooleanProperty LoginatTested=新的SimpleBoleanProperty(false);
最终WebView WebView=新WebView();
webView.setPrefWidth(1000);
final WebEngine=webView.getEngine();
engine.documentProperty().addListener(新的ChangeListener()){
@凌驾
public void已更改(observeValueI使用JavaFX webView Javascript引擎修复了此问题。
如果有人感兴趣,请看下面的代码片段
String setLastName = "document.getElementsByName('lastName')[0].value='" + lastName + "';";
String setName = "document.getElementsByName('firstName')[0].value='" + name + "'";
String setDateBirth = "document.getElementsByName('birthdate')[0].value='" + datebirth + "';";
String setPhone = "document.getElementsByName('phone')[0].value='" + phone + "';";
String setEmail = "document.getElementsByName('email')[0].value='" + email + "';";
String setPassport = "document.getElementsByName('passport')[0].value='" + passport + "';";
Button button = new Button("Fill the form");
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
webEngine.executeScript(setLastName);
webEngine.executeScript(setName);
webEngine.executeScript(setDateBirth);
webEngine.executeScript(setPhone);
webEngine.executeScript(setEmail);
webEngine.executeScript(setPassport);
}
});
String setLastName=“document.getElementsByName('lastName')[0]。值='“+lastName+”;”;
字符串setName=“document.getElementsByName('firstName')[0]。值='“+name+”;
字符串setDateBirth=“document.getElementsByName('birthdate')[0]。值='“+datebirth+”;”;
字符串setPhone=“document.getElementsByName('phone')[0]。值='“+phone+”;”;
String setEmail=“document.getElementsByName('email')[0]。值='“+email+”;”;
字符串setPassport=“document.getElementsByName('passport')[0]。值='“+passport+”;”;
按钮按钮=新按钮(“填写表格”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent ActionEvent){
executeScript(setLastName);
webEngine.executeScript(setName);
webEngine.executeScript(setDateBirth);
webEngine.executeScript(setPhone);
webEngine.executeScript(setEmail);
webEngine.executeScript(setPassport);
}
});
我想说这可能不是不可能的。请看一下WebEngine文档。您需要更新文档元素……请给出一个简单的示例,谢谢。我不是FX的farmiluar,但如果您阅读了,您将看到一个示例,其中他们访问文档以添加事件触发器,这可能会给出一个输入点不知道如何设置字段文本…谢谢程序员,还有一个问题。也许可以运行javascript来填充字段?这似乎更简单。不能说,WebEngine
似乎提供了某种访问javascript引擎的权限,但您必须仔细阅读它。。。