Erik 5.0.0

Erik 5.0.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2019年6月
SPM支持SPM

phimage维护。



Erik 5.0.0

  • 作者:
  • phimage

Erik

Join the chat at https://gitter.im/phimage/Erik License Platform Language Issues CocoapodCarthage compatible

Become a Patron! Buy me a coffee

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更改的警告

⚠️所有Dom操作都使用JavaScript执行,请不要修改实际的Document对象及其子元素Element

您必须使用currentContent方法来获取最新的Document对象

获取当前内容

Erik.currentContent { (obj, err) -> Void in
    if let error = err {
    }
    else if let document = obj {
       // HTML Inspection
    }
}

使用未来

作为一个可选功能,您可以使用Future/Promise(Erik 使用框架BrightFuturesResult)。

提交谷歌搜索的示例

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的集中式依赖项管理器。请访问此处了解更多信息。

  1. 将项目添加到您的Podfile中。

    use_frameworks!
    
    pod 'Erik'
    // or specific target
    target :test do
       pod 'Erik'
    end
  2. 运行pod install并打开.xcworkspace文件以启动Xcode。

可选未来

pod 'Erik/Future'添加到您的Podfile中,并运行pod install

使用carthage

Carthage是Objective-C和Swift的去中心化依赖项管理器。

  1. 将项目添加到您的Cartfile中。

    github "phimage/Erik"
    

路线图

  • (WIP) WKWebView 截图 (webkit 私有 API?)

为什么是 Erik?

一个著名的无头浏览器名叫 PhantomJS,一个非常有名的浏览器是 Opera

作为致敬,我使用了 Erik,这是 Gaston Leroux 的小说《歌剧魅影》中主角的名字,英文中被熟知为