Заполните поля в веб-просмотре автоматически
Я видел этот вопрос в Интернете, но пока не нашел рабочего решения. В принципе, я хочу загрузить свое приложение и нажать кнопку; действие кнопки затем заполнит имя пользователя и пароль на веб-сайте, уже загруженном в webview (или дождаться onPageFinished). Наконец, кнопка отправки на странице входа будет активирована.
Из того, что я понимаю, это можно сделать, выполнив java-инъекцию с помощью loadUrl (javascript), но я не знаю, какие команды java будут заполнять поля. Тот же вопрос был задан для iOS, но команды немного отличаются.
Можно ли делать то, что я задаю с помощью javascript в веб-браузере, или мне нужно сделать http-сообщение без веб-просмотра, например или это?
Большое вам спасибо за любую помощь, которую вы можете дать!
Ответы
Ответ 1
Вам не нужно использовать "java-команды"... но вместо этого JavaScript... например:
String username = "cristian";
webview.loadUrl("javascript:document.getElementById('username').value = '"+username+"';");
Итак, в основном, что вам нужно сделать, это большая строка кода JavaScript, которая получит эти поля и поместит на них значения; Кроме того, вы можете включить/отключить кнопку отправки с помощью JavaScript.
Ответ 2
Спасибо всем за ваш ответ, это помогло мне, но не сработало.
Это всегда открывало белую страницу, пока я не нашел это:
fooobar.com/questions/94014/...
Итак, вот полное решение, смешивающее всю информацию, найденную здесь и там:
1) в первую очередь вам нужно включить хранилище DOM, если вы этого не сделаете,.GetElementByXXX ничего не вернет (вы должны сделать это до, загружая страницу)
myWebView.getSettings().setDomStorageEnabled(true);
2) Ваш последний Javascript-вызов GetElementByXXX ДОЛЖЕН сохранить результат в переменной
Пример 1:
_webview.loadUrl("javascript:var uselessvar =document.getElementById('passwordfield').value='"+password+"';");
здесь только один вызов (только одна точка с запятой), поэтому мы немедленно сохраняем результат в "бесполезном"
Пример 2: см. ответ пользователя802467
здесь есть 3 вызова (один для поля входа, один для поля пароля, один для отправки кнопки), только последний вызов должен быть сохранен, это делается в 'frms'
Программисты Javascript должны легко объяснить это поведение...
надеюсь, что это поможет
Ответ 3
Это помогло мне заполнить формы и представить форму:
webView.loadUrl("javascript: {" +
"document.getElementById('username').value = '"+uname +"';" +
"document.getElementById('password').value = '"+password+"';" +
"var frms = document.getElementsByName('loginForm');" +
"frms[0].submit(); };");
Ответ 4
Вот полный код, который работает для меня (Bitbucket):
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webView.loadUrl("http://example.com/");
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
final String password = "password";
final String username = "username";
final String answer = 5;
final String js = "javascript:" +
"document.getElementById('password').value = '" + password + "';" +
"document.getElementById('username').value = '" + username + "';" +
"var ans = document.getElementsByName('answer');" +
"ans[0].value = '" + answer + "';" +
"document.getElementById('fl').click()";
if (Build.VERSION.SDK_INT >= 19) {
view.evaluateJavascript(js, new ValueCallback<String>() {
@Override
public void onReceiveValue(String s) {
}
});
} else {
view.loadUrl(js);
}
}
});
Ответ 5
Я попробовал решение @user802467. Но в двух вещах было другое поведение.
- Если я сохранил ТОЛЬКО последний javascript-вызов в переменной, он не заполнял поля. Вместо этого, если я сохранил все три вызова в переменных, он сделал
- По какой-то причине моя форма не была отправлена с помощью submit(). Но вместо отправки формы, если бы я нажал кнопку отправки с помощью button.click(), мне не нужно было хранить все три вызова, и все было отлично!
Вот что я использовал (но не работал)
view.loadUrl("javascript: var x = document.getElementById('username').value = '" + username + "';" +
"var y = document.getElementById('password').value = '" + password + "';" +
"var form1 = document.getElementById('loginform');" +
"form1[0].submit(); ");
Вот код, который работал у меня
view.loadUrl("javascript: document.getElementById('username').value = '" + username + "';" +
" document.getElementById('password').value = '" + password + "';" +
"var z = document.getElementById('submitbutton').click();"
);