Как заполнить форму на сайте через элемент WebView?
Нужно программно заполнить форму на сайте и нажать кнопку Вход. Язык программирования - Java.
Да, полей там несколько, но когда я в браузере захожу на свой сайт и вручную ввожу логин и пароль а потом нажимаю на конпку "Вход", все работает и данные записываются в текстовик а когда с андроида вашим методом то нет. Посмотрите, пожалуйста, мой код:
package com.rost.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onbtnclick (View v){
String email = "YourEmailForForm";
String password = "YourPasswordForForm";
/*Пусть имена полей формы будут 'user_email' и 'user_password'
для почты и пароля соответственно*/
String data = "username=" + email + "&password=" + password;
/*Ниже выполняется в отдельном потоке*/
try {
URL url = new URL("http://тут мой сайт/");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
con.getOutputStream().write(data.getBytes());
con.connect();
int code = con.getResponseCode();
con.disconnect();
Toast.makeText(this,"cool", Toast.LENGTH_LONG).show();
} catch (Exception e) {
//Ошибочка
Toast.makeText(this,"bad", Toast.LENGTH_LONG).show();
}
}
}
Ответы (2 шт):
Отправить данные без формы?
- Как узнать имена полей формы?
Можно, например, в Chrome написать перед адресом
view-source:и в коде страницы найти нужные данные. Скорее всего, они будут выглядеть как-нибудь так:
<form method="post" action="login.php" >
<input type="text" name="email" />
<input type="password" name="password" />
<input type="submit" value="Войти" />
</form >
- Как сформировать запрос? Организуем работу с сетью в отдельном потоке. Я надеюсь, вы сами выберете удобный способ. А с кодом внутри него я подскажу (самый простой пример).
String email = "YourEmailForForm";
String password = "YourPasswordForForm";
/*Пусть имена полей формы будут 'user_email' и 'user_password'
для почты и пароля соответственно*/
String data = "user_email=" + email + "&user_password=" + password;
/*Ниже выполняется в отдельном потоке*/
try {
URL url = new URL("https://yoursite.com");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
con.getOutputStream().write(data.getBytes());
con.connect();
int code = con.getResponseCode();
con.disconnect();
} catch (Exception e) {
//Ошибочка
};
Вот и всё. Запрос отправлен на сервер.
Я однажды решил эту задачу - так.
Надеюсь, то что код на Kotlin не сильно помещает. Для Андроид разработчика это обычно не проблема. Но если, что можете попросить какую нибудь нейросетку транслировать код в Java.
Открываем нужный сайт в WebView.
webView.loadUrl(url)
WebView используется кастомное. С некоторыми настройками.
import android.content.Context
import android.util.AttributeSet
import android.webkit.WebSettings
import android.webkit.WebView
class AppWebView(context: Context, attributeSet: AttributeSet?) : WebView(context, attributeSet) {
init {
val setting = this.settings
setting.apply {
javaScriptEnabled = true
javaScriptCanOpenWindowsAutomatically = true
domStorageEnabled = true
layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING
}
webViewClient =
AppWebViewClient() //кастомный класс, который будет использоваться для ввода паролей
isFocusableInTouchMode = true
requestFocus()
setWebContentsDebuggingEnabled(true)
isSaveEnabled = true
clearCache(true)
}
}
Всю работу будет делать класс отнаследованный от WebViewClient.
Переопределяем функцию onPageFinished, проверяем что это нужный нам url, выполняем JavaScript код для ввода значений. Сам JavaScript код мне подсказали, тут я если что особо помочь не смогу. Кнопку нажать вероятно можно так же выполнив JS код.
class AppWebViewClient : WebViewClient() {
companion object {
private const val JS_SCRIPT_SET_VALUE_TO_FIELD_BY_NAME =
"javascript:document.getElementById('%s').value='%s'"
}
override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url)
if (view == null || url == null) return
if (url.contains(myUrl)) {
val log = PasswordManager.login.value
val pass = PasswordManager.password.value
view.evaluateJavascript(
setValueToWebViewForm("username", log), null
)
view.evaluateJavascript(
setValueToWebViewForm("password", pass), null
)
}
}
private fun setValueToWebViewForm(fieldName: String, value: String?): String {
return String.format(JS_SCRIPT_SET_VALUE_TO_FIELD_BY_NAME, fieldName, value ?: "")
}
}
