Как дождаться завершения загрузки WebView после запуска функции JavaScript и отображения html во флаттере?

Я хотел получить готовый загруженный HTML-код веб-сайта из моего headlessWebView, но изначально веб-сайт выполняет некоторые js.

Вот шаги, чтобы получить то, что я хочу:

  1. Откройте сайт,
  2. Запустите функцию javascript, чтобы заполнить некоторый контент в текстовом поле, и нажмите "Отправить",
  3. Подождите, пока веб-сайт выполнит js и завершит загрузку,
  4. Сохраните результаты веб-просмотра в виде 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()); Он всегда равен нулю.

1 ответ

Попробуйте это, чтобы получить HTML-код в строке, которую я сейчас использую, это мое приложение, оно отлично работает.

      onLoadStop:
                  (InAppWebViewController controller, String url) async {
                print("onLoadStop: " + url);
                var html = await controller.evaluateJavascript(
                    source:
                        "window.document.getElementsByTagName('html')[0].outerHTML;");
}
Другие вопросы по тегам