flutter - Flutter:如何在运行 JavaScript 函数并显示 html 后等待 WebView 完成加载?
问题描述
我想从我的 headlessWebView 中获取完成加载的网站的 HTML 代码,但最初,该网站执行一些 js。
得到我想要的东西的步骤是:
- 打开网站,
- 运行 javascript 函数以在文本字段上填充一些内容并按提交,
- 等待网站执行js并完成加载,
- 将 webview 的结果作为 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;");
}
推荐阅读
- javascript - Ng Component withTypeError:无法读取未定义的属性“帖子”
- javascript - 自定义工具提示 CSS 样式的数据绑定干扰
- python - 数据框迭代值分配的更好实践
- python - 从 OpenCV 到 PIL 的转换不准确
- sql-server - 在缓存中保存超过 10000 条记录 - asp.net mvc
- javascript - 在 nodejs 单元测试中使用 mocha 处理不同的响应
- c# - 在 MVC ASP.NET 应用程序中记录有关上传文件的信息 - “文件”看似为 NULL
- python - 来自站点的静态文件工作,但不是来自应用程序
- google-bigquery - Datastudio 和 BigQuery 分区列
- python - 使用 Pyspark 检查 IP 地址是否在 IPNetwork 中