Как заполнить форму на сайте через элемент WebView?

Нужно программно заполнить форму на сайте и нажать кнопку Вход. Язык программирования - Java.

d


Да, полей там несколько, но когда я в браузере захожу на свой сайт и вручную ввожу логин и пароль а потом нажимаю на конпку "Вход", все работает и данные записываются в текстовик а когда с андроида вашим методом то нет. Посмотрите, пожалуйста, мой код:

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 шт):

Автор решения: Вася Воронцов

Отправить данные без формы?

  1. Как узнать имена полей формы? Можно, например, в Chrome написать перед адресом view-source: и в коде страницы найти нужные данные. Скорее всего, они будут выглядеть как-нибудь так:
<form method="post" action="login.php" >
    <input type="text" name="email" />
    <input type="password" name="password" />
    <input type="submit" value="Войти" />
</form >
  1. Как сформировать запрос? Организуем работу с сетью в отдельном потоке. Я надеюсь, вы сами выберете удобный способ. А с кодом внутри него я подскажу (самый простой пример).
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) {
    //Ошибочка
};

Вот и всё. Запрос отправлен на сервер.

→ Ссылка
Автор решения: Falchio

Я однажды решил эту задачу - так.
Надеюсь, то что код на 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 ?: "")
    }
}

→ Ссылка