如何使用HTMLKit程序化点击href为#的链接式按钮?
问题:如何在HTMLKit中程序化点击href为#的加载更多按钮?
页面底部有一个点击后展开更多列表项的按钮,HTML代码如下:
<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").first
已经获取到了moreButton(HTMLElement类型),但如果是JS中的DOM元素可以直接调用click(),这里不知道怎么用HTMLKit实现程序化点击。
解决方案
HTMLKit的HTMLElement只是静态HTML解析后的节点对象,并非浏览器中可交互的活DOM元素,本身没有click()方法来触发交互。要实现程序化点击,必须回到WebView层面,通过执行JavaScript来操作真实的DOM:
方法1:直接通过JS触发点击
无需先解析HTML,直接让WebView执行点击按钮的JS代码:
webView.evaluateJavaScript("document.querySelector('.button').click()") { result, error in if let error = error { print("点击按钮失败:\(error.localizedDescription)") return } // 点击成功后可继续处理后续逻辑,比如等待新内容加载 }
方法2:先通过HTMLKit确认按钮存在,再执行JS点击
如果需要先验证页面中确实存在该按钮,再触发点击,可以结合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) // 检查是否存在目标按钮 guard !document.getElementsByClassName("button").isEmpty else { print("页面中未找到加载更多按钮") return } // 触发JS点击 self?.webView.evaluateJavaScript("document.querySelector('.button').click()") { _, clickError in if let clickError = clickError { print("触发点击失败:\(clickError.localizedDescription)") } } }
关键说明
按钮的href="#"只是锚点标识,不影响点击逻辑——浏览器中点击该按钮的交互逻辑是通过绑定的JS事件实现的,所以只要用JS触发click()事件,就能触发对应的加载更多逻辑,和href的值无关。
内容的提问来源于stack exchange,提问作者Duck
相关产品推荐
相关产品推荐

