Erik
Erik是基于无头浏览器和HTML解析器WebKit以及Kanna
无头浏览器允许运行功能测试,使用JavaScript访问和操作网页。
let browser = Erik.visit(url: url) { document, error in
// browse HTML element, click, submit form and more
}
导航
访问一个URL
Erik.visit(url: url) { object, error in
if let e = error {
} else if let doc = object {
// HTML Inspection
}
}
如何获取当前URL?
if let url = Erik.currentURL {..}
对于多个浏览,您可以为无头浏览器创建一个实例并使用相同的功能。
let browser = Erik()
browser.visitURL...
HTML检查
CSS选择器搜索节点
通过for link in doc.querySelectorAll("a, link") {
print(link.text)
print(link["href"])
}
编辑第一个名为“用户”的输入字段
if let input = doc.querySelectorAll("input[name=\"user\"]").first {
input["value"] = "Eric"
}
提交一个表单
if let form = doc.querySelector("form[id='search']") as? Form {
form.submit()
}
评估一些JavaScript
let javaScriptSource = "console.log("test");"
Erik.evaluate(javaScript:javaScriptSource) { (obj, err) -> Void in
if let error = err {
switch error {
case ErikError.javaScriptError(let message):
print(message)
default :
print("\(error)")
}
}
else if let capturedValue = obj {
// do something according to result
}
}
capturedValue
是JavaScript变量resultErik
的内容。在您的JavaScript代码中影响此变量。
let javaScriptSource = "console.log('test'); var resultErik = 1 + 1;"
关于DOM更改的警告
Document
对象及其子元素Element
。
您必须使用currentContent
方法来获取最新的Document
对象
获取当前内容
Erik.currentContent { (obj, err) -> Void in
if let error = err {
}
else if let document = obj {
// HTML Inspection
}
}
使用未来
作为一个可选功能,您可以使用Future/Promise(Erik 使用框架BrightFutures 和 Result)。
提交谷歌搜索的示例
let url = NSURL(string:"https://www.google.com")!
let value = "Erik The Phantom of Opera"
// visit
var future: Future<Document, NSError> = Erik.visitFuture(url: url)
// fill input field
future = future.flatMap { document -> Future<Document, NSError> in
if let input = document.querySelector("input[name='q']") {
input["value"] = value
}
if let form = document.querySelector("form[name=\"f\"]") as? Form {
form.submit()
}
return Erik.currentContentFuture()
}
// finally get final result as success or error
future.onSuccess { document in
// parse result
}
future.onFailure { error in
print("\(error)")
}
限制
在 iOS 9 和 macOS 10.11 上,您需要确保使用 https://,因为 iOS 9 和 macOS 10.11 不喜欢应用程序在不安全的情况下发送或接收数据。如果您想覆盖这个设置,请点击此处阅读有关App Transport Security的信息。
链接
设置
cocoapods
使用CocoaPods是Objective-C和Swift的集中式依赖项管理器。请访问此处了解更多信息。
-
将项目添加到您的Podfile中。
use_frameworks! pod 'Erik' // or specific target target :test do pod 'Erik' end
-
运行
pod install
并打开.xcworkspace
文件以启动Xcode。
可选未来
将pod 'Erik/Future'
添加到您的Podfile
中,并运行pod install
。
使用carthage
Carthage是Objective-C和Swift的去中心化依赖项管理器。
-
将项目添加到您的Cartfile中。
github "phimage/Erik"
路线图
- (WIP) WKWebView 截图 (webkit 私有 API?)
为什么是 Erik?
一个著名的无头浏览器名叫 PhantomJS,一个非常有名的浏览器是 Opera。
作为致敬,我使用了 Erik,这是 Gaston Leroux 的小说《歌剧魅影》中主角的名字,英文中被熟知为