Flutter:如何在运行JavaScript函数并显示html后等待WebView完成加载



我想从我的headlessWebView中获得完成加载的网站的HTML代码,但最初,网站执行了一些js。

获得我想要的东西的步骤是:

  1. 打开网站
  2. 运行javascript函数在文本字段中填充一些内容,然后按submit
  3. 等待网站执行js并完成加载
  4. 将Web视图的结果作为HTML代码存储在字符串中

这是我下面的代码:

final GlobalKey webViewKey = GlobalKey();
InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
useShouldOverrideUrlLoading: true,
mediaPlaybackRequiresUserGesture: false,
),
android: AndroidInAppWebViewOptions(
useHybridComposition: true,
),
ios: IOSInAppWebViewOptions(
allowsInlineMediaPlayback: true,
));
HeadlessInAppWebView headlessWebView;
String htmlCode = "";
@override
void initState() {
super.initState();
headlessWebView = new HeadlessInAppWebView(
initialUrlRequest: URLRequest(URL: 
Uri.parse("https://example.com/")),
initialOptions: options,
/*InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(),
),*/
shouldOverrideUrlLoading: (controller, navigationAction) async {
var uri = navigationAction.request;
headlessWebView.webViewController.loadUrl(urlRequest: uri);
return NavigationActionPolicy.ALLOW;
},
onWebViewCreated: (controller) {
print('HeadlessInAppWebView created!');
},
onConsoleMessage: (controller, consoleMessage) {
print("CONSOLE MESSAGE: " + consoleMessage.message);
},
onLoadStart: (controller, url) async {
print("onLoadStart $url");
setState(() {
this.url = url.toString();
});
},
onLoadStop: (controller, url) async {
print("onLoadStop $url");
String jsscript =
"javascript:(function() { document.getElementById("text_feild").value ='" +
"sometext" +
"';document.getElementById("submit").click();})();";
await headlessWebView.webViewController
.evaluateJavascript(source: jsscript);
var result = await headlessWebView.webViewController.evaluateJavascript(
source:
"javascript:document.getElementsByTagName('a')[5].getAttribute('href').outerHTML;");
log(result.toString());
htmlCode = result.toString();

},
onUpdateVisitedHistory: (controller, url, androidIsReload) {
print("onUpdateVisitedHistory $url");
setState(() {
this.url = url.toString();
});
},
);

我在日志中得到一个错误(result.toString(((;它总是空的。

尝试在我当前使用的字符串中获取HTML,这是我的应用程序,它运行良好。

onLoadStop:
(InAppWebViewController controller, String url) async {
print("onLoadStop: " + url);
var html = await controller.evaluateJavascript(
source:
"window.document.getElementsByTagName('html')[0].outerHTML;");
}

最新更新