Android WebView在使用loadUrl方法时,javascript的getElementById始终返回null

9

我尝试从Android客户端应用程序中的Webview中填写表单。 我知道它应该如何工作,但是getElementById对我始终返回null。 我在不同的网站上尝试了它。

这是我针对www.google.com的示例。

MyWebView view = new MyWebView(this);
view.getSettings().setJavaScriptEnabled(true);
view.loadUrl("http://www.google.com");
view.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView v, String url) {
        v.loadUrl(url);
        return true;
    }
    @Override
    public void onPageFinished(WebView v, String url) {
        v.loadUrl("javascript:document.getElementById('mib').value = 'aaa';");              
    }
});
setContentView(view);

以下是MyWebView类的相关信息(仅供参考)。

class MyWebView extends WebView {
    Context context;
    public MyWebView(Context context) {
        super(context);
        this.context = context;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // do some multi touch stuff
        return true;
    }
}

我总是得到这个错误:
09-01 04:35:26.453: I/chromium(2962): [INFO:CONSOLE(1)] "Uncaught TypeError: Cannot set property 'value' of null", source: https://www.google.de/?gws_rd=ssl (1)

但是"mib"元素应该在网站上。使用桌面浏览器(带有移动模拟的chrome),一切都正常工作。我不知道出了什么问题。
感谢提示!
编辑: 我取得了一些进展。根据这个网站,我还需要设置setDomStorageEnabled(true)。 现在我可以找到DOM对象并设置值,但是除了我设置的值之外,它没有显示修改后的网站。例如,一个只有文本"aaa"的白色空白网站。

我认为您想要使用带有WebViewClient的WebView。 - Naveen Tamrakar
但视图类型为 WebView。 - Catscratch
3个回答

35

最终我找到了解决方案!而且这是一个非常奇怪的行为。

首先你需要在你的webview上指定setDomStorageEnabled(true)。否则DOM无法工作。我不知道为什么没有教程提到这一点。但好吧。

myview.getSettings().setDomStorageEnabled(true);

之后我进入了一个白色空白页面,只有我设置的值。奇怪的是,javascript:document.getElementById('myfield').value = 'aaa'; 返回一个值,即我设置的那个值。所以创建了一个仅包含字符串"aaa"的新空白页面。

我通过修改JavaScript代码来丢弃返回结果从而解决了这个问题:

javascript:var x = document.getElementById('myfield').value = 'aaa';

看,就这样。它正在运行。


实际上,您的问题在Android 4.4之前从未发生过。由于Google已经更改为“新的WebView”,从Android 4.4版本开始更好。 - Huy Tower
我不知道为什么,但实际上代码需要将声明的东西放在 "var x" 中。现在它可以工作了。 - Huy Tower
3
像老板一样!@Catscratch。像老板一样! - Shishir Shetty
请提供任何完整的示例。 - Sagar Nayak
@catscratch 请看一下这个链接:http://stackoverflow.com/questions/37644551/auto-fill-forms-in-webview-by-javascript-android 。它需要帮助。 - Sagar Nayak

15

我也曾经为这个问题苦恼了相当长的时间。我和 @Catscratch 面临着同样的空白页面问题,但是没有什么有效的办法。奇怪的是,如果你将相同的代码包装在一个JavaScript函数中,一切就都正常工作了。

因此,

 webView.loadUrl("javascript:(function() { document.getElementById('email_field').value = '" + email + "'; })()");

工作,而

webView.loadUrl("javascript:document.getElementById('email_field').value = '" + email + "';");

无法工作。

而且所有这些都是不需要使用setDomStorageEnabled(true)setWebChromeClient()


1
你能告诉我应该在哪里传递主URL,是先传递主URL然后再加载JavaScript的loadUrl吗? - Neal
这些都不起作用。在 WebView 中调用 document.getElementsByTagName('a'); 返回 undefined,但在桌面上访问时可以工作。 - TheRealChx101

0
另一个似乎有效的解决方法:确保你的 JavaScript “返回” null,例如:
loadUrl("javascript:document.getElementById('myfield').value = 'aaa'; null");

然而奇怪的是,如果您没有使用getElementById,那么loadUrl返回值就没问题,但是同样的行为不会发生。看起来像某种错误...它可能是this bug,但在某些版本的Android中可能没有修复[?]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接