2016-05-09 8 views
0

WebViewでWebページの要素にアクセスする最も簡単で最もエレガントな方法は何ですか?また、ブラウザの要素を調べるときに、その名前でstackoverflowの上にある検索フォームなど、われわれが知っている要素にアクセスできますか?JavaFXでWebViewから要素にアクセスする

jewelseaJames_Dなどの貢献者からの自動埋め込みテキストフィールドについて、同様の質問と回答を読みましたが、少なくともすべては複雑です。

私はWebViewを作成していますが、誰かがこの作業を簡単でわかりやすい方法でフルフィルできるのであれば、短いコードを含めることにします。 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 

} 

を追加し、我々は、フォームを記入autoに2つのTextFieldをアクセスしたいことを言うことができます

メールクラス

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

方法。

これは私がユーザー名TextFieldを検査した後に得るものです:

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

そして、これは、パスワードのTextFieldにある:

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

注:これは、タスクまたはそのようなものではありません、私はちょうどそれをどんな成功もせずに回っていた。すべての例は鉱山やあなたのものであれば大歓迎です。

答えて

0

WebEngineのDocument propertyを使用します。あなたの入力フィールドにアクセスするには

:スタックオーバーフローの検索フォームのようなものについては

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

、あなたが要素を見つけるために、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(); 
      } 
     } 
    } 
} 
+0

ウェブページの読み込み中にフィールドを入力する方法を少し例を挙げて教えてください。私は本当にそれを感謝します。 – brajevicm

+0

@brajevicmが更新されました。 – VGR

関連する問題