当按钮是链接时,如何使用 HTMLKit 单击按钮?

问题描述 投票:0回答:1

我的代码中有一个按钮,如下所示:

<a class"button" type="button" href="#">More</a>

它位于页面底部。该页面显示项目列表。当我用鼠标单击它时,页面会展开并显示更多项目。

我正在使用 HTMLKit,我想以编程方式单击该按钮。

我正在用这个

webView.evaluateJavaScript("document.body.innerHTML") {[weak self] result, error in
      guard let html = result as? String, error == nil else { return }
      
      let document = HTMLDocument(string: html)
  
      if let moreButton = document.getElementsByClassName("button")

此时我得到

moreButton
,它是一个 HTMLElement

如果这是一个 JavaScript 元素,我会这样做

moreButton.click()

但在这种情况下,

href
等于
#

如何在 HTMLKit 中以编程方式单击该按钮?

swift htmlkit
1个回答
0
投票

你的代码没有做我认为你认为它做的事情:

webView.evaluateJavaScript("document.body.innerHTML") {[weak self] result, error in
      guard let html = result as? String, error == nil else { return }
      
      let document = HTMLDocument(string: html)
  
      if let moreButton = document.getElementsByClassName("button")

在代码中执行

let document = HTMLDocument(string: html)
只是重新解析网络浏览器之外的 HTML:因此您的
let document
变量与
webView
中正在运行的浏览器引擎的关系或连接为零 - 它只是一个静态 DOM -就像内存中的对象一样 - 所以它当然不能“点击”任何东西,它是无生命的。

但首先,历史课:

因此,自 20 世纪 90 年代中期以来,我们可以简单地将 Web 浏览器/Webiew 组件直接“嵌入”到我们的 VB/WinForms/etc GUI 中,这些 Web 浏览器组件通常会公开其父程序的“实时 DOM API” (即我们的代码)可以用来直接访问和操作加载到 Web 视图中的 DOM/HTML/文档 - 例如, MSHTML.dll 通过其 IWebBrowser2

 公开整个 HTML+CSS+JS DOM 等
COM接口.
然而,自从 IE 被安乐死以及微软以 Chromium 的方式替代 MSHTML/Trident 后,
live DOM API
也不幸消失了:截至 2024 年,

IWebBrowser2

的继任者,“微软Edge WebView2

 相反,需要消费应用程序通过传递 JavaScript 字符串并祈祷它们能够工作来try 来操作加载的 HTML+CSS+JS。这听起来很可怕,但这就是我们现在必须面对的。从表面上看,对于我们在“Mac 崇拜”中的表兄弟来说,情况似乎是一样的,参见:您的代码通过 
webView.evaluateJavaScript
与其交互,通过异步返回结果信息 回调。
幸运的是,您所要求的可以通过evaluateJavaScript轻松完成(假设DOM树和加载的HTML行为可预测,并且您等待
webView
报告文档已首先使用

evaluateJavaScript完全加载。
)。解决方案是编写一个在

webView 内部运行的脚本,获取对该 <a class="button">

 的 DOM 引用并调用其 
HTMLAnchorElement.click()
 方法,该方法 
会导致任何
'click'
DOM 事件监听器(或
onclick=""
属性)脚本(如果适用)将被调用。像这样:
webView.evaluateJavaScript("document.querySelector('a[href].button').click();") ...
    
© www.soinside.com 2019 - 2024. All rights reserved.