You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中点击HTML Div元素实现页面跳转的解决方案求助

解决方案

你当前的问题核心在于:通过http.get获取的是静态HTML文本,用package:html/dom.dart解析出的Element是纯DOM节点模型,没有浏览器环境的事件触发机制,所以无法直接调用click()方法,也不存在runJavascript能力。以下是可行的解决思路:


思路1:提取跳转目标URL(优先尝试)

网页中可点击的Div通常会通过以下方式实现跳转,你可以直接解析出目标URL:

  1. Div内部嵌套<a>标签:检查Div是否包含隐藏或视觉上覆盖整个Div的<a>标签,直接提取其href属性:
Future getWebsiteData() async {
  final url = Uri.parse(pagina);
  final response = await http.get(url);
  dom.Document html = dom.Document.html(response.body);
  
  // 定位目标Div
  var targetDiv = html.querySelector('#ctl00_ctl00_NestedMasterPage_divTexto_CompaniesATRow > div.col-xs-12.col-md-1.bdp-image-margin.bdp-adjust-ml.img-responsive > div');
  if (targetDiv != null) {
    // 查找内部的a标签
    var linkTag = targetDiv.querySelector('a');
    if (linkTag != null && linkTag.attributes.containsKey('href')) {
      String targetUrl = linkTag.attributes['href']!;
      // 这里可以用url_launcher插件打开链接,或处理跳转逻辑
      print('跳转URL:$targetUrl');
    }
  }
}
  1. Div的onclick属性包含跳转逻辑:若Div通过onclick绑定了JS跳转,解析属性中的URL:
Future getWebsiteData() async {
  final url = Uri.parse(pagina);
  final response = await http.get(url);
  dom.Document html = dom.Document.html(response.body);
  
  var targetDiv = html.querySelector('#ctl00_ctl00_NestedMasterPage_divTexto_CompaniesATRow > div.col-xs-12.col-md-1.bdp-image-margin.bdp-adjust-ml.img-responsive > div');
  if (targetDiv != null && targetDiv.attributes.containsKey('onclick')) {
    String onClickCode = targetDiv.attributes['onclick']!;
    // 用正则匹配window.location.href中的URL
    RegExp urlReg = RegExp(r"window\.location\.href\s*=\s*['\"]([^'\"]+)['\"]");
    Match? match = urlReg.firstMatch(onClickCode);
    if (match != null) {
      String targetUrl = match.group(1)!;
      print('跳转URL:$targetUrl');
      // 处理跳转
    }
  }
}

思路2:用WebView模拟浏览器环境触发点击

如果跳转逻辑依赖复杂的JS(比如需要验证会话、执行前置脚本),必须触发原生点击事件,那么改用webview_flutter插件加载网页,在浏览器环境中执行JS:

  1. 添加依赖到pubspec.yaml:
dependencies:
  webview_flutter: ^4.0.0
  1. 实现WebView并执行点击:
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebViewPage extends StatefulWidget {
  @override
  _WebViewPageState createState() => _WebViewPageState();
}

class _WebViewPageState extends State<WebViewPage> {
  late WebViewController _controller;
  final String pagina = 'https://www.bportugal.pt/simplesaml/module.php/core/authenticate.php?return_url=//www.bportugal.pt';

  @override
  void initState() {
    super.initState();
    _controller = WebViewController()
      ..loadRequest(Uri.parse(pagina))
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setNavigationDelegate(
        NavigationDelegate(
          onPageFinished: (String url) {
            // 页面加载完成后执行JS点击
            _controller.runJavaScript("""
              document.querySelector('#ctl00_ctl00_NestedMasterPage_divTexto_CompaniesATRow > div.col-xs-12.col-md-1.bdp-image-margin.bdp-adjust-ml.img-responsive > div').click();
            """);
          },
        ),
      );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: WebViewWidget(controller: _controller),
    );
  }
}

内容的提问来源于stack exchange,提问作者Jorge Brandão

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:40:29