Вызов JS на сайте с помощью WebView

#javascript #android #xamarin #xamarin.android #android-webview

#javascript #Android #xamarin #xamarin.android #android-webview

Вопрос:

Есть сайт, на котором я хочу запустить JS-скрипт, например:

 document.getElementById("statuses").rows[2].cells[1].firstChild.nodeValue
  

и получите некоторый результат. Я добавил WebView и попытался реализовать это:

MainActivity.onCreate

 WebView wv = FindViewById<WebView>(Resource.Id.webView);
wv.Settings.JavaScriptEnabled = true;
wv.SetWebViewClient(new Client());
wv.LoadUrl("http://inout.test.com/");
  

Затем очистите

 public class Client : WebViewClient {

    public override void OnPageFinished(WebView view, string url) {
        base.OnPageFinished(view, url);
        var script = $"javascript: document.getElementById("statuses").rows[2].cells[1].firstChild.nodeValue";
        //view.LoadUrl($"javascript: {script}");
        view.EvaluateJavascript(script , new JsResult());
    }
}
  

И JsResult

 public class JsResult : Java.Lang.Object, IValueCallback {

    public string Result;
    public void OnReceiveValue(Java.Lang.Object value) {
        Result = ((Java.Lang.String)value).ToString();
    }
}
  

Но Result всегда пусто! Что я делаю не так? Возможно ли получить значение из JS? Пожалуйста, помогите.

Комментарии:

1. return 42; возвращает целое число / число. Вы посмотрели на фактический тип value ?

2. Я думаю, это не имеет значения, потому что я пытался вернуть «Привет» вместо 42. Фактический тип value Java.Lang.Object

3. Извините за «фактический тип», я имел в виду тип самого объекта, а не переменной. Тип объекта такой Java.Lang.String .

Ответ №1:

Если вы выполните

 function() { alert('hello world'); return 42; } ()
  

в консоли разработчика Chrome вы получите

введите описание изображения здесь

Вам просто нужно использовать правильные скобки:

 (function() { alert('hello world'); return 42; }) ()
  

И тогда вы видите:

введите описание изображения здесь

Комментарии:

1. Извините, сэр. Я поддерживаю ваш ответ, но в вопросе есть ошибка (моя ошибка). Я исправил идентификатор. Пожалуйста, посмотрите и помогите. Еще раз спасибо и извините

2. вы сначала выполнили его в Chrome, чтобы посмотреть, возвращает ли он то, что вы ожидаете? ^^

3. также я пробовал это: (function(){return document.getElementById('statuses').rows[2].cells[1].firstChild.nodeValue;})() но никакого результата. Могу ли я запускать JS на любых веб-сайтах или он должен быть особенным

4. просто удалите javascript: . Это работает в моем тесте. (function(){...})() Способ тоже работает

5. Нет, результата нет. Не могли бы вы, пожалуйста, проверить это на этом реальном веб-сайте inout.osdn.nl ? Может быть, с этим есть какие-то проблемы / Спасибо