我的代码中有一个按钮,如下所示:
<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 中以编程方式单击该按钮?
你的代码没有做我认为你认为它做的事情:
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
“
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();") ...